黑马程序员技术交流社区

标题: 【上海校区】Mybatis分页插件 [打印本页]

作者: yuchengmin    时间: 2018-11-5 20:15
标题: 【上海校区】Mybatis分页插件
Mybatis分页插件


        以下是使用PageHelper进行分页的一个简单的示例。
添加依赖
        添加依赖如下:
[XML] 纯文本查看 复制代码
<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实现类。
[XML] 纯文本查看 复制代码
<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进行分页查询的示例代码。
[Java] 纯文本查看 复制代码
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参数传递分页信息等其它用法。




作者: 不二晨    时间: 2018-11-7 09:01
ヾ(◍°∇°◍)ノ゙
作者: 魔都黑马少年梦    时间: 2018-11-8 16:59





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2