Mybatis-Plus中分頁插件PaginationInterceptor的使用
1. 描述
1.1 MybatisPlusInterceptor
我們在開發(fā)的過程中,經(jīng)常會遇到分頁操作,其分為邏輯分頁和物理分頁,具體可參考我的博文:邏輯分頁和物理分頁
如果你用的是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提供的插件都將基于此接口來實現(xiàn)功能,目前已有的功能如下:
- 自動分頁:
PaginationInnerInterceptor - 多租戶:
TenantLineInnerInterceptor - 動態(tài)表名:
DynamicTableNameInnerInterceptor - 樂觀鎖:
OptimisticLockerInnerInterceptor - sql性能規(guī)范:
IllegalSQLInnerInterceptor - 防止全表更新與刪除:
BlockAttackInnerInterceptor
【注意】使用多個功能需要注意順序關(guān)系,建議使用如下順序:
- 多租戶
- 動態(tài)表名
- 分頁,樂觀鎖
sql性能規(guī)范,防止全表更新與刪除
總結(jié):對sql進行單次改造的優(yōu)先放入,不對sql進行改造的最后放入。
2. 實現(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();
}
}測試運行結(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;
}運行結(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 簡述Page類
簡單分頁模型, 有如下幾個主要屬性
/** * 查詢數(shù)據(jù)列表 */ protected List<T> records = Collections.emptyList(); /** * 總數(shù) */ protected long total = 0; /** * 每頁顯示條數(shù),默認 10 */ protected long size = 10; /** * 當前頁 */ protected long current = 1;
3. 注意事項
3.1 UncategorizedSQLException異常
在編寫mapper.xml中的SQL語句時,或者使用@select注解編寫SQL語句時,語句末尾不能使用 ; 結(jié)尾,原因是在做分頁的時候會在編寫的SQL語句后面拼接上limit語句, 導(dǎo)致出現(xiàn)SQL語法錯誤(UncategorizedSQLException)。
可以參考我的這篇博文:全網(wǎng)最詳細的org.springframework.jdbc.UncategorizedSQLException的多種解決方法
3.2 不做記錄總數(shù)的統(tǒng)計
new Page(queryParam.getCurrent(), queryParam.getSize())的兩個參數(shù)表示:當前頁和每頁數(shù)量
如果業(yè)務(wù)需求只需要查詢分頁做上下頁切換而不需要記錄總數(shù),可以設(shè)置第三個參數(shù)false就可以不查詢count(),以提高性能,即new Page(queryParam.getCurrent(), queryParam.getSize(), false) ,如下代碼所示:
/**
* @author 念兮為美
* @datetime 2022/11/28 14:20
* @desc 用戶服務(wù)實現(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Mybatis-Plus 多表聯(lián)查分頁的實現(xiàn)代碼
- Mybatis-plus新版本分頁失效PaginationInterceptor過時的問題
- MyBatis-Plus 分頁查詢以及自定義sql分頁的實現(xiàn)
- mybatis-plus分頁傳入?yún)?shù)后sql where條件沒有l(wèi)imit分頁信息操作
- mybatis-plus分頁查詢的實現(xiàn)示例
- MyBatis-Plus分頁插件不生效的解決方法
- MyBatis-Plus實現(xiàn)2種分頁方法(QueryWrapper查詢分頁和SQL查詢分頁)
- MyBatis-Plus分頁時排序的實現(xiàn)方法
- 解決mybatis-plus3.4.1分頁插件PaginationInterceptor和防止全表更新與刪除插件SqlExplainInterceptor過時失效問題
- 一文搞懂Mybatis-plus的分頁查詢操作
- MyBatis-Plus 分頁插件配置的兩種方式實現(xiàn)
相關(guān)文章
Java編程數(shù)組中最大子矩陣簡便解法實現(xiàn)代碼
這篇文章主要介紹了Java編程數(shù)組中最大子矩陣簡便解法實現(xiàn)代碼,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-01-01
Caused by: java.lang.ClassNotFoundException: org.objectweb.a
這篇文章主要介紹了Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type異常,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07
淺析final,finally,finalize 的區(qū)別
以下是對final,finally,finalize的區(qū)別進行了詳細的分析介紹,需要的朋友可以過來參考下2013-09-09
淺談java中異步多線程超時導(dǎo)致的服務(wù)異常
下面小編就為大家?guī)硪黄獪\談java中異步多線程超時導(dǎo)致的服務(wù)異常。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-06-06
解決mybatisplus插入報錯argument type mismatch的問題
這篇文章主要介紹了解決mybatisplus插入報錯argument type mismatch的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11

