mybatis介紹
攔截器的一個作用就是我們可以攔截某些方法的調用,我們可以選擇在這些被攔截的方法執行前后加上某些邏輯,也可以在執行這些被攔截的方法時執行自己的邏輯而不再執行被攔截的方法。
MyBatis 是一款優秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生類型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 對象)為數據庫中的記錄。
mybatis架構圖
我們這個demo實現就是基于mybatis的插件模塊(主要實現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實現
主要技術 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>
數據庫 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]; //獲取參數 Object param = invocation.getArgs()[1]; BoundSql boundSql = mappedStatement.getBoundSql(param); Object parameterObject = boundSql.getParameterObject(); /** * 判斷是否是繼承PageVo來判斷是否需要進行分頁 */ if (parameterObject instanceof PageVo) { //強轉 為了拿到分頁數據 PageVo pagevo = (PageVo) param; String sql = boundSql.getSql(); //獲取相關配置 Configuration config = mappedStatement.getConfiguration(); Connection connection = config.getEnvironment().getDataSource().getConnection(); //拼接查詢當前條件的sql的總條數 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); //執行獲得總條數 ResultSet rs = preparedStatement.executeQuery(); int count = 0; if (rs.next()) { count = rs.getInt(1); } //拼接分頁sql String pageSql = sql + " limit " + pagevo.getLimit() + " , " + pagevo.getOffset(); //重新執行新的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 (本地下載)
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。