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

我們這個demo實現(xiàn)就是基于mybatis的插件模塊(主要實現(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實現(xiàn)
主要技術 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ù)庫 DDL
create table user ( id int auto_increment primary key, username varchar(20) null );
核心代碼
@Override
public Object intercept(Invocation invocation) throws Throwable {
logger.info("進入攔截器");
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來判斷是否需要進行分頁
*/
if (parameterObject instanceof PageVo) {
//強轉 為了拿到分頁數(shù)據(jù)
PageVo pagevo = (PageVo) param;
String sql = boundSql.getSql();
//獲取相關配置
Configuration config = mappedStatement.getConfiguration();
Connection connection = config.getEnvironment().getDataSource().getConnection();
//拼接查詢當前條件的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);
}
//拼接分頁sql
String pageSql = sql + " limit " + pagevo.getLimit() + " , " + pagevo.getOffset();
//重新執(zhí)行新的sql
doNewSql(invocation, pageSql);
Object result = invocation.proceed();
connection.close();
//處理新的結構
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();
}
測試結果

github地址:https://github.com/XINYANJIANG/mybaits-plugs (本地下載)
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。
- mybatisplus 的SQL攔截器實現(xiàn)關聯(lián)查詢功能
- Mybatis自定義攔截器和插件開發(fā)詳解
- mybatis 自定義實現(xiàn)攔截器插件Interceptor示例
- mybatis 通過攔截器打印完整的sql語句以及執(zhí)行結果操作
- Mybatis Plugin攔截器開發(fā)過程詳解
- 簡單了解mybatis攔截器實現(xiàn)原理及實例
- mybatis攔截器實現(xiàn)通用權限字段添加的方法
- Mybatis中攔截器的簡單實現(xiàn)方法
- Mybatis Interceptor 攔截器的實現(xiàn)
- MyBatis攔截器實現(xiàn)分頁功能的實現(xiàn)方法
- MyBatis攔截器的原理與使用
相關文章
tk.Mybatis 插入數(shù)據(jù)獲取Id問題
本文主要介紹了tk.Mybatis 插入數(shù)據(jù)獲取Id問題,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12

