一、引言
分頁查詢每個人程序猿幾乎都使用過,但是有部分同學不懂什么是物理分頁和邏輯分頁。
物理分頁:相當于執行了limit分頁語句,返回部分數據。物理分頁只返回部分數據占用內存小,能夠獲取數據庫最新的狀態,實施性比較強,一般適用于數據量比較大,數據更新比較頻繁的場景。
邏輯分頁:一次性把全部的數據取出來,通過程序進行篩選數據。如果數據量大的情況下會消耗大量的內存,由于邏輯分頁只需要讀取數據庫一次,不能獲取數據庫最新狀態,實施性比較差,適用于數據量小,數據穩定的場合。
那么MP中的物理分頁怎么實現呢? 往下看往下看
二、配置
創建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(); } }
三、具體分頁實現
MP的Wrapper提供了兩種分頁查詢的方式,源碼如下:
/** * 根據 entity 條件,查詢全部記錄(并翻頁) * * @param page 分頁查詢條件(可以為 RowBounds.DEFAULT) * @param queryWrapper 實體對象封裝操作類(可以為 null) */ IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根據 Wrapper 條件,查詢全部記錄(并翻頁) * * @param page 分頁查詢條件 * @param queryWrapper 實體對象封裝操作類 */ IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
可見兩個分頁方法參數都是一致的,只是返回參數略有不同,具體選擇根據實際業務為準。
/** * 分頁查詢 */ @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("總頁數"+mapIPage.getPages()); System.out.println("總記錄數"+mapIPage.getTotal()); List<Map<String, Object>> records = mapIPage.getRecords(); records.forEach(System.out::println); }
以上分頁查詢執行sql如下,先是查詢了一次總記錄數,然后在查詢的數據。
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
總頁數1
總記錄數2
現在我們有需求只要查詢數據即可, 不關心總記錄數等,如果使用默認的方式就消耗不必要的性能。那么解決辦法也是很簡單的,只需要在創建page對象時傳入第三個參數為false即可。
Page<User> page = new Page<>(1,2,false);
四、自定義sql分頁查詢
有時候查詢的數據難免會出現多表連接查詢,或者是一些復雜的sql語句,但是這些語句也是需要支持分頁查詢的,
先定義查詢接口,第一個參數要是分頁的參數,小編這里演示就寫簡單的sql。
步驟一:在mapper文件中,編寫對應的分頁查詢接口。
步驟二:在xml中編寫對應的sql語句,小編這里演示的 “${ew.customSqlSegment}”,這個是如果你想自定義的sql語句,也想使用wrapper查詢條件構造器,則需要在mapper接口中添加參數,以及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("總頁數"+mapIPage.getPages()); System.out.println("總記錄數"+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如下:需要傳入分頁的參數,返回的類型也需要是分頁對象
/** * <p> * 用戶 Mapper 接口 * </p> * * @author IT賤男 * @since 2019-06-14 */ public interface UserMapper extends MyMapper<User> { /** * 多表查詢分頁 * @param page * @return */ IPage<String> selectByHisName(IPage<User> page); }
測試如下:通過查看日志,執行的sql加了分頁條件的。
@Test public void select(){ // 創建分頁參數 Page<User> page = new Page<>(1,2); IPage<String> result = userMapper.selectByHisName(page); // 獲取數據 List<String> records = result.getRecords(); records.forEach(System.out::println); System.out.println("總頁數 = "+ 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胡伯云
安元慧
總頁數 = 59
到此這篇關于MyBatis-Plus 分頁查詢以及自定義sql分頁的實現的文章就介紹到這了,更多相關MyBatis-Plus 自定義sql分頁內容請搜索億速云以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持億速云!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。