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)配置和映射原生類(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è)類(lèi),分別是主類(lèi)GameWin類(lèi),繪制底層地圖和繪制頂層地圖的類(lèi)MapBottom類(lèi)和MapTop類(lèi),繪制底層數(shù)字的類(lèi)BottomNum類(lèi),以及初始化地雷的BottomRay類(lèi)和工具GameUtil類(lèi),用于存靜態(tài)參數(shù)和方法,感興趣的朋友一起看看吧2022-05-05idea 2023.1字體設(shè)置及自動(dòng)調(diào)整大小的圖文教程
這篇文章主要介紹了idea 2023.1字體設(shè)置及自動(dòng)調(diào)整大小的教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07tk.Mybatis 插入數(shù)據(jù)獲取Id問(wèn)題
本文主要介紹了tk.Mybatis 插入數(shù)據(jù)獲取Id問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12Java反射之通過(guò)反射獲取一個(gè)對(duì)象的方法信息(實(shí)例代碼)
下面小編就為大家?guī)?lái)一篇Java反射之通過(guò)反射獲取一個(gè)對(duì)象的方法信息(實(shí)例代碼)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10