Mybatis-Plus中分頁(yè)插件PaginationInterceptor的使用
1. 描述
1.1 MybatisPlusInterceptor
我們?cè)陂_(kāi)發(fā)的過(guò)程中,經(jīng)常會(huì)遇到分頁(yè)操作,其分為邏輯分頁(yè)和物理分頁(yè),具體可參考我的博文:邏輯分頁(yè)和物理分頁(yè)
如果你用的是Mybatis-Plus
框架,可用MybatisPlusInterceptor
按如下配置分頁(yè)代碼:
/** * @author 念兮為美 * @datetime 2022/11/28 14:10 * @desc mybatis plus 配置類 */ @Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 設(shè)置為使用 MYSQL 方言 interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }
如果你用的是低版本
的spring boot
,可用PaginationInterceptor
按如下配置:
/** * @author 念兮為美 * @datetime 2022/11/27 15:22 * @desc mybatis plus 配置類 */ @Configuration public class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } }
MybatisPlusInterceptor
插件是核心插件,目前代理了Executor#query、Executor#update、StatementHandler#prepare
方法,其屬性:
private List<InnerInterceptor> interceptors = new ArrayList<>();
1.2 InnerInterceptor
注意List<InnerInterceptor>
泛型中的InnerInterceptor
,mybatis-plus
提供的插件都將基于此接口來(lái)實(shí)現(xiàn)功能,目前已有的功能如下:
- 自動(dòng)分頁(yè):
PaginationInnerInterceptor
- 多租戶:
TenantLineInnerInterceptor
- 動(dòng)態(tài)表名:
DynamicTableNameInnerInterceptor
- 樂(lè)觀鎖:
OptimisticLockerInnerInterceptor
- sql性能規(guī)范:
IllegalSQLInnerInterceptor
- 防止全表更新與刪除:
BlockAttackInnerInterceptor
【注意】使用多個(gè)功能需要注意順序關(guān)系,建議使用如下順序:
- 多租戶
- 動(dòng)態(tài)表名
- 分頁(yè),樂(lè)觀鎖
sql
性能規(guī)范,防止全表更新與刪除
總結(jié):對(duì)sql
進(jìn)行單次改造的優(yōu)先放入,不對(duì)sql
進(jìn)行改造的最后放入。
2. 實(shí)現(xiàn)
2.1 不帶條件的分頁(yè)查詢
編寫(xiě)查詢展示類
/** * @author 念兮為美 * @datetime 2023/2/2 09:58 * @desc 用戶查詢結(jié)果 */ @NoArgsConstructor @Data @ApiModel(description = "用戶返回結(jié)果") public class UserPageVo { @ApiModelProperty(name = "username", value = "用戶名") private String username; @ApiModelProperty(name = "nickname", value = "昵稱") private String nickname; @ApiModelProperty(name = "userType", value = "用戶類型") private String userType; }
編寫(xiě)mapper
類
@Mapper public interface UserMapper extends BaseMapper<User> { @Select("select " + "username,nickname,user_type as userType " + "from " + "user " + "order by " + "create_time desc" ) List<UserPageVo> findPageUsers(Page<UserPageVo> page); }
編寫(xiě)service
類
@Service public class UserService extends ServiceImpl<UserMapper, User> { @Resource private UserMapper userMapper; public Page<UserPageVo> findPageUsers() { Long currentPage = 4L; Long pageSize = 3L; Page<UserPageVo> page = new Page<>(currentPage, pageSize); List<UserPageVo> pageUsers = userMapper.findPageUsers(page); page.setRecords(pageUsers); return page; } }
編寫(xiě)controller
類
@Api(tags = "用戶模塊") @RestController @RequestMapping("/user") @Slf4j @Validated public class UserController { @Autowired private UserService userService; @ApiOperationSupport(author = "念兮為美") @ApiOperation(value = "用戶查詢接口") @GetMapping("/findPageUsers") public Page<UserPageVo> findPageUsers() { return userService.findPageUsers(); } }
測(cè)試運(yùn)行結(jié)果
JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@2ce7d43] will not be managed by Spring ==> Preparing: SELECT COUNT(*) AS total FROM user ==> Parameters: <== Columns: total <== Row: 24 <== Total: 1 ==> Preparing: select username,nickname,user_type as userType from user order by create_time desc LIMIT ?,? ==> Parameters: 9(Long), 3(Long) <== Columns: username, nickname, userType <== Row: cs, null, admin <== Row: lin, null, admin <== Row: test3, null, TEST4 <== Total: 3
2.2 帶條件的分頁(yè)查詢
public class UserService extends ServiceImpl<UserMapper, User> { @Resource private UserMapper userMapper; public Page<User> findPageUsers() { Long currentPage = 1L; Long pageSize = 3L; Page<User> page = new Page<>(currentPage, pageSize); QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("username", "test5"); Page<User> userPage = userMapper.selectPage(page, queryWrapper); return userPage; }
運(yùn)行結(jié)果:
JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@475454ae] will not be managed by Spring ==> Preparing: SELECT COUNT(*) AS total FROM user WHERE deleted = false AND (username = ?) ==> Parameters: test2(String) <== Columns: total <== Row: 1 <== Total: 1 ==> Preparing: SELECT username,nickname,user_type FROM user WHERE deleted=false AND (username = ?) LIMIT ? ==> Parameters: test2(String), 3(Long) <== Columns: username, nickname, user_type <== Row: test2, null,TEST6 <== Total: 1
2.3 簡(jiǎn)述Page類
簡(jiǎn)單分頁(yè)模型, 有如下幾個(gè)主要屬性
/** * 查詢數(shù)據(jù)列表 */ protected List<T> records = Collections.emptyList(); /** * 總數(shù) */ protected long total = 0; /** * 每頁(yè)顯示條數(shù),默認(rèn) 10 */ protected long size = 10; /** * 當(dāng)前頁(yè) */ protected long current = 1;
3. 注意事項(xiàng)
3.1 UncategorizedSQLException異常
在編寫(xiě)mapper.xml
中的SQL
語(yǔ)句時(shí),或者使用@select
注解編寫(xiě)SQL
語(yǔ)句時(shí),語(yǔ)句末尾不能使用 ;
結(jié)尾,原因是在做分頁(yè)的時(shí)候會(huì)在編寫(xiě)的SQL
語(yǔ)句后面拼接上limit
語(yǔ)句, 導(dǎo)致出現(xiàn)SQL
語(yǔ)法錯(cuò)誤(UncategorizedSQLException
)。
可以參考我的這篇博文:全網(wǎng)最詳細(xì)的org.springframework.jdbc.UncategorizedSQLException的多種解決方法
3.2 不做記錄總數(shù)的統(tǒng)計(jì)
new Page(queryParam.getCurrent(), queryParam.getSize())
的兩個(gè)參數(shù)表示:當(dāng)前頁(yè)和每頁(yè)數(shù)量
如果業(yè)務(wù)需求只需要查詢分頁(yè)做上下頁(yè)切換而不需要記錄總數(shù),可以設(shè)置第三個(gè)參數(shù)false
就可以不查詢count()
,以提高性能,即new Page(queryParam.getCurrent(), queryParam.getSize(), false)
,如下代碼所示:
/** * @author 念兮為美 * @datetime 2022/11/28 14:20 * @desc 用戶服務(wù)實(shí)現(xiàn)類 */ @Service public class UserService extends ServiceImpl<UserMapper, User> { @Resource private UserMapper userMapper; public Page<UserPageVo> findPageUsers() { Long currentPage = 4L; Long pageSize = 3L; Page<UserPageVo> page = new Page<>(currentPage, pageSize, false); List<UserPageVo> pageUsers = userMapper.findPageUsers(page); page.setRecords(pageUsers); return page; }
從輸出結(jié)果看,既沒(méi)有count
操作,如下所示:
JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@466c39de] will not be managed by Spring ==> Preparing: select username,nickname,user_type as userType from user order by create_time desc LIMIT ?,? ==> Parameters: 9(Long), 3(Long) <== Columns: username, nickname, userType <== Row: cs, null, admin <== Row: lin, null, admin <== Row: test3, null, TEST4 <== Total: 3
到此這篇關(guān)于Mybatis-Plus中分頁(yè)插件PaginationInterceptor的使用的文章就介紹到這了,更多相關(guān)Mybatis-Plus PaginationInterceptor 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Mybatis-Plus 多表聯(lián)查分頁(yè)的實(shí)現(xiàn)代碼
- Mybatis-plus新版本分頁(yè)失效PaginationInterceptor過(guò)時(shí)的問(wèn)題
- MyBatis-Plus 分頁(yè)查詢以及自定義sql分頁(yè)的實(shí)現(xiàn)
- mybatis-plus分頁(yè)傳入?yún)?shù)后sql where條件沒(méi)有l(wèi)imit分頁(yè)信息操作
- mybatis-plus分頁(yè)查詢的實(shí)現(xiàn)示例
- MyBatis-Plus分頁(yè)插件不生效的解決方法
- MyBatis-Plus實(shí)現(xiàn)2種分頁(yè)方法(QueryWrapper查詢分頁(yè)和SQL查詢分頁(yè))
- MyBatis-Plus分頁(yè)時(shí)排序的實(shí)現(xiàn)方法
- 解決mybatis-plus3.4.1分頁(yè)插件PaginationInterceptor和防止全表更新與刪除插件SqlExplainInterceptor過(guò)時(shí)失效問(wèn)題
- 一文搞懂Mybatis-plus的分頁(yè)查詢操作
- MyBatis-Plus 分頁(yè)插件配置的兩種方式實(shí)現(xiàn)
相關(guān)文章
java判斷遠(yuǎn)程服務(wù)器上的文件是否存在的方法
java判斷遠(yuǎn)程服務(wù)器上的文件是否存在的方法,需要的朋友可以參考一下2013-03-03Springboot獲取前端反饋信息并存入數(shù)據(jù)庫(kù)的實(shí)現(xiàn)代碼
這篇文章主要介紹了Springboot獲取前端反饋信息并存入數(shù)據(jù)庫(kù)的實(shí)現(xiàn)代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03Spring?Boot超大文件上傳實(shí)現(xiàn)秒傳功能
這篇文章主要介紹了Spring?Boot超大文件上傳實(shí)現(xiàn)秒傳功能,在實(shí)現(xiàn)分片上傳的過(guò)程,需要前端和后端配合,比如前后端的上傳塊號(hào)的文件大小,前后端必須得要一致,否則上傳就會(huì)有問(wèn)題,需要的朋友可以參考下2022-12-12SpringCloud OpenFeign與Ribbon客戶端配置詳解
在springcloud中,openfeign是取代了feign作為負(fù)載均衡組件的,feign最早是netflix提供的,他是一個(gè)輕量級(jí)的支持RESTful的http服務(wù)調(diào)用框架,內(nèi)置了ribbon,而ribbon可以提供負(fù)載均衡機(jī)制,因此feign可以作為一個(gè)負(fù)載均衡的遠(yuǎn)程服務(wù)調(diào)用框架使用2022-11-11Java編程long數(shù)據(jù)類型的使用問(wèn)題
這篇文章主要介紹了Java編程數(shù)據(jù)類型long的使用問(wèn)題,涉及長(zhǎng)整型數(shù)據(jù)的取值范圍和不同整數(shù)類型的表示方法,需要的朋友可以參考下2017-09-09Java8新特性Lambda表達(dá)式的一些復(fù)雜用法總結(jié)
lambda表達(dá)式是JAVA8中提供的一種新的特性,它支持Java也能進(jìn)行簡(jiǎn)單的“函數(shù)式編程”。 下面這篇文章主要給大家介紹了關(guān)于Java8新特性Lambda表達(dá)式的一些復(fù)雜用法的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-07-07Java解除文件占用即Dom4j操作后實(shí)現(xiàn)xml關(guān)流
這篇文章主要介紹了Java解除文件占用即Dom4j操作后實(shí)現(xiàn)xml關(guān)流,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04