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

2019-04-26  本文已影响0人  啦啦啦啦啦哈1

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中写分页代码。

<!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

作者:代码之尖

链接:https://www.jianshu.com/p/eed3f2e24b83

来源:简书

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

上一篇下一篇

猜你喜欢

热点阅读