美文网首页
mybatis是如何分页的,分页插件的原理是什么

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

作者: 啦啦啦啦啦哈1 | 来源:发表于2019-04-26 16:04 被阅读0次

    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

    来源:简书

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

    相关文章

      网友评论

          本文标题:mybatis是如何分页的,分页插件的原理是什么

          本文链接:https://www.haomeiwen.com/subject/qmkqnqtx.html