SpringBoot使用Mybatis-Plus中分頁插件PaginationInterceptor詳解
1 配置分頁插件
@Configuration public class MybatisConfig { @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } }
在高版本的SpringBoot中, 會(huì)提示這種寫法已過時(shí), 所以采用另一種寫法 MybatisPlusInterceptor , 如下:
@Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2)); return interceptor; }
1.1 MybatisPlusInterceptor
該插件是核心插件,目前代理了 Executor#query 和 Executor#update 和 StatementHandler#prepare 方法
1.1.1 屬性
private List<InnerInterceptor> interceptors = new ArrayList<>();
1.1.2 InnerInterceptor
- 我們提供的插件都將基于此接口來實(shí)現(xiàn)功能 目前已有的功能: 自動(dòng)分頁: PaginationInnerInterceptor 多租戶:
- TenantLineInnerInterceptor 動(dòng)態(tài)表名: DynamicTableNameInnerInterceptor 樂觀鎖:
- OptimisticLockerInnerInterceptor sql性能規(guī)范: IllegalSQLInnerInterceptor
- 防止全表更新與刪除: BlockAttackInnerInterceptor 注意: 使用多個(gè)功能需要注意順序關(guān)系,建議使用如下順序 多租戶
- 動(dòng)態(tài)表名 分頁,樂觀鎖 sql性能規(guī)范,防止全表更新與刪除 總結(jié): 對sql進(jìn)行單次改造的優(yōu)先放入,不對sql進(jìn)行改造的最后放入
2 編寫Mapper及其對應(yīng)的mapper.xml文件
@Mapper public interface UserMapper extends BaseMapper<User> { List<User> findPageUsers(Page<User> page); }
<select id="findPageUsers" resultType="org.wxmx.mybatis_plus_study.entity.User"> select * from `user` </select>
3 編寫測試類
3.1 簡單的分頁查詢
@SpringBootTest class MybatisPlusStudyApplicationTests { @Resource UserMapper userMapper; @Test void contextLoads() { Page<User> page = new Page<>(1, 3); List<User> pageUsers = userMapper.findPageUsers(page); page.setRecords(pageUsers); System.out.println(page); } }
運(yùn)行結(jié)果:
JsqlParserCountOptimize sql=select * from `user` ==> Preparing: SELECT COUNT(1) FROM `user` ==> Parameters: <== Columns: COUNT(1) <== Row: 9 ==> Preparing: select * from `user` LIMIT ? ==> Parameters: 3(Long) <== Columns: id, name, age <== Row: 39a773890a1b12b8a072c1be02ff3cdc, aaa, 12 <== Row: 3b25fb904548c28b7ac6882d86c7ae5f, wdh, 12 <== Row: 8b0397fcdfebe37d1d26175c17ed3725, wdh, 12 <== Total: 3
3.2 帶查詢條件的分頁查詢
此方法是使用PaginationInterceptor 作為分頁插件.
@Test void contextLoads() { Page<User> page = new Page<>(1, 2); QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("name", "wdh"); Page<User> page1 = userMapper.selectPage(page, queryWrapper); page.setRecords(page1.getRecords()).getRecords().forEach(System.out::println); }
運(yùn)行結(jié)果:
JsqlParserCountOptimize sql=SELECT id,name,age FROM user WHERE (name = ?) ==> Preparing: SELECT COUNT(1) FROM user WHERE (name = ?) ==> Parameters: wdh(String) <== Columns: COUNT(1) <== Row: 5 ==> Preparing: SELECT id,name,age FROM user WHERE (name = ?) LIMIT ? ==> Parameters: wdh(String), 2(Long) <== Columns: id, name, age <== Row: 3b25fb904548c28b7ac6882d86c7ae5f, wdh, 12 <== Row: 8b0397fcdfebe37d1d26175c17ed3725, wdh, 12 <== Total: 2 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6a0f2853] User(id=3b25fb904548c28b7ac6882d86c7ae5f, name=wdh, age=12) User(id=8b0397fcdfebe37d1d26175c17ed3725, name=wdh, age=12)
3.3 Page
簡單分頁模型, 有如下幾個(gè)主要屬性
/** * 查詢數(shù)據(jù)列表 */ protected List<T> records = Collections.emptyList(); /** * 總數(shù) */ protected long total = 0; /** * 每頁顯示條數(shù),默認(rèn) 10 */ protected long size = 10; /** * 當(dāng)前頁 */ protected long current = 1;
4 注意事項(xiàng)
在編寫mapper.xml中的SQL語句的時(shí)候, 語句末尾不能使用 ; 結(jié)尾, 原因是在做分頁的時(shí)候會(huì)在編寫的SQL語句后面拼接上limit語句, 導(dǎo)致出現(xiàn)SQL語法錯(cuò)誤(SQLSyntaxErrorException). 如下所示:
JsqlParserCountOptimize sql=select * from `user`; ==> Preparing: SELECT COUNT(1) FROM `user` ==> Parameters: <== Columns: COUNT(1) <== Row: 9 ==> Preparing: select * from `user`; LIMIT ? ==> Parameters: 3(Long) org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIMIT 3' at line 1 ### The error may exist in org/wxmx/mybatis_plus_study/mapper/UserMapper.xml ### The error may involve defaultParameterMap ### The error occurred while setting parameters ### SQL: select * from `user`; LIMIT ? ### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIMIT 3' at line 1 ; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringBoot-MyBatis-plus實(shí)體類中常用的注解用法
- SpringBoot整合MyBatis和SpringBoot整合MyBatis-Plus教程
- SpringBoot+MyBatis-Plus進(jìn)行分頁查詢與優(yōu)化
- SpringBoot如何使用MyBatis-Plus實(shí)現(xiàn)高效的數(shù)據(jù)訪問層
- springboot集成Mybatis-plus-join-boot-start詳解
- SpringBoot整合Mybatis-plus關(guān)鍵詞模糊查詢結(jié)果為空
- SpringBoot+MyBatis-Plus+Velocity實(shí)現(xiàn)代碼自動(dòng)生成
相關(guān)文章
基于SpringBoot和Vue實(shí)現(xiàn)頭像上傳與回顯功能
在現(xiàn)代Web應(yīng)用中,用戶個(gè)性化體驗(yàn)尤為重要,其中頭像上傳與回顯是一個(gè)常見的功能需求,本文將詳細(xì)介紹如何使用Spring Boot和Vue.js構(gòu)建一個(gè)前后端協(xié)同工作的頭像上傳系統(tǒng),并實(shí)現(xiàn)圖片的即時(shí)回顯,需要的朋友可以參考下2024-08-08Spring Boot security 默認(rèn)攔截靜態(tài)資源的解決方法
這篇文章主要介紹了Spring Boot security 默認(rèn)攔截靜態(tài)資源,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03Springboot整合SpringSecurity的完整案例詳解
Spring Security是基于Spring生態(tài)圈的,用于提供安全訪問控制解決方案的框架,Spring Security登錄認(rèn)證主要涉及兩個(gè)重要的接口 UserDetailService和UserDetails接口,本文對Springboot整合SpringSecurity過程給大家介紹的非常詳細(xì),需要的朋友參考下吧2024-01-01解決spirngboot連接redis報(bào)錯(cuò):READONLY?You?can‘t?write?against?
docker部署的redis,springboot基本每天來連redis都報(bào)錯(cuò):READONLY?You?can't?write?against?a?read?only?replica,重啟redis后,可以正常連接。但是每天都重啟redis,不現(xiàn)實(shí),也很麻煩,今天給大家分享解決方式,感興趣的朋友一起看看吧2023-06-06解決RestTemplate 請求url中包含百分號 會(huì)被轉(zhuǎn)義成25的問題
這篇文章主要介紹了解決RestTemplate 請求url中包含百分號 會(huì)被轉(zhuǎn)義成25的問題,具有很好的參考價(jià)值,希望對大家有所幫助。2021-10-10Java任意長度byte數(shù)組轉(zhuǎn)換為int數(shù)組的方法
這篇文章主要給大家介紹了關(guān)于Java任意長度byte數(shù)組轉(zhuǎn)換為int數(shù)組的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07Java實(shí)現(xiàn)SMS短信通發(fā)送手機(jī)驗(yàn)證碼案例講解
這篇文章主要介紹了Java實(shí)現(xiàn)SMS短信通發(fā)送手機(jī)驗(yàn)證碼案例講解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08