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
提供的插件都將基于此接口來實(shí)現(xiàn)功能,目前已有的功能如下:
- 自動分頁:
PaginationInnerInterceptor
- 多租戶:
TenantLineInnerInterceptor
- 動態(tài)表名:
DynamicTableNameInnerInterceptor
- 樂觀鎖:
OptimisticLockerInnerInterceptor
- sql性能規(guī)范:
IllegalSQLInnerInterceptor
- 防止全表更新與刪除:
BlockAttackInnerInterceptor
【注意】使用多個功能需要注意順序關(guān)系,建議使用如下順序:
- 多租戶
- 動態(tài)表名
- 分頁,樂觀鎖
sql
性能規(guī)范,防止全表更新與刪除
總結(jié):對sql
進(jìn)行單次改造的優(yōu)先放入,不對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(); } }
測試運(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 簡述Page類
簡單分頁模型, 有如下幾個主要屬性
/** * 查詢數(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. 注意事項
3.1 UncategorizedSQLException異常
在編寫mapper.xml
中的SQL
語句時,或者使用@select
注解編寫SQL
語句時,語句末尾不能使用 ;
結(jié)尾,原因是在做分頁的時候會在編寫的SQL
語句后面拼接上limit
語句, 導(dǎo)致出現(xiàn)SQL
語法錯誤(UncategorizedSQLException
)。
可以參考我的這篇博文:全網(wǎng)最詳細(xì)的org.springframework.jdbc.UncategorizedSQLException的多種解決方法
3.2 不做記錄總數(shù)的統(tǒng)計
new Page(queryParam.getCurrent(), queryParam.getSize())
的兩個參數(shù)表示:當(dāng)前頁和每頁數(shù)量
如果業(yè)務(wù)需求只需要查詢分頁做上下頁切換而不需要記錄總數(shù),可以設(shè)置第三個參數(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Mybatis-Plus 多表聯(lián)查分頁的實(shí)現(xiàn)代碼
- Mybatis-plus新版本分頁失效PaginationInterceptor過時的問題
- 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í)現(xiàn)方法
- 解決mybatis-plus3.4.1分頁插件PaginationInterceptor和防止全表更新與刪除插件SqlExplainInterceptor過時失效問題
- 一文搞懂Mybatis-plus的分頁查詢操作
- MyBatis-Plus 分頁插件配置的兩種方式實(shí)現(xiàn)
相關(guān)文章
java判斷遠(yuǎn)程服務(wù)器上的文件是否存在的方法
java判斷遠(yuǎn)程服務(wù)器上的文件是否存在的方法,需要的朋友可以參考一下2013-03-03Springboot獲取前端反饋信息并存入數(shù)據(jù)庫的實(shí)現(xiàn)代碼
這篇文章主要介紹了Springboot獲取前端反饋信息并存入數(shù)據(jù)庫的實(shí)現(xiàn)代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03Spring?Boot超大文件上傳實(shí)現(xiàn)秒傳功能
這篇文章主要介紹了Spring?Boot超大文件上傳實(shí)現(xiàn)秒傳功能,在實(shí)現(xiàn)分片上傳的過程,需要前端和后端配合,比如前后端的上傳塊號的文件大小,前后端必須得要一致,否則上傳就會有問題,需要的朋友可以參考下2022-12-12SpringCloud OpenFeign與Ribbon客戶端配置詳解
在springcloud中,openfeign是取代了feign作為負(fù)載均衡組件的,feign最早是netflix提供的,他是一個輕量級的支持RESTful的http服務(wù)調(diào)用框架,內(nèi)置了ribbon,而ribbon可以提供負(fù)載均衡機(jī)制,因此feign可以作為一個負(fù)載均衡的遠(yuǎn)程服務(wù)調(diào)用框架使用2022-11-11Java8新特性Lambda表達(dá)式的一些復(fù)雜用法總結(jié)
lambda表達(dá)式是JAVA8中提供的一種新的特性,它支持Java也能進(jìn)行簡單的“函數(shù)式編程”。 下面這篇文章主要給大家介紹了關(guān)于Java8新特性Lambda表達(dá)式的一些復(fù)雜用法的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-07-07Java解除文件占用即Dom4j操作后實(shí)現(xiàn)xml關(guān)流
這篇文章主要介紹了Java解除文件占用即Dom4j操作后實(shí)現(xiàn)xml關(guān)流,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04