Mybatis使用pageHelper分页插件原理

来源:互联网 发布:淘宝怎样延长发货时间 编辑:程序博客网 时间:2024/06/05 20:09

首先在Mybatis的配置文件 SqlMapConfig.xml中配置PageHelper插件

<?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPEconfiguration

            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

            "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

      <!-- 配置分页插件 -->

      <plugins>

            <plugininterceptor="com.github.pagehelper.PageHelper">

                  <!-- 设置数据库类型 Oracle,MySQL,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库-->       

           <propertyname="dialect"value="mysql"/>

            </plugin>

      </plugins>

</configuration>

pageHelper是如何在mybatis中工作呢,是通过mybatis的pulgin实现了Interceptor接口


使用原理:

pageHelper会使用ThreadLocal获取到同一线程中的变量信息,各个线程之间的Threadlocal不会相互干扰,也就是Thread1中的ThreadLocal1之后获取到Tread1中的变量的信息,不会获取到Thread2中的信息
所以在多线程环境下,各个Threadlocal之间相互隔离,可以实现,不同thread使用不同的数据源或不同的Thread中执行不同的SQL语句
所以,PageHelper利用这一点通过拦截器获取到同一线程中的预编译好的SQL语句之后将SQL语句包装成具有分页功能的SQL语句,并将其再次赋值给下一步操作,所以实际执行的SQL语句就是有了分页功能的SQL语句

1定义一个 分页的类

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public class Page {  
  2.     private int startPage;  
  3.     private int pageSize;  
  4.     public int getStartPage() {  
  5.   
  6.         return startPage;  
  7.     }  
  8.     public void setStartPage(int startPage) {  
  9.         this.startPage = startPage;  
  10.     }  
  11.     public int getPageSize() {  
  12.   
  13.         return pageSize;  
  14.     }  
  15.     public void setPageSize(int pageSize) {  
  16.         this.pageSize = pageSize;  
  17.     }  
  18.     public Page(int startPage, int pageSize) {  
  19.         super();  
  20.         this.startPage = startPage;  
  21.         this.pageSize = pageSize;  
  22.     }  
  23.     public Page() {  
  24.         super();  
  25.         // TODO Auto-generated constructor stub  
  26.   
  27.     }  
  28.   
  29. }  
2模拟 PageHelper

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public class PageHelper {  
  2.     /**  
  3.      * 其实 PageHelper 的实现靠的就是这个变量,  
  4.      * 它的里面可以存储的东西,在真正需要计算分页的时候,可以随时取出来  
  5.      */  
  6.     private static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal<Page>();  
  7.   
  8.     public static void startPage(int startPage, int pageSize) {  
  9.         Page page  = new Page();  
  10.         page.setStartPage(startPage);  
  11.         page.setPageSize(pageSize);  
  12.         LOCAL_PAGE.set(page);  
  13.     }  
  14.   
  15.     public static Page getPage() {  
  16.         return LOCAL_PAGE.get();  
  17.     }   
  18. }</span>  
3.测试分页原理
[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public class TestPage {  
  2.     public static void main(String[] args) {  
  3.         int startPage = 1;  
  4.         int pageSize =10;  
  5.         PageHelper.startPage(startPage, pageSize);  
  6.         Page page = PageHelper.getPage();  
  7.         System.out.println(page.getStartPage()  + " : " + page.getPageSize());  
  8.     }  
  9. }  
1 0
原创粉丝点击