[DB][MyBatis]利用mybatis-paginator实现分页(眼下看到MyBatis下最好的分页实现)
利用mybatis-paginator实现分页
1、mybatis-paginator简单介绍
mybatis-paginator是gethub上的一个开源项目、用于java后台获取分页数据、该开源项目还提供一个列表组件(mmgrid)用于前端展示。
该开源项目地址:https://github.com/miemiedev
2、该开源项目的使用说明:
Maven中增加依赖:
<dependencies> ... <dependency> <groupId>com.github.miemiedev</groupId> <artifactId>mybatis-paginator</artifactId> <version>1.2.10</version> </dependency> ... </dependencies>
Mybatis配置文件加入分页插件:
<?xmlversion="1.0"encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-config.dtd"> <configuration> <plugins> <plugin interceptor="com.github.miemiedev.mybatis.paginator.OffsetLimitInterceptor"> <propertyname="dialectClass"value="com.github.miemiedev.mybatis.paginator.dialect.OracleDialect"/> </plugin> </plugins> </configuration>
创建一个查询,内容能够是不论什么Mybatis表达式,包含foreach和if等:
<selectid="findByCity"resultType="map"> select * from TEST_USER where city = #{city}; </select>
Dao中的方法也许是这样(用接口也是类似):
public List findByCity(String city, PageBounds pageBounds){ Map<String, Object> params =new HashMap<String, Object>(); 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();//默认构造函数不提供分页,返回ArrayList new PageBounds(int limit);//取TOPN操作,返回ArrayList new PageBounds(Order... order);//仅仅排序不分页。返回ArrayList new PageBounds(int page, int limit);//默认分页。返回PageList new PageBounds(int page, int limit, Order... order);//分页加排序,返回PageList new PageBounds(int page, int limit, List<Order> orders,boolean containsTotalCount);//使用containsTotalCount来决定查不查询totalCount,即返回ArrayList还是PageList
=========================================
假设用的是Spring MVC的话能够把JSON的配置写成这样:
<mvc:annotation-driven> <mvc:message-converters register-defaults="true"> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <constructor-argvalue="UTF-8"/> </bean> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="com.github.miemiedev.mybatis.paginator.jackson2.PageListJsonMapper"/> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
那么在Controller就能够这样用了:
然后序列化后的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配置文件里增加拦截器,或则參考拦截器实现定义自己的拦截器
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.github.miemiedev.mybatis.paginator.springmvc.PageListAttrHandlerInterceptor"/> </mvc:interceptor> </mvc:interceptors>
然后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> <c:forEach items="${users}"var="user"> <tr> <td>${user['ID']}</td> <td>${user['NAME']}</td> <td>${user['AGE']}</td> </tr> </c:forEach> </table> 上一页: ${usersPaginator.prePage} 当前页: ${usersPaginator.page} 下一页: ${usersPaginator.nextPage} 总页数: ${usersPaginator.totalPages} 总条数: ${usersPaginator.totalCount} 很多其它属性參考Paginator类提供的方法
=========================================
假设用例如以下方法设置pageBounds,当前这个查询就能够用两个线程同一时候查询list和totalCount了
|
pageBounds.setAsyncTotalCount(true); |
假设全部的分页查询都是用异步的方式查询list和totalCount。能够在插件配置增加asyncTotalCount属性
<plugin interceptor="com.github.miemiedev.mybatis.paginator.OffsetLimitInterceptor"> <property name="dialectClass" value="com.github.miemiedev.mybatis.paginator.dialect.OracleDialect"/> <property name="asyncTotalCount" value="true"/> </plugin>
可是你仍然能够用以下代码强制让这个查询不用异步
pageBounds.setAsyncTotalCount(false);
当然须要注意的是,仅仅要你用到了异步查询。因为里面使用了线程池,所以在使用时就要增加清理监听器,以便在停止服务时关闭线程池。须要在web.xml中增加
<listener> <listener-class>com.github.miemiedev.mybatis.paginator.CleanupMybatisPaginatorListener</listener-class> </listener>
相关文章
- mybatis实现模糊查询
- MyBatis 总结
- Mybatis:通过on duplicate key update实现批量插入或更新
- dubbo+zookeeper+springmvc+mybatis+shiro+redis分布式大型互联网企业架构
- MyBatis学习总结
- mybatis+Oracle 批量插入数据,有数据做更新操作
- SpringBoot + Mybatis + Druid + PageHelper 实现多数据源分页
- SpringMVC+Mybatis整合的增删改查
- 基于Java(SpringBoot、Mybatis、SpringMvc)+MySQL实现(Web)小二结账系统【100010230】
- mybatis plus实现使用聚合函数,group by分组
- vue实战入门后台篇七:springboot+mybatis实现网站后台-各实体界面接口对接
- vue实战入门后台篇三:springboot+mybatis实现网站后台-实体及基础框架搭建
- 《深入理解mybatis原理》 MyBatis的架构设计以及实例分析
- 从零开发分布式数据库中间件 二、构建MyBatis的读写分离数据库中间件
- mybatis-paginator对SqlServer分页实现
- Spring Boot + Mybatis 实现动态数据源
- JSP-MyBatis(二)入门补ResultMap映射、Mapper接口实现CRUD
- MyBatis实现两种查询树形数据(嵌套结果集和递归查询)
- springBoot 使用 mybatis-plus 实现分页
- MyBatis 流式查询实现千万数据表快速分页
- Mybatis-plus—小白通俗易懂版(入门案例&最常见问题解决)
- 全栈开发实战|人事管理系统的设计与实现(Spring Boot + Vue 3 + MyBatis)
- Mybatis学习笔记——day05
- 源码揭秘mybatis日志实现的原理
- IDEA从零到精通(25)之springboot集成Mybatis
- Java中核心注解的作用及其使用,了解Spring容器装载的过程和机制,自定义注解来实现自动配置项目依赖环境,包括mybatis、Dubbo、log4j、RabbitMQ、redis相关等自动配置
- Mybatis快速入门(手写Mybatis框架)
- 模仿mybatis,用jdk proxy实现接口
- mybatis sql语句中转义字符
- Mybatis常见面试题总结