• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

[DB][MyBatis]利用mybatis-paginator实现分页(目前看到MyBatis

mysql 搞代码 4年前 (2022-01-09) 35次浏览 已收录 0个评论

利用mybatis-paginator实现分页 1、mybatis-paginator简介 mybatis-paginator是gethub上的一个开源项目、用于java后台获取分页数据、该开源项目还提供一个列表组件(mmgrid)用于前端展示。 该开源项目地址:https://github.com/miemiedev 2、该开源项目的使

利用mybatis-paginator实现分页

1、mybatis-paginator简介

mybatis-paginator是gethub上的一个开源项目、用于java后台获取分页数据、该开源项目还提供一个列表组件(mmgrid)用于前端展示。

该开源项目地址:https://github.com/miemiedev

2、该开源项目的使用说明:

Maven中加入依赖:

  ...            com.github.miemiedev        mybatis-paginator        1.2.10      ...

Mybatis配置文件添加分页插件:

<?xmlversion="1.0"encoding="UTF-8"?>                                     

创建一个查询,内容可以是任何Mybatis表达式,包括foreach和if等:

    select * from TEST_USE<strong style="color:transparent">来源gaodai#ma#com搞@代~码$网</strong>R where city = #{city};

Dao中的方法或许是这样(用接口也是类似):

public List findByCity(String city, PageBounds pageBounds){    Map params =new HashMap();    params.put("city",city);    returngetSqlSession().selectList("db.table.user.findByCity", params, pageBounds);}

调用方式(分页加多列排序):

int page = 1; //页号int pageSize = 20; //每页数据条数String sortString = "age.asc,gender.desc";//如果你想排序的话逗号分隔可以排序多列PageBounds pageBounds = newPageBounds(page, pageSize , Order.formString(sortString));List list = findByCity("BeiJing",pageBounds);//获得结果集条总数PageList pageList = (PageList)list;System.out.println("totalCount: "+ pageList.getPaginator().getTotalCount());

PageList类是继承于ArrayList的,这样Dao中就不用为了专门分页再多写一个方法。

使用PageBounds这个对象来控制结果的输出,常用的使用方式一般都可以通过构造函数来配置。

new PageBounds();//默认构造函数不提供分页,返回ArrayListnew PageBounds(int limit);//取TOPN操作,返回ArrayListnew PageBounds(Order... order);//只排序不分页,返回ArrayListnew PageBounds(int page, int limit);//默认分页,返回PageListnew PageBounds(int page, int limit, Order... order);//分页加排序,返回PageListnew PageBounds(int page, int limit, List orders,boolean containsTotalCount);//使用containsTotalCount来决定查不查询totalCount,即返回ArrayList还是PageList

=========================================

如果用的是Spring MVC的话可以把JSON的配置写成这样:

                                                                                                           

那么在Controller就可以这样用了:

@ResponseBody@RequestMapping(value ="/findByCity.json")public List findByCity(@RequestParam String city,                 @RequestParam(required =false,defaultValue ="1") intpage,                 @RequestParam(required =false,defaultValue ="30") intlimit,                 @RequestParam(required =false) String sort,                 @RequestParam(required =false) String dir) {     return userService.findByCity(city, newPageBounds(page, limit, Order.create(sort,dir)));}然后序列化后的JSON字符串就会变成这样的:
{    "items":[        {"NAME":"xiaoma","AGE":30,"GENDER":1,"ID":3,"CITY":"BeiJing"},        {"NAME":"xiaoli","AGE":30,"SCORE":85,"GENDER":1,"ID":1,"CITY":"BeiJing"},        {"NAME":"xiaowang","AGE":30,"SCORE":92,"GENDER":0,"ID":2,"CITY":"BeiJing"},        {"NAME":"xiaoshao","AGE":30,"SCORE":99,"GENDER":0,"ID":4,"CITY":"BeiJing"}    ],    "slider": [1, 2, 3, 4, 5, 6, 7],    "hasPrePage":false,    "startRow": 1,    "offset": 0,    "lastPage":false,    "prePage": 1,    "hasNextPage":true,    "nextPage": 2,    "endRow": 30,    "totalCount": 40351,    "firstPage":true,    "totalPages": 1346,    "limit": 30,    "page": 1}

=========================================

在SpringMVC中使用JSTL的话可以参考一下步骤(懒人用法)

在Spring配置文件中加入拦截器,或则参考拦截器实现定义自己的拦截器

                        

然后Controller方法可以这样写

@RequestMapping(value ="/userView.action")public ModelAndView userView(@RequestParam String city,                 @RequestParam(required =false,defaultValue ="1")intpage,                 @RequestParam(required =false,defaultValue ="30")intlimit,                 @RequestParam(required =false) String sort,                 @RequestParam(required =false) String dir) {    List users = userService.findByCity(city,newPageBounds(page, limit, Order.create(sort,dir)));    returnnewModelAndView("account/user","users", users);}

JSP中就可以这样用了,拦截器会将PageList分拆添加Paginator属性,默认命名规则为”原属性名称”+”Paginator”

<table>            <tr>            <td>${user['ID']}</td>            <td>${user['NAME']}</td>            <td>${user['AGE']}</td>        </tr>    </table>上一页: ${usersPaginator.prePage} 当前页: ${usersPaginator.page} 下一页: ${usersPaginator.nextPage} 总页数: ${usersPaginator.totalPages} 总条数: ${usersPaginator.totalCount} 更多属性参考Paginator类提供的方法

=========================================

如果用如下方法设置pageBounds,当前这个查询就可以用两个线程同时查询list和totalCount了

pageBounds.setAsyncTotalCount(true);

如果所有的分页查询都是用异步的方式查询list和totalCount,可以在插件配置加入asyncTotalCount属性

        

但是你仍然可以用下面代码强制让这个查询不用异步

pageBounds.setAsyncTotalCount(false);

当然需要注意的是,只要你用到了异步查询,由于里面使用了线程池,所以在使用时就要加入清理监听器,以便在停止服务时关闭线程池。需要在web.xml中加入

    com.github.miemiedev.mybatis.paginator.CleanupMybatisPaginatorListener

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:[DB][MyBatis]利用mybatis-paginator实现分页(目前看到MyBatis

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址