
* [小書MybatisPlus第1篇-整合SpringBoot快速開始增刪改查](http://www.zimug.com/other/springboot/%e5%b0%8f%e4%b9%a6mybatisplus%e7%ac%ac1%e7%af%87-%e6%95%b4%e5%90%88springboot%e5%bf%ab%e9%80%9f%e5%bc%80%e5%a7%8b%e5%a2%9e%e5%88%a0%e6%94%b9%e6%9f%a5/.html)
* [小書MybatisPlus第2篇-條件構造器的應用及總結](http://www.zimug.com/other/springboot/%e5%b0%8f%e4%b9%a6mybatisplus%e7%ac%ac2%e7%af%87-%e6%9d%a1%e4%bb%b6%e6%9e%84%e9%80%a0%e5%99%a8%e7%9a%84%e5%ba%94%e7%94%a8%e5%8f%8a%e6%80%bb%e7%bb%93/.html)
* [小書MybatisPlus第3篇-自定義SQL](http://www.zimug.com/other/java/%e5%b0%8f%e4%b9%a6mybatisplus%e7%ac%ac3%e7%af%87-%e8%87%aa%e5%ae%9a%e4%b9%89sql/.html)
本文為mybatis系列文檔的第4篇,前三篇請訪問上面的網址。
## 一、讓Spring Boot-MybatisPlus支持分頁
在已經集成了Mybatis Plus的Spring項目中加入如下分頁攔截器的配置,讓MybatisPlus支持分頁
~~~
@Configuration
public class MybatisPlusConfiguration {
//配置分頁攔截器
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
~~~
## 二、單表查詢分頁-表格分頁
~~~
@Test
public void testSelect() {
LambdaQueryWrapper<User> query = new LambdaQueryWrapper<>();
query.ge(User::getAge,10) //查詢條件:年齡大于10
.orderByDesc(User::getAge); //按照年齡的倒序排序
Page<User> page = new Page<> (1,10); //查詢第1頁,每頁10條數據
userMapper.selectPage(page,query); //page分頁信息,query查詢條件
System.out.println("總頁數:"+ page.getPages());
System.out.println("總記錄數:"+ page.getTotal());
// 分頁返回的對象與傳入的對象是同一個
List<User> list = page.getRecords();
list.forEach(System.out::println);
}
~~~
查詢輸出結果如下:
~~~
總頁數:1
總記錄數:6
User(id=3, name=Tom, age=28, email=test3@baomidou.com)
User(id=5, name=Billie, age=24, email=test5@baomidou.com)
User(id=4, name=Sandy, age=21, email=test4@baomidou.com)
User(id=2, name=Jack, age=20, email=test2@baomidou.com)
User(id=1, name=Jone, age=18, email=test1@baomidou.com)
User(id=1280261858003038209, name=字母哥, age=18, email=null)
~~~
在分頁查詢過程中,一共執行了兩條SQL
~~~
# 第一條SQL用于查詢在query條件下的總條數
SELECT COUNT(1) FROM user WHERE age >= ?
# 第二條SQL用于查詢具體的數據
SELECT id,name,age,email
FROM user
WHERE age >= ?
ORDER BY age DESC
LIMIT ?,?
~~~
這種分頁方式比較適合于傳統應用中,表格分頁的開發。需要給出總條數,以及每頁多少條。

## 三、不查詢總記錄數的分頁-下拉分頁
在一些現代的互聯網資訊網站,或者應用app。通常不會給出數據的總條數,而是通過鼠標或者手勢,每次下拉都加載n條數據。

這種情況下的分頁通常就不需要查詢總條數了,如果查詢總條數浪費數據庫的計算資源,使響應時間變長。所以我們應該只做分頁數據查詢,不查詢總條數。設置page分頁的第三個參數為false。

輸出結果總頁數和總條數都是0,但是分頁數據正常查詢回來了。
~~~
總頁數:0
總記錄數:0
User(id=3, name=Tom, age=28, email=test3@baomidou.com)
User(id=5, name=Billie, age=24, email=test5@baomidou.com)
User(id=4, name=Sandy, age=21, email=test4@baomidou.com)
User(id=2, name=Jack, age=20, email=test2@baomidou.com)
User(id=1, name=Jone, age=18, email=test1@baomidou.com)
User(id=1280261858003038209, name=字母哥, age=18, email=null)
~~~
只執行了這樣一個SQL
~~~
ELECT id,name,age,email
FROM user
WHERE age >= ?
ORDER BY age DESC
LIMIT ?,?
~~~
## 四、自定義多表聯查并分頁
~~~
UserVo userVo = new UserVo();
userVo.setAgeStart(25);
userVo.setHobby("看書");
Page<User> page = new Page<>(1, 10);
userMapper.selectUserPage(page, userVo);
System.out.println("總頁數:" + page.getPages());
System.out.println("總記錄數:" + page.getTotal());
List<User> list = page.getRecords();
list.forEach(System.out::println);
~~~
~~~
SELECT COUNT(1) FROM `user`
WHERE age >= ? AND EXISTS (
SELECT 1 FROM `user_hobby` AS ho
WHERE ho.user_id = `user`.id AND ho.hobby LIKE CONCAT('%', ?, '%')
)
~~~
~~~
select * from `user`
where age >= ? and EXISTS (
SELECT 1 FROM `user_hobby` as ho
where ho.user_id=`user`.id and ho.hobby like CONCAT('%',?,'%')
) LIMIT ?,?
~~~