推荐一款Mybatis分页插件
2017-05-31 15:12
330 查看
推荐一款Mybatis分页插件
以前也写过一篇博文介绍Mybatis的插件,以及如何通过Mybatis的插件功能实现一个自定义的分页插件,但是那个插件的侵入性是比较大的。前段时间遇到了一款开源的Mybatis分页插件,叫PageHelper,github地址是https://github.com/pagehelper/Mybatis-PageHelper,其原理是通过
ThreadLocal来存放分页信息,从而可以做到在Service层实现无侵入性的Mybatis分页实现。笔者感觉还不错,所以特意发博文记录一下,并推荐给大家。
简单示例
以下是使用PageHelper进行分页的一个简单的示例,更多详细的内容,请大家参数上面提供的github地址。
添加依赖
笔者使用的是Maven,添加依赖如下。<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>4.1.6</version> </dependency>
注册Mybatis Plugin
跟其它Mybatis Plugin一样,我们需要在Mybatis的配置文件中注册需要使用的Plugin,PageHelper中对应的Plugin实现类就是
com.github.pagehelper.PageHelper自身。顺便说一句,Mybatis的Plugin我们说是Plugin,实际上对应的却是
org.apache.ibatis.plugin.Interceptor接口,因为
Interceptor的核心是其中的
plugin(Object target)方法,而对于
plugin(Object target)方法的实现,我们在需要对对应的对象进行拦截时会通过
org.apache.ibatis.plugin.Plugin的静态方法
wrap(Object target, Interceptor interceptor)返回一个代理对象,而方法入参就是当前的
Interceptor实现类。
<plugins> <plugin interceptor="com.github.pagehelper.PageHelper"/> </plugins>
使用PageHelper
PageHelper拦截的是
org.apache.ibatis.executor.Executor的
query方法,其传参的核心原理是通过
ThreadLocal进行的。当我们需要对某个查询进行分页查询时,我们可以在调用Mapper进行查询前调用一次
PageHelper.startPage(..),这样
PageHelper会把分页信息存入一个
ThreadLocal变量中。在拦截到
Executor的
query方法执行时会从对应的
ThreadLocal中获取分页信息,获取到了,则进行分页处理,处理完了后又会把
ThreadLocal中的分页信息清理掉,以便不影响下一次的查询操作。所以当我们使用了
PageHelper.startPage(..)后,每次将对最近一次的查询进行分页查询,如果下一次查询还需要进行分页查询,需要重新进行一次
PageHelper.startPage(..)。这样就做到了在引入了分页后可以对原来的查询代码没有任何的侵入性。此外,在进行分页查询时,我们的返回结果一般是一个
java.util.List,
PageHelper分页查询后的结果会变成
com.github.pagehelper.Page类型,其继承了
java.util.ArrayList,所以不会对我们的方法声明造成影响。
com.github.pagehelper.Page中包含有返回结果的分页信息,包括总记录数,总的分页数等信息,所以一般我们需要把返回结果强转为
com.github.pagehelper.Page类型。以下是一个简单的使用
PageHelper进行分页查询的示例代码。
public class PageHelperTest { private static SqlSessionFactory sqlSessionFactory; private SqlSession session; @BeforeClass public static void beforeClass() throws IOException { InputStream is = Resources.getResourceAsStream("mybatis-config-single.xml"); sqlSessionFactory = new SqlSessionFactoryBuilder().build(is); } @Before public void before() { this.session = sqlSessionFactory.openSession(); } @After public void after() { this.session.close(); } @Test public void test() { int pageNum = 2;//页码,从1开始 int pageSize = 10;//每页记录数 PageHelper.startPage(pageNum, pageSize);//指定开始分页 UserMapper userMapper = this.session.getMapper(UserMapper.class); List<User> all = userMapper.findAll(); Page<User> page = (Page<User>) all; System.out.println(page.getPages()); System.out.println(page); } }
以上是通过
PageHelper.startPage(..)传递分页信息的示例,其实
PageHelper还支持Mapper参数传递分页信息等其它用法。关于
PageHelper的更多用法和配置信息等请参考该项目的GitHub官方文档。
(本文由Elim写于2017年5月31日)
相关文章推荐
- 推荐一款Mybatis分页插件
- 推荐mybatis分页插件mybatis-paginator
- Mybatis分页插件PageHelper的配置和简单使用方法(推荐)
- 推荐一款好用的jquery弹出层插件——wbox
- 推荐一款查看json数据的神器:chrome插件jsonview
- 推荐一款很好用的调试JS的Eclipse插件
- 推荐一款好用Jquery弹出层插件
- 一款Jquery 分页插件的改造方法(服务器端分页)
- 一张图片 点击鼠标放大,再点缩小 ( 基于jquery1.8.3), 另外推荐一款插件:lightBox...效果不错。
- 推荐一款好用的jquery弹出层插件——wbox
- 推荐一款 chrome SSH 插件 - Secure Shell
- Mybatis3分页, 基于Mybatis Generator插件生成分页语句
- 推荐一款很好用的调试JS的Eclipse插件
- Mybatis拦截器介绍及分页插件
- Mybatis拦截器介绍及分页插件
- [置顶] 推荐一款好用的jquery弹出层插件——wbox
- 推荐一款超小且很好用的eclipse properties 编辑器插件
- 推荐一款很好用的调试JS的Eclipse插件
- 推荐一款图片轮换jQuery插件
- Mybatis拦截器介绍及分页插件