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

1. SQL 分页

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);



     

                   

                               

                               

                 

         


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

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


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

   

       

   

   

       

           

           

       

   





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

你可能感兴趣的:(mybatis是如何分页的,分页插件的原理是什么)