mybatis是如何分页的,分页插件的原理是什么

mybatis是如何分页的,分页插件的原理是什么


12018.12.28 17:11:12字数 529阅读 19,877

1. SQL 分页

<select id="queryStudentsBySql" parameterType="map" resultMap="studentmapper"> 

           select * from student limit #{currIndex} , #{pageSize}

</select>

2. 使用拦截器分页

创建拦截器,拦截mybatis接口方法id以ByPage结束的语句

         String sql = (String) MetaObjectHandler.getValue("delegate.boundSql.sql");

            //也可以通过statementHandler直接获取

            //sql = statementHandler.getBoundSql().getSql();

            //构建分页功能的sql语句            String limitSql;

            sql = sql.trim();

            limitSql = sql + " limit " + (currPage - 1) * pageSize + "," + pageSize;

            //将构建完成的分页sql语句赋值个体'delegate.boundSql.sql',偷天换日           MetaObjectHandler.setValue("delegate.boundSql.sql", limitSql);

 


<configuration>

      <plugins>

                   <plugin interceptor="com.autumn.interceptor.MyPageInterceptor">

                               <property name="limit" value="10"/>

                               <property name="dbType" value="mysql"/>

                  </plugin>

          </plugins>

</configuration>

 

通过自定义插件的形式实现分页,也是最好的,也叫做分页拦截器。实现步骤如下:

插件支持MySQL和Oracle两种数据库,通过方法名关键字ListPage去匹配,有才进行分页处理,并且不用在Mapping中写分页代码。

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

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

<configuration>

    <typeAliases>

        <typeAlias alias="PageInfo" type="com.jsoft.testmybatis.util.PageInfo" />

    </typeAliases>

    <plugins>

        <plugin interceptor="com.jsoft.testmybatis.util.PagePlugin">

            <property name="dialect" value="mysql" />

            <property name="pageSqlId" value=".*ListPage.*" />

        </plugin>

    </plugins>

</configuration>

 

 

 


3. RowBounds分页

Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

 

数据量小时,RowBounds不失为一种好办法。但是数据量大时,实现拦截器就很有必要了。

mybatis接口加入RowBounds参数

(1)Dao:

     public List queryUsersByPage(String userName, RowBounds rowBounds);

(2)Service:

@Override

    @Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.SUPPORTS)

    publicList queryRolesByPage(String roleName,intstart,int limit) {

        returnroleDao.queryRolesByPage(roleName,new RowBounds(start, limit));

    }

 


分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。

举例:select * from student,拦截sql后重写为:select t.* from (select * from student)t limit 0,10

 
 
55人点赞
 
posted @ 2021-06-07 09:18  abcdefghijklmnop  阅读(850)  评论(0编辑  收藏  举报