前言
如果想要將現有的select語句改爲支持分頁功能的查詢語句該怎麼做呢?最簡單的一種做法就是將所有的select語句都加上limit來實現分頁,這種做法有什麼問題呢?
1、要改動的地方非常多,而且每個sql改動邏輯基本上一致;
2、DAO層的查詢邏輯要改動,要在原來查詢之後執行查詢 SELECT count(1) from …… 查詢數據總條數。
有沒有一種簡便方法實現呢?
Mybatis提供了plugin機制,允許我們在Mybatis的原有處理流程上加入自己邏輯,所有我們就可以使用這種邏輯加上我們的分頁邏輯,也就是實現攔截器。
Mybatis支持的攔截的接口有4個,Executor、ParameterHandler、ResultSetHandler、StatementHandler。
一、使用PageHelper實現分頁
PageHelper實現了通用的分頁查詢,其支持的數據有,mysql、Oracle、DB2、PostgreSQL等主流的數據庫。
該插件託管於github: https://github.com/pagehelper/Mybatis-PageHelper
①.導入依賴
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>`在這裏插入代碼片`
<version>0.9.1</version>
</dependency>
②.在全局配置文件中配置插件
<plugins>
<!-- com.github.pagehelper爲PageHelper類所在包名 -->
<plugin interceptor="com.github.pagehelper.PageHelper">
<!-- 方言 -->
<property name="dialect" value="mysql"/>
<!-- 該參數默認爲false -->
<!-- 設置爲true時,使用RowBounds分頁會進行count查詢 -->
<property name="rowBoundsWithCount" value="true"/>
</plugin>
</plugins>
③.編寫接口
public List<User> queryUserListLikeName(@Param("name") String name);
④.編寫映射文件
<select id="queryUserListLikeName" parameterType="String" resultType="User">
SELECT <include refid="my.common.userColumns"/> FROM tb_user WHERE name LIKE '%${name}%'
</select>
⑤.測試分頁
@Test
public void testQueryUserListLikeName() {
//設置分頁條件,Parameters:pageNum 頁碼pageSize 每頁顯示數量count 是否進行count查詢
PageHelper.startPage(1, 3, true);
List<User> users = this.userMapper.queryUserListLikeName(null);
for (User user : users) {
System.out.println(user);
}
}
結果:
可以使用PageInfo 查看分頁信息
@Test
public void testQueryUserListLikeName() {
//設置分頁條件,Parameters:pageNum 頁碼pageSize 每頁顯示數量count 是否進行count查詢
PageHelper.startPage(1, 3, true);
List<User> users = this.userMapper.queryUserListLikeName(null);
PageInfo<User> pageInfo = new PageInfo<User>(users);
//打印分頁信息
System.out.println("數據總數:" + pageInfo.getTotal());
System.out.println("數據總頁數:" + pageInfo.getPages());
System.out.println("最後一頁:" + pageInfo.getLastPage());
for (User user : pageInfo.getList()) {
System.out.println(user);
}
}
PageInfo的方法
二、Mybatis批量增刪改
批量刪除
批量增加
批量修改