MyBatis-Plus 分頁查詢以及自定義sql分頁的實現(xiàn)
一、引言
分頁查詢每個人程序猿幾乎都使用過,但是有部分同學(xué)不懂什么是物理分頁和邏輯分頁。
物理分頁:相當(dāng)于執(zhí)行了limit分頁語句,返回部分?jǐn)?shù)據(jù)。物理分頁只返回部分?jǐn)?shù)據(jù)占用內(nèi)存小,能夠獲取數(shù)據(jù)庫最新的狀態(tài),實施性比較強(qiáng),一般適用于數(shù)據(jù)量比較大,數(shù)據(jù)更新比較頻繁的場景。
邏輯分頁:一次性把全部的數(shù)據(jù)取出來,通過程序進(jìn)行篩選數(shù)據(jù)。如果數(shù)據(jù)量大的情況下會消耗大量的內(nèi)存,由于邏輯分頁只需要讀取數(shù)據(jù)庫一次,不能獲取數(shù)據(jù)庫最新狀態(tài),實施性比較差,適用于數(shù)據(jù)量小,數(shù)據(jù)穩(wěn)定的場合。
那么MP中的物理分頁怎么實現(xiàn)呢? 往下看往下看
二、配置
創(chuàng)建MybatisPlusConfig配置類,需要配置分頁插件,小編使用的Spring boot配置方式。
/**
* @Auther: IT賤男
* @Date: 2019/6/12 15:06
* @Description: MybatisPlus配置類
*/
@Configuration
public class MyBatisPlusConfig {
/**
* 分頁插件
* @return
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
三、具體分頁實現(xiàn)
MP的Wrapper提供了兩種分頁查詢的方式,源碼如下:
/** * 根據(jù) entity 條件,查詢?nèi)坑涗洠ú⒎摚? * * @param page 分頁查詢條件(可以為 RowBounds.DEFAULT) * @param queryWrapper 實體對象封裝操作類(可以為 null) */ IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根據(jù) Wrapper 條件,查詢?nèi)坑涗洠ú⒎摚? * * @param page 分頁查詢條件 * @param queryWrapper 實體對象封裝操作類 */ IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
可見兩個分頁方法參數(shù)都是一致的,只是返回參數(shù)略有不同,具體選擇根據(jù)實際業(yè)務(wù)為準(zhǔn)。
/**
* 分頁查詢
*/
@Test
public void selectByPage() {
QueryWrapper<User> wrapper = new QueryWrapper();
wrapper.like("name", "雨").lt("age", 40);
Page<User> page = new Page<>(1,2);
//IPage<User> userIPage = userMapper.selectPage(page, wrapper);
IPage<Map<String, Object>> mapIPage = userMapper.selectMapsPage(page, wrapper);
System.out.println("總頁數(shù)"+mapIPage.getPages());
System.out.println("總記錄數(shù)"+mapIPage.getTotal());
List<Map<String, Object>> records = mapIPage.getRecords();
records.forEach(System.out::println);
}
以上分頁查詢執(zhí)行sql如下,先是查詢了一次總記錄數(shù),然后在查詢的數(shù)據(jù)。
DEBUG==> Preparing: SELECT COUNT(1) FROM user WHERE name LIKE ? AND age < ?
DEBUG==> Parameters: %雨%(String), 40(Integer)
TRACE<== Columns: COUNT(1)
TRACE<== Row: 2
DEBUG==> Preparing: SELECT id,name,age,email,manager_id,create_time FROM user WHERE name LIKE ? AND age < ? LIMIT ?,?
DEBUG==> Parameters: %雨%(String), 40(Integer), 0(Long), 2(Long)
TRACE<== Columns: id, name, age, email, manager_id, create_time
TRACE<== Row: 2, 張雨琪, 31, zjq@baomidou.com, 1088248166370832385, 2019-01-14 09:15:15
TRACE<== Row: 3, 劉紅雨, 31, lhm@baomidou.com, 1088248166370832385, 2019-01-14 09:48:16
DEBUG<== Total: 2
總頁數(shù)1
總記錄數(shù)2
現(xiàn)在我們有需求只要查詢數(shù)據(jù)即可, 不關(guān)心總記錄數(shù)等,如果使用默認(rèn)的方式就消耗不必要的性能。那么解決辦法也是很簡單的,只需要在創(chuàng)建page對象時傳入第三個參數(shù)為false即可。
Page<User> page = new Page<>(1,2,false);
四、自定義sql分頁查詢
有時候查詢的數(shù)據(jù)難免會出現(xiàn)多表連接查詢,或者是一些復(fù)雜的sql語句,但是這些語句也是需要支持分頁查詢的,
先定義查詢接口,第一個參數(shù)要是分頁的參數(shù),小編這里演示就寫簡單的sql。
步驟一:在mapper文件中,編寫對應(yīng)的分頁查詢接口。
步驟二:在xml中編寫對應(yīng)的sql語句,小編這里演示的 “${ew.customSqlSegment}”,這個是如果你想自定義的sql語句,也想使用wrapper查詢條件構(gòu)造器,則需要在mapper接口中添加參數(shù),以及xml中也要有固定。
/** * 自定義sql分頁 * @param page * @param queryWrapper 看這里看這里,如果自定義的方法中需要用到wrapper查詢條件,需要這樣寫 * @return */ IPage<User> selectMyPage(IPage<User> page, @Param(Constants.WRAPPER) Wrapper<User> queryWrapper);
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper">
<select id="selectMyPage" resultType="com.example.demo.model.User">
SELECT * FROM user ${ew.customSqlSegment}
</select>
</mapper>
/**
* 自定義sql分頁查詢
*/
@Test
public void selectByMyPage() {
QueryWrapper<User> wrapper = new QueryWrapper();
wrapper.like("name", "雨").lt("age", 40);
Page<User> page = new Page<>(1,2);
IPage<User> mapIPage = userMapper.selectMyPage(page, wrapper);
System.out.println("總頁數(shù)"+mapIPage.getPages());
System.out.println("總記錄數(shù)"+mapIPage.getTotal());
List<User> records = mapIPage.getRecords();
records.forEach(System.out::println);
}
五、多表sql分頁查詢
看評論有小伙伴反饋多表連接查詢怎么分頁,其實道理都是一樣的。
小編以簡單的為主,sql如下: his_ipd_encounter、his_user 兩張表
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper">
<select id="selectByHisName" resultType="java.lang.String">
select u.realname from his_ipd_encounter e, his_user u where e.his_uid = u.his_uid
</select>
</mapper>
mapepr如下:需要傳入分頁的參數(shù),返回的類型也需要是分頁對象
/**
* <p>
* 用戶 Mapper 接口
* </p>
*
* @author IT賤男
* @since 2019-06-14
*/
public interface UserMapper extends MyMapper<User> {
/**
* 多表查詢分頁
* @param page
* @return
*/
IPage<String> selectByHisName(IPage<User> page);
}
測試如下:通過查看日志,執(zhí)行的sql加了分頁條件的。
@Test
public void select(){
// 創(chuàng)建分頁參數(shù)
Page<User> page = new Page<>(1,2);
IPage<String> result = userMapper.selectByHisName(page);
// 獲取數(shù)據(jù)
List<String> records = result.getRecords();
records.forEach(System.out::println);
System.out.println("總頁數(shù) = "+ result.getPages());
}
ARNWarn: Could not find @TableId in Class: com.example.demo.model.HisUser.
INFOStarted UserMapperTest in 2.428 seconds (JVM running for 2.959)
select u.realname from his_ipd_encounter e, his_user u where e.his_uid = u.his_uid
DEBUG==> Preparing: SELECT COUNT(1) FROM his_ipd_encounter e, his_user u WHERE e.his_uid = u.his_uid
DEBUG==> Parameters:
TRACE<== Columns: COUNT(1)
TRACE<== Row: 117
DEBUG==> Preparing: select u.realname from his_ipd_encounter e, his_user u where e.his_uid = u.his_uid LIMIT ?,?
DEBUG==> Parameters: 0(Long), 2(Long)
TRACE<== Columns: realname
TRACE<== Row: 胡伯云
TRACE<== Row: 安元慧
DEBUG<== Total: 2
Time:20 ms - ID:com.example.demo.mapper.UserMapper.selectByHisName
Execute SQL:
com.p6spy.engine.wrapper.PreparedStatementWrapper@61bcbcce胡伯云
安元慧
總頁數(shù) = 59
到此這篇關(guān)于MyBatis-Plus 分頁查詢以及自定義sql分頁的實現(xiàn)的文章就介紹到這了,更多相關(guān)MyBatis-Plus 自定義sql分頁內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IntelliJ IDEA 2021.1 首個 Beta 版本發(fā)布
這篇文章主要介紹了IntelliJ IDEA 2021.1 首個 Beta 版本發(fā)布,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03
JavaWeb項目打開網(wǎng)頁出現(xiàn)Session Error的異常解決方案
這篇文章主要介紹了JavaWeb項目打開網(wǎng)頁出現(xiàn)Session Error的異常解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-10-10
java開發(fā)CPU流水線與指令亂序執(zhí)行詳解
這篇文章主要為大家介紹了java開發(fā)CPU流水線與指令亂序執(zhí)行詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
springboot項目整合mybatis并配置mybatis中間件的實現(xiàn)
這篇文章主要介紹了springboot項目整合mybatis并配置mybatis中間件的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
Java實現(xiàn)遞歸查詢樹結(jié)構(gòu)的示例代碼
我們在實際開發(fā)中,肯定會用到樹結(jié)構(gòu),如部門樹、菜單樹等等。Java后臺利用遞歸思路進(jìn)行構(gòu)建樹形結(jié)構(gòu)數(shù)據(jù),返回給前端,能以下拉菜單等形式進(jìn)行展示。今天,咱們就來說說怎么樣將List集合轉(zhuǎn)換成TreeList2022-11-11
手把手教學(xué)Win10同時安裝兩個版本的JDK并隨時切換(JDK8和JDK11)
最近在學(xué)習(xí)JDK11的一些新特性,但是日常使用基本上都是基于JDK8,因此,需要在win環(huán)境下安裝多個版本的JDK,下面這篇文章主要給大家介紹了手把手教學(xué)Win10同時安裝兩個版本的JDK(JDK8和JDK11)并隨時切換的相關(guān)資料,需要的朋友可以參考下2023-03-03
IDEA使用技巧之如何將本地項目和git遠(yuǎn)程項目關(guān)聯(lián)
這篇文章主要介紹了IDEA使用技巧之如何將本地項目和git遠(yuǎn)程項目關(guān)聯(lián)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02
MyBatis-Plus 分頁查詢以及自定義sql分頁的實現(xiàn)
這篇文章主要介紹了MyBatis-Plus 分頁查詢以及自定義sql分頁的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08

