Mybatis-Plus中分頁插件PaginationInterceptor的使用
1. 描述
1.1 MybatisPlusInterceptor
我們?cè)陂_發(fā)的過程中,經(jīng)常會(huì)遇到分頁操作,其分為邏輯分頁和物理分頁,具體可參考我的博文:邏輯分頁和物理分頁
如果你用的是Mybatis-Plus框架,可用MybatisPlusInterceptor按如下配置分頁代碼:
/**
* @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提供的插件都將基于此接口來實(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é):對(duì)sql進(jìn)行單次改造的優(yōu)先放入,不對(duì)sql進(jìn)行改造的最后放入。
2. 實(shí)現(xiàn)
2.1 不帶條件的分頁查詢
編寫查詢展示類
/**
* @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 帶條件的分頁查詢
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)單分頁模型, 有如下幾個(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;
3. 注意事項(xiàng)
3.1 UncategorizedSQLException異常
在編寫mapper.xml中的SQL語句時(shí),或者使用@select注解編寫SQL語句時(shí),語句末尾不能使用 ; 結(jié)尾,原因是在做分頁的時(shí)候會(huì)在編寫的SQL語句后面拼接上limit語句, 導(dǎo)致出現(xiàn)SQL語法錯(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)前頁和每頁數(shù)量
如果業(yè)務(wù)需求只需要查詢分頁做上下頁切換而不需要記錄總數(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é)果看,既沒有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中分頁插件PaginationInterceptor的使用的文章就介紹到這了,更多相關(guān)Mybatis-Plus PaginationInterceptor 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Mybatis-Plus 多表聯(lián)查分頁的實(shí)現(xiàn)代碼
- Mybatis-plus新版本分頁失效PaginationInterceptor過時(shí)的問題
- MyBatis-Plus 分頁查詢以及自定義sql分頁的實(shí)現(xiàn)
- mybatis-plus分頁傳入?yún)?shù)后sql where條件沒有l(wèi)imit分頁信息操作
- mybatis-plus分頁查詢的實(shí)現(xiàn)示例
- MyBatis-Plus分頁插件不生效的解決方法
- MyBatis-Plus實(shí)現(xiàn)2種分頁方法(QueryWrapper查詢分頁和SQL查詢分頁)
- MyBatis-Plus分頁時(shí)排序的實(shí)現(xiàn)方法
- 解決mybatis-plus3.4.1分頁插件PaginationInterceptor和防止全表更新與刪除插件SqlExplainInterceptor過時(shí)失效問題
- 一文搞懂Mybatis-plus的分頁查詢操作
- MyBatis-Plus 分頁插件配置的兩種方式實(shí)現(xiàn)
相關(guān)文章
java判斷遠(yuǎn)程服務(wù)器上的文件是否存在的方法
java判斷遠(yuǎn)程服務(wù)器上的文件是否存在的方法,需要的朋友可以參考一下2013-03-03
Springboot獲取前端反饋信息并存入數(shù)據(jù)庫的實(shí)現(xiàn)代碼
這篇文章主要介紹了Springboot獲取前端反饋信息并存入數(shù)據(jù)庫的實(shí)現(xiàn)代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
Spring?Boot超大文件上傳實(shí)現(xiàn)秒傳功能
這篇文章主要介紹了Spring?Boot超大文件上傳實(shí)現(xiàn)秒傳功能,在實(shí)現(xiàn)分片上傳的過程,需要前端和后端配合,比如前后端的上傳塊號(hào)的文件大小,前后端必須得要一致,否則上傳就會(huì)有問題,需要的朋友可以參考下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
Java8新特性Lambda表達(dá)式的一些復(fù)雜用法總結(jié)
lambda表達(dá)式是JAVA8中提供的一種新的特性,它支持Java也能進(jìn)行簡(jiǎn)單的“函數(shù)式編程”。 下面這篇文章主要給大家介紹了關(guān)于Java8新特性Lambda表達(dá)式的一些復(fù)雜用法的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-07-07
Java解除文件占用即Dom4j操作后實(shí)現(xiàn)xml關(guān)流
這篇文章主要介紹了Java解除文件占用即Dom4j操作后實(shí)現(xiàn)xml關(guān)流,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04

