设为首页 收藏本站
查看: 1214|回复: 0

[经验分享] mybatis逻辑分页,含分页导航

[复制链接]

尚未签到

发表于 2016-11-27 07:26:19 | 显示全部楼层 |阅读模式
mybatis是非常优秀的半orm框架,比hibernate更容易控制,性能也很好,但mybatis官方并没提供分页功能,需要自己实现,下面提供一种物理分页的实现思路:
(基于sping、spring mvc、mybatis的整合,将PO)
1. 编写一个Pagination.java的实体类,含有页面显示数、总页数、当前页、开始行、结束行等属性
2. sql里加上分页参数
3. PO对象里加上这个分页对象
4. 在Service里,执行查询前,将分页实例的总记录数set进去,当前页由页面传入,这样就有了三个必备参数:总记录数、每页显示数(可以设一个默认值)、当前页,就可以获取sql查询时开始行、结束行,就实现分页了。
 
优点:
不改动mybatis框架代码,对service的实现类改动很小,只需加入一行代码,对controller改个只需model里add两个attribute,尽量做到低侵入低耦合。分页导航自动生成,可重新设置每页显示数,从不分页改为分页尽可能减少代码的增加工作。
缺点:
暂时只适用于持久化对象和表单视图对象共用,即持久化对象既用于数据库交互,也用于表单数据绑定。
 
下面为实例说明:
1. 在对象里加入一个属性:

...
/** 用于分页 */
private Pagination pagination = new Pagination();
public Pagination getPagination() {
return pagination;
}
public void setPagination(Pagination pagination) {
this.pagination = pagination;
}
此处初始化了,是为了不用判断是否为null,相当于给一个初始值。 
 
2.  在mapper.xml文件中加入分页语句本例以mysql(limit #{offSet}, #{pageSize})为例
 

<select id="getUserInfoList" parameterType="com.jayung.pagination.domain.UserInfo"
resultType="com.jayung.pagination.domain.UserInfo">
select user_id userId, user_name userName, password password,
age age
from user_info
<trim prefix="where" suffixOverrides="and">
<if test="userId!=null and userId!=''">user_id = #{userId} and </if>
<if test="userName!=null and userName!=''">user_name = #{userName} and </if>
<if test="password!=null and password!=''">password = #{password} and </if>
<if test="age!=null and age!=''">age = #{age} and </if>
</trim>
limit #{pagination.startRow}, #{pagination.pageSize}
</select>
 其中limit #{pagination.startRow}, #{pagination.pageSize}是分页的两个参数;
 
 
3. 定义取总记录数的SQL
 

<select id="getUserInfoListCount" parameterType="com.jayung.pagination.domain.UserInfo"
resultType="java.lang.Integer">
select count(1)
from user_info
<trim prefix="where" suffixOverrides="and">
<if test="userId!=null and userId!=''">user_id = #{userId} and </if>
<if test="userName!=null and userName!=''">user_name = #{userName} and </if>
<if test="password!=null and password!=''">password = #{password} and </if>
<if test="age!=null and age!=''">age = #{age} and </if>
</trim>
</select>
 与上面SQL的差别是将查询结果集换成了count记录集的总数;
 
3. serviceimpl

public List<UserInfo> getUserInfoList(UserInfo userInfo) {
userInfo.getPagination().setTotalRow(userInfoMapper.getUserInfoListCount(userInfo));
return userInfoMapper.getUserInfoList(userInfo);
}
 
 4. controller

@RequestMapping(value = "/demo/userInfo/search")
public String search(Model model, UserInfo userInfo, HttpServletRequest request) {
// userInfo里含有pagination属性。
model.addAttribute("userInfoList", userInfoService.getUserInfoList(userInfo));
// pagination是分页对象
model.addAttribute("pagination", userInfo.getPagination());
// paginationForm是为了不丢失从查询页面传过来的查询参数,并保存当前页、每页显示数的信息
model.addAttribute("paginationForm", PaginationUtil.getPaginationForm(request));
return  "/demo/userInfo/userInfoList";
}
 
5. paginationUtil用于保存来自源页面的参数,防止翻到第二页时丢失。

public static String getPaginationForm(HttpServletRequest request) {
StringBuffer form = new StringBuffer();
form.append("<form name=\"_paginationForm\" id=\"_paginationForm\" method=\"post\" aciton=\""
+ new UrlPathHelper().getOriginatingRequestUri(request) + "\">\n");
Enumeration paramNames = request.getParameterNames();
while (paramNames.hasMoreElements()) {
String paramName = (String) paramNames.nextElement();
String paramValue = request.getParameter(paramName);
if (!"pagination.pageSize".equals(paramName) && !"pagination.currentPage".equals(paramName)) {
form.append("<input type=\"hidden\" name=\"" + paramName + "\" value=\"" + paramValue + "\" />\n");
}
}
String pageSize = (request.getParameter("pagination.pageSize") == null) ? Constant.PAGE_SIZE_DEFAULT.toString()
: request.getParameter("pagination.pageSize");
String currentPage = (request.getParameter("pagination.currentPage") == null) ? "1" : request
.getParameter("pagination.currentPage");
form.append("<input type=\"hidden\" id=\"_pagination.pageSize\" name=\"pagination.pageSize\" value=\"" + pageSize + "\" />\n");
form.append("<input type=\"hidden\" id=\"_pagination.currentPage\" name=\"pagination.currentPage\" value=\"" + currentPage + "\" />\n");
form.append("</form>");
return form.toString();
}
 
6. 分页页面

<table class="tableList" id="userInfoList">
<tr>
<th>userId</th>
<th>userName</th>
<th>password</th>
<th>age</th>
<th>操作</th>
<tr>
<c:forEach items="${userInfoList}" var="userInfo" varStatus="status">
<tr id="${status.index}">
<td>${userInfo.userId}</td>
<td>${userInfo.userName}</td>
<td>${userInfo.password}</td>
<td>${userInfo.age}</td>
<td><a href="${userInfo.userId}">查看</a>
<a href="${userInfo.userId}/edit">编辑</a>
<a href="javascript:void();" >删除</a></td>
</tr>
</c:forEach>
</table>
<div>${pagination.navigator}</div>
${paginationForm}
 ${pagination.navigator}是分页导航
  ${paginationForm}是分页表单
  最后上传完整工程附件,含初始化sql脚本
  欢迎大家讨论优化。
 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-305915-1-1.html 上篇帖子: MyBatis源码赏析3-配置 下篇帖子: Mybatis的命名空间和SqlSessionFactoryBuilder
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表