SpringBoot使用Mybatis-Plus中分頁插件PaginationInterceptor詳解
1 配置分頁插件
@Configuration
public class MybatisConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
在高版本的SpringBoot中, 會提示這種寫法已過時, 所以采用另一種寫法 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
- 我們提供的插件都將基于此接口來實現(xiàn)功能 目前已有的功能: 自動分頁: PaginationInnerInterceptor 多租戶:
- TenantLineInnerInterceptor 動態(tài)表名: DynamicTableNameInnerInterceptor 樂觀鎖:
- OptimisticLockerInnerInterceptor sql性能規(guī)范: IllegalSQLInnerInterceptor
- 防止全表更新與刪除: BlockAttackInnerInterceptor 注意: 使用多個功能需要注意順序關系,建議使用如下順序 多租戶
- 動態(tài)表名 分頁,樂觀鎖 sql性能規(guī)范,防止全表更新與刪除 總結: 對sql進行單次改造的優(yōu)先放入,不對sql進行改造的最后放入
2 編寫Mapper及其對應的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);
}
}
運行結果:
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);
}
運行結果:
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
簡單分頁模型, 有如下幾個主要屬性
/** * 查詢數(shù)據列表 */ protected List<T> records = Collections.emptyList(); /** * 總數(shù) */ protected long total = 0; /** * 每頁顯示條數(shù),默認 10 */ protected long size = 10; /** * 當前頁 */ protected long current = 1;
4 注意事項
在編寫mapper.xml中的SQL語句的時候, 語句末尾不能使用 ; 結尾, 原因是在做分頁的時候會在編寫的SQL語句后面拼接上limit語句, 導致出現(xiàn)SQL語法錯誤(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
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- 深入解析Spring MVC中攔截器Interceptor的實現(xiàn)原理和應用場景
- Spring?Boot?Interceptor的原理、配置、順序控制及與Filter的關鍵區(qū)別對比分析
- Spring Boot攔截器Interceptor與過濾器Filter深度解析(區(qū)別、實現(xiàn)與實戰(zhàn)指南)
- Spring Mvc中攔截器Interceptor用法解讀
- Spring Boot攔截器Interceptor與過濾器Filter詳細教程(示例詳解)
- Spring攔截器之HandlerInterceptor使用方式
- Spring的攔截器HandlerInterceptor詳解
- SpringMVC的處理器攔截器HandlerInterceptor詳解
- spring中Interceptor的使用小結
相關文章
SpringBoot+Kotlin中使用GRPC實現(xiàn)服務通信的示例代碼
本文主要介紹了SpringBoot+Kotlin中使用GRPC實現(xiàn)服務通信的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-07-07
Fluent MyBatis實現(xiàn)動態(tài)SQL
MyBatis 令人喜歡的一大特性就是動態(tài) SQL。本文主要介紹了Fluent MyBatis實現(xiàn)動態(tài)SQL,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08

