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(); //默认构造函数不提供分页,返回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的配置写成这样:
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(事务管 ...
随机推荐
- [Android UI] Shape详解 (GradientDrawable)
转载自:http://blog.csdn.net/feng88724/article/details/6398193 在Android开发过程中,经常需要改变控件的默认样式, 那么通常会使用多个图片来 ...
- 在Win8中创建热点,共享网络
在Win8中创建热点,共享网络 办公室中,我独享10M光纤,没什么要下的,便想利用来更新下Ipad里面的程序,下点公开课.那在不利用软件[用很多wifi共享的软件],从win7开始 系统本身就自带相关 ...
- 正则和xml解析
一般来说是xml解析的开销比正则大些.使用正则搜索,只需搜索<second>就能定位到你要的内容,而xml解析要把节点树在内存中建立起来,所以消耗内存会多些,速度可能会受到一些影响.但对于 ...
- 如何给Eclipse中添加库(jar包)
折腾Eclipse时,经常会遇到这种情况: 缺少某个库,找到之后,需要将该库,jar包,加入到当前项目,使得代码中的import xxx得以正常导入. 举例: [已解决]Eclipse的java代码出 ...
- php 克隆和引用类
/*class Ren { public $name; public $sex; function __construct($n,$s) { $this->name=$n; $this-> ...
- linux下php增加curl扩展,生成curl.so文件
进入php源代码目录 cd /php5.6.9/ext/curl 执行生成so文件编译模式 /usr/local/php/bin/phpize 编译curl扩展 ./configure --with- ...
- Java Hour 17 来个CURD吧(二)
有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. 突然想到我最近一直在追的小说,作者每天都会更新两章,而且质量挺高.所以从这篇开 ...
- 抓包工具Fiddler的使用
Fiddler 教程 Fiddler是最强大最好用的Web调试工具之一,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据. 使用Fiddler无论对开发 ...
- 资产移动盘点手持机PDA系统
手持机PDA系统功能 PDA初始化 从后台管理机系统中预先设置的众多操作人员列表中下载当前PDA的使用人员: 系统支持多用户使用同一台PDA情况下的用户认证登陆,每一用户根据后台管理机系统设置与安全管 ...
- 水题 HDOJ 4716 A Computer Graphics Problem
题目传送门 /* 水题:看见x是十的倍数就简单了 */ #include <cstdio> #include <iostream> #include <algorithm ...