mybatis攔截器與分頁(yè)插件實(shí)例教程
mybatis介紹
攔截器的一個(gè)作用就是我們可以攔截某些方法的調(diào)用,我們可以選擇在這些被攔截的方法執(zhí)行前后加上某些邏輯,也可以在執(zhí)行這些被攔截的方法時(shí)執(zhí)行自己的邏輯而不再執(zhí)行被攔截的方法。
MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集。MyBatis 可以使用簡(jiǎn)單的 XML 或注解來(lái)配置和映射原生類型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 對(duì)象)為數(shù)據(jù)庫(kù)中的記錄。
mybatis架構(gòu)圖

我們這個(gè)demo實(shí)現(xiàn)就是基于mybatis的插件模塊(主要實(shí)現(xiàn)mybatis的Interceptor接口)
Interceptor接口
package org.apache.ibatis.plugin;
import java.util.Properties;
/**
* @author Clinton Begin
*/
public interface Interceptor {
Object intercept(Invocation invocation) throws Throwable;
Object plugin(Object target);
void setProperties(Properties properties);
}
demo實(shí)現(xiàn)
主要技術(shù) spring boot + mybatis
pom.xml
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
數(shù)據(jù)庫(kù) DDL
create table user ( id int auto_increment primary key, username varchar(20) null );
核心代碼
@Override
public Object intercept(Invocation invocation) throws Throwable {
logger.info("進(jìn)入攔截器");
Object[] args = invocation.getArgs();
MappedStatement mappedStatement = (MappedStatement) args[0];
//獲取參數(shù)
Object param = invocation.getArgs()[1];
BoundSql boundSql = mappedStatement.getBoundSql(param);
Object parameterObject = boundSql.getParameterObject();
/**
* 判斷是否是繼承PageVo來(lái)判斷是否需要進(jìn)行分頁(yè)
*/
if (parameterObject instanceof PageVo) {
//強(qiáng)轉(zhuǎn) 為了拿到分頁(yè)數(shù)據(jù)
PageVo pagevo = (PageVo) param;
String sql = boundSql.getSql();
//獲取相關(guān)配置
Configuration config = mappedStatement.getConfiguration();
Connection connection = config.getEnvironment().getDataSource().getConnection();
//拼接查詢當(dāng)前條件的sql的總條數(shù)
String countSql = "select count(*) from (" + sql + ") a";
PreparedStatement preparedStatement = connection.prepareStatement(countSql);
BoundSql countBoundSql = new BoundSql(config, countSql, boundSql.getParameterMappings(), boundSql.getParameterObject());
ParameterHandler parameterHandler = new DefaultParameterHandler(mappedStatement, parameterObject, countBoundSql);
parameterHandler.setParameters(preparedStatement);
//執(zhí)行獲得總條數(shù)
ResultSet rs = preparedStatement.executeQuery();
int count = 0;
if (rs.next()) {
count = rs.getInt(1);
}
//拼接分頁(yè)sql
String pageSql = sql + " limit " + pagevo.getLimit() + " , " + pagevo.getOffset();
//重新執(zhí)行新的sql
doNewSql(invocation, pageSql);
Object result = invocation.proceed();
connection.close();
//處理新的結(jié)構(gòu)
PageResult<?> pageResult = new PageResult<List>(pagevo.page, pagevo.rows, count, (List) result);
List<PageResult> returnResultList = new ArrayList<>();
returnResultList.add(pageResult);
return returnResultList;
}
return invocation.proceed();
}
測(cè)試結(jié)果

github地址:https://github.com/XINYANJIANG/mybaits-plugs (本地下載)
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
- mybatisplus 的SQL攔截器實(shí)現(xiàn)關(guān)聯(lián)查詢功能
- Mybatis自定義攔截器和插件開(kāi)發(fā)詳解
- mybatis 自定義實(shí)現(xiàn)攔截器插件Interceptor示例
- mybatis 通過(guò)攔截器打印完整的sql語(yǔ)句以及執(zhí)行結(jié)果操作
- Mybatis Plugin攔截器開(kāi)發(fā)過(guò)程詳解
- 簡(jiǎn)單了解mybatis攔截器實(shí)現(xiàn)原理及實(shí)例
- mybatis攔截器實(shí)現(xiàn)通用權(quán)限字段添加的方法
- Mybatis中攔截器的簡(jiǎn)單實(shí)現(xiàn)方法
- Mybatis Interceptor 攔截器的實(shí)現(xiàn)
- MyBatis攔截器實(shí)現(xiàn)分頁(yè)功能的實(shí)現(xiàn)方法
- MyBatis攔截器的原理與使用
相關(guān)文章
教你使用Java實(shí)現(xiàn)掃雷小游戲(最新完整版)
本文給大家介紹使用Java實(shí)現(xiàn)掃雷小游戲,本程序封裝了五個(gè)類,分別是主類GameWin類,繪制底層地圖和繪制頂層地圖的類MapBottom類和MapTop類,繪制底層數(shù)字的類BottomNum類,以及初始化地雷的BottomRay類和工具GameUtil類,用于存靜態(tài)參數(shù)和方法,感興趣的朋友一起看看吧2022-05-05
idea 2023.1字體設(shè)置及自動(dòng)調(diào)整大小的圖文教程
這篇文章主要介紹了idea 2023.1字體設(shè)置及自動(dòng)調(diào)整大小的教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07
tk.Mybatis 插入數(shù)據(jù)獲取Id問(wèn)題
本文主要介紹了tk.Mybatis 插入數(shù)據(jù)獲取Id問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
Java反射之通過(guò)反射獲取一個(gè)對(duì)象的方法信息(實(shí)例代碼)
下面小編就為大家?guī)?lái)一篇Java反射之通過(guò)反射獲取一個(gè)對(duì)象的方法信息(實(shí)例代碼)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10

