Mybatis-Plus中分頁(yè)插件PaginationInterceptor的使用
1. 描述
1.1 MybatisPlusInterceptor
我們?cè)陂_發(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è)查詢
編寫查詢展示類
/**
* @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;
}編寫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);
}編寫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;
}
}編寫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異常
在編寫mapper.xml中的SQL語(yǔ)句時(shí),或者使用@select注解編寫SQL語(yǔ)句時(shí),語(yǔ)句末尾不能使用 ; 結(jié)尾,原因是在做分頁(yè)的時(shí)候會(huì)在編寫的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-03
Springboot獲取前端反饋信息并存入數(shù)據(jù)庫(kù)的實(shí)現(xiàn)代碼
這篇文章主要介紹了Springboot獲取前端反饋信息并存入數(shù)據(jù)庫(kù)的實(shí)現(xiàn)代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
Spring?Boot超大文件上傳實(shí)現(xiàn)秒傳功能
這篇文章主要介紹了Spring?Boot超大文件上傳實(shí)現(xiàn)秒傳功能,在實(shí)現(xiàn)分片上傳的過(guò)程,需要前端和后端配合,比如前后端的上傳塊號(hào)的文件大小,前后端必須得要一致,否則上傳就會(huì)有問(wèn)題,需要的朋友可以參考下2022-12-12
SpringCloud 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-11
Java編程long數(shù)據(jù)類型的使用問(wèn)題
這篇文章主要介紹了Java編程數(shù)據(jù)類型long的使用問(wèn)題,涉及長(zhǎng)整型數(shù)據(jù)的取值范圍和不同整數(shù)類型的表示方法,需要的朋友可以參考下2017-09-09
Java8新特性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-07
Java解除文件占用即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

