1. SQL 分頁
<select id="queryStudentsBySql" parameterType="map" resultMap="studentmapper">?
? ? ? ? ? ?select * from student limit #{currIndex} , #{pageSize}
</select>
2. 使用攔截器分頁
創(chuàng)建攔截器翼闽,攔截mybatis接口方法id以ByPage結(jié)束的語句
? ? ? ? ?String sql = (String) MetaObjectHandler.getValue("delegate.boundSql.sql");
? ? ? ? ? ? //也可以通過statementHandler直接獲取
? ? ? ? ? ? //sql = statementHandler.getBoundSql().getSql();
? ? ? ? ? ? //構(gòu)建分頁功能的sql語句? ? ? ? ? ? String limitSql;
? ? ? ? ? ? sql = sql.trim();
? ? ? ? ? ? limitSql = sql + " limit " + (currPage - 1) * pageSize + "," + pageSize;
? ? ? ? ? ? //將構(gòu)建完成的分頁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>
通過自定義插件的形式實現(xiàn)分頁洲炊,也是最好的感局,也叫做分頁攔截器尼啡。實現(xiàn)步驟如下:
插件支持MySQL和Oracle兩種數(shù)據(jù)庫,通過方法名關(guān)鍵字ListPage去匹配询微,有才進(jìn)行分頁處理崖瞭,并且不用在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對象進(jìn)行分頁撑毛,它是針對ResultSet結(jié)果集執(zhí)行的內(nèi)存分頁书聚,而非物理分頁,可以在sql內(nèi)直接書寫帶有物理分頁的參數(shù)來完成物理分頁功能代态,也可以使用分頁插件來完成物理分頁寺惫。
數(shù)據(jù)量小時,RowBounds不失為一種好辦法蹦疑。但是數(shù)據(jù)量大時西雀,實現(xiàn)攔截器就很有必要了。
mybatis接口加入RowBounds參數(shù)
(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提供的插件接口歉摧,實現(xiàn)自定義插件艇肴,在插件的攔截方法內(nèi)攔截待執(zhí)行的sql,然后重寫sql叁温,根據(jù)dialect方言再悼,添加對應(yīng)的物理分頁語句和物理分頁參數(shù)。
舉例:select * from student膝但,攔截sql后重寫為:select t.* from (select * from student)t?limit 0冲九,10