mybatis分页插件---PageHeper

来源:互联网 发布:python计算器源代码 编辑:程序博客网 时间:2024/06/10 05:27

PageHelper是一款使用非常简单的Mybatis分页插件,在Mybatis的配置文件中以插件的形式使用。使用步骤如下:

一、导入jar包

jsqlparser-0.9.5.jarpagehelper-4.2.1.jar

二、修改配置文件

在mybatis.xml配置文件中加入以下代码

<plugins>        <plugin interceptor="com.github.pagehelper.PageHelper">            <!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库-->                    <property name="dialect" value="mysql"/>           </plugin> </plugins>
三、工作原理
PageHelper是通过mybatis的pulgin实现了Interceptor接口,工作过程如下:




pageHelper会使用ThreadLocal获取到同一线程中的变量信息,各个线程之间的Threadlocal不会相互干扰,也就是Thread1中的ThreadLocal1之后获取到Tread1中的变量的信息,不会获取到Thread2中的信息。所以在多线程环境下,各个Threadlocal之间相互隔离,可以实现,不同thread使用不同的数据源或不同的Thread中执行不同的SQL语句。

因此,PageHelper利用这一点通过拦截器获取到同一线程中的预编译好的SQL语句之后将SQL语句包装成具有分页功能的SQL语句,并将其再次赋值给下一步操作,所以实际执行的SQL语句就是有了分页功能的SQL语句

四、PageHelper的使用

在service层调用Dao层之前,使用PageHelper进行分页,就可以将分页信息切入到sql语句中了。

PageHelper.startPage(pageNum ,pageSize);//ִ调用服务层,服务层调用DAO来执行sql语句List<Category> list = categoryService.queryMessage(Integer.parseInt(id));
pageNum表示当前处于第几页,pageSize表示每页显示多少条记录

使用PageHelper进行分页后,代码中list集合对象中就得到的是分页后的信息。为了方便使用“上一页”、“下一页”、“首页”等等分页信息,一般需要将分页后的list对象再进行封装,封装后就可以使用“总页码”,“上一页”等这种功能。

五、将结果封装成PageInfo对象

PageInfo<Category> page=new PageInfo<Category>(list);
PageInfo类中的信息如下:

 //当前页    private int pageNum;    //每页的数量    private int pageSize;    //当前页的数量    private int size;    //由于startRow和endRow不常用,这里说个具体的用法    //可以在页面中"显示startRow到endRow 共size条数据"    //当前页面第一个元素在数据库中的行号    private int startRow;    //当前页面最后一个元素在数据库中的行号    private int endRow;    //总记录数    private long total;    //总页数    private int pages;    //结果集    private List<T> list;    //前一页    private int prePage;    //下一页    private int nextPage;    //是否为第一页    private boolean isFirstPage = false;    //是否为最后一页    private boolean isLastPage = false;    //是否有前一页    private boolean hasPreviousPage = false;    //是否有下一页    private boolean hasNextPage = false;    //导航页码数    private int navigatePages;    //所有导航页号    private int[] navigatepageNums;    //导航条上的第一页    private int navigateFirstPage;    //导航条上的最后一页    private int navigateLastPage;    ......
由此可见,封装成PageInfo对象的好处。




0 0