Mybatis分页和Spring的集成
写了一个Mybatis分页控件,在这记录一下使用方式。
在Maven中加入依赖:
|
1
2
3
4
5
6
7
8
9
|
<dependencies> ... <dependency> <groupId>com.github.miemiedev</groupId> <artifactId>mybatis-paginator</artifactId> <version>1.2.17</version> </dependency> ...</dependencies> |
Mybatis配置文件添加分页插件:
|
1
2
3
4
5
6
7
8
9
10
11
|
<?xml version="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"> <property name="dialectClass" value="com.github.miemiedev.mybatis.paginator.dialect.OracleDialect"/> </plugin> </plugins></configuration> |
创建一个查询,内容可以是任何Mybatis表达式,包括foreach和if等:
|
1
2
3
|
<select id="findByCity" resultType="map"> select * from TEST_USER where city = #{city};</select> |
Dao中的方法或许是这样(用接口也是类似):
|
1
2
3
4
5
6
7
|
public List findByCity(String city, PageBounds pageBounds){ Map<String, Object> params = new HashMap<String, Object>(); params.put("city",city); return getSqlSession().selectList("db.table.user.findByCity", params, pageBounds);} |
调用方式(分页加多列排序):
|
1
2
3
4
5
6
7
8
9
|
int page = 1; //页号int pageSize = 20; //每页数据条数String sortString = "age.asc,gender.desc";//如果你想排序的话逗号分隔可以排序多列PageBounds pageBounds = new PageBounds(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这个对象来控制结果的输出,常用的使用方式一般都可以通过构造函数来配置。
|
1
2
3
4
5
6
7
|
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<Order> orders, boolean containsTotalCount);//使用containsTotalCount来决定查不查询totalCount,即返回ArrayList还是PageList |
=========================================
如果用的是Spring MVC的话可以把JSON的配置写成这样:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
<mvc:annotation-driven> <mvc:message-converters register-defaults="true"> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <constructor-arg value="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就可以这样用了:
|
1
2
3
4
5
6
7
8
9
|
@ResponseBody@RequestMapping(value = "/findByCity.json")public List findByCity(@RequestParam String city, @RequestParam(required = false,defaultValue = "1") int page, @RequestParam(required = false,defaultValue = "30") int limit, @RequestParam(required = false) String sort, @RequestParam(required = false) String dir) { return userService.findByCity(city, new PageBounds(page, limit, Order.create(sort,dir)));} |
然后序列化后的JSON字符串就会变成这样的:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
{ "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配置文件中加入拦截器,或则参考拦截器实现定义自己的拦截器
|
1
2
3
4
5
6
|
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**" /> <bean class="com.github.miemiedev.mybatis.paginator.springmvc.PageListAttrHandlerInterceptor" /> </mvc:interceptor></mvc:interceptors> |
然后Controller方法可以这样写
|
1
2
3
4
5
6
7
8
9
|
@RequestMapping(value = "/userView.action")public ModelAndView userView(@RequestParam String city, @RequestParam(required = false,defaultValue = "1") int page, @RequestParam(required = false,defaultValue = "30") int limit, @RequestParam(required = false) String sort, @RequestParam(required = false) String dir) { List users = userService.findByCity(city, new PageBounds(page, limit, Order.create(sort,dir))); return new ModelAndView("account/user","users", users);} |
JSP中就可以这样用了,拦截器会将PageList分拆添加Paginator属性,默认命名规则为"原属性名称"+"Paginator"
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<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了
|
1
|
pageBounds.setAsyncTotalCount(true); |
如果所有的分页查询都是用异步的方式查询list和totalCount,可以在插件配置加入asyncTotalCount属性
|
1
2
3
4
|
<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> |
但是你仍然可以用下面代码强制让这个查询不用异步
|
1
|
pageBounds.setAsyncTotalCount(false); |
当然需要注意的是,只要你用到了异步查询,由于里面使用了线程池,所以在使用时就要加入清理监听器,以便在停止服务时关闭线程池。需要在web.xml中加入
|
1
2
3
|
<listener> <listener-class>com.github.miemiedev.mybatis.paginator.CleanupMybatisPaginatorListener</listener-class></listener> |
完。
Mybatis分页和Spring的集成的更多相关文章
- spring boot集成MyBatis 通用Mapper 使用总结
spring boot集成MyBatis 通用Mapper 使用总结 2019年 参考资料: Spring boot集成 MyBatis 通用Mapper SpringBoot框架之通用mapper插 ...
- 【spring boot】14.spring boot集成mybatis,注解方式OR映射文件方式AND pagehelper分页插件【Mybatis】pagehelper分页插件分页查询无效解决方法
spring boot集成mybatis,集成使用mybatis拖沓了好久,今天终于可以补起来了. 本篇源码中,同时使用了Spring data JPA 和 Mybatis两种方式. 在使用的过程中一 ...
- 【分页工具-spring boot】Mybatis PageHelper 集成Spring boot
官方文档:https://github.com/pagehelper/pagehelper-spring-boot 1.引入包,测试过以下版本兼容性还是比较好的 <!--Mybatis-Spri ...
- spring boot集成mybatis(2) - 使用pagehelper实现分页
Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...
- spring boot集成mybatis分页插件
mybatis的分页插件能省事,本章记录的是 spring boot整合mybatis分页插件. 1.引入依赖 <!-- 分页插件pagehelper --> <dependency ...
- Spring boot入门(二):Spring boot集成MySql,Mybatis和PageHelper插件
上一篇文章,写了如何搭建一个简单的Spring boot项目,本篇是接着上一篇文章写得:Spring boot入门:快速搭建Spring boot项目(一),主要是spring boot集成mybat ...
- spring boot集成mybatis(1)
Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...
- spring boot集成mybatis(3) - mybatis generator 配置
Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...
- 深入浅出mybatis之与spring集成
目录 写在前面 详细配置 1.dataSource(数据源) 2.sqlSessionFactory(Session工厂) 3.Mapper(映射器) 4.TransactionManager(事务管 ...
随机推荐
- NEFU 2016省赛演练一 B题(递推)
HK Problem:B Time Limit:2000ms Memory Limit:65535K Description yy is interested in numbers and yy nu ...
- UTF8-GBK WideCharToMultiByte MultiByteToWideChar
//MFC版本 CString UTF8ToGBK(const CString& strUTF8){ //确定转换为Unicode需要多少缓冲区(返回值也包含了最后一个NULL字符) int ...
- eclipse 切换svn账号
1. 查看你的Eclipse中使用的是什么SVN Interface,位置在 windows > preference > Team > SVN 2. 如果是用的J ...
- cf584a(水题)
题意是输出一个能被t整除的n位数... 思路很简单,输出t和n-1个0即可.当然,还需要特判一下t为1,n为10的情况.. 代码如下: #include <bits/stdc++.h> u ...
- grep' \b\b'
\b单词锁定符,如: '\bgrep\b'只匹配grep [root@86 ttf-arphic-uming-0.0.20050501]# cat /proc/diskstats 1 0 ram0 0 ...
- MySQL常用的自带函数
MySQL自带函数十分丰富,合理使用可以减少很多编码工作. >>数学函数 数学函数主要用于处理数字,包括整型.浮点数等.数学函数包括绝对值函数.正弦函数.余弦函数.获取随机数的函数等.AB ...
- linux tricks 之数据对齐。
转载:http://blog.chinaunix.net/uid-20608849-id-3027953.html 内核为了保持最大的兼容性和代码灵活性,不可能直接对某个数据类型定义它的大小范围. ...
- Intent的七大属性
1.Action Action属性代表系统要执行的动作 系统提供如下常用的Action属性 *ACTION_MAIN:应用程序入口点 *ACTION_VIEW:显示指定数据 *ACTION_EDIT: ...
- http://jingyan.baidu.com/album/d8072ac47baf0eec95cefdca.html?picindex=4
http://jingyan.baidu.com/album/d8072ac47baf0eec95cefdca.html?picindex=4
- HashMap两种遍历数据的方式
HashMap的遍历有两种方式,一种是entrySet的方式,另外一种是keySet的方式. 第一种利用entrySet的方式: Map map = new HashMap(); Iterator i ...