目錄
廣而告之
背景
先看成品
實(shí)現(xiàn)步驟
第一步,實(shí)現(xiàn)Interceptor接口
?編輯
第二步,給攔截器指定要攔截的方法簽名
第三步,實(shí)現(xiàn)攔截器的intercept方法。
第四步,在mybatis-config.xml里配置上這個(gè)攔截器插件
第五步,禁用mybatis打印日志
廣而告之
給大家推薦一個(gè)好用的在線工具網(wǎng)站:
常用工具|無憂在線工具
如果我們在學(xué)習(xí)工作過程中,需要用到時(shí)間戳與日期的互轉(zhuǎn),或JSON在線編輯、格式化、校驗(yàn)JSON格式等功能,建議首選這個(gè)常用工具|無憂在線工具。
這個(gè)網(wǎng)站有極簡風(fēng)格的頁面,它的時(shí)間戳轉(zhuǎn)換器,可以智能解析多種常見的日期格式。例如“1949-10-01”或“1949/10-01”,原樣復(fù)制到輸入框就可以智能解析。
它下方的JSON編輯器,支持JSON格式、JSON壓縮、JSON在線編輯,校驗(yàn)JSON格式等功能。
并且有折疊功能,非常強(qiáng)大。
推薦使用:常用工具|無憂在線工具
背景
MyBatis可以通過xml或注解配置sql模版,程序運(yùn)行過程中我們可以把參數(shù)填充到sql模版里再執(zhí)行,十分方便。
但是實(shí)際生產(chǎn)過程中我們通常會(huì)有兩個(gè)訴求:
- 記錄填充完參數(shù)后,真正執(zhí)行的sql語句
- 自動(dòng)記錄sql執(zhí)行結(jié)果
可以借助MyBatis攔截器實(shí)現(xiàn)這一訴求。
先看成品
效果:
攔截器代碼:
package org.example.learn.filter;
import com.alibaba.fastjson.JSONObject;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.session.ResultHandler;
import java.sql.Statement;
import java.util.Properties;
@Intercepts({
@Signature(type = StatementHandler.class, method = "update", args = {Statement.class}),
@Signature(type = StatementHandler.class, method = "query", args = {Statement.class, ResultHandler.class})
})
public class InterceptorDome implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
Statement statement = (Statement) invocation.getArgs()[0];
System.out.println("-------------------------------");
System.out.println("sql:"+statement.toString().substring(statement.toString().indexOf(":")+1));
Object result =invocation.proceed();
System.out.println("-------------------------------");
System.out.println("result:"+ JSONObject.toJSONString(result));
return result;
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
}
}
插件配置:?
<plugins>
<plugin interceptor="org.example.learn.filter.InterceptorDome">
<property name="test" value="test"/>
</plugin>
</plugins>
禁用mybatis打印日志:
springboot項(xiàng)目中,在application.properties文件中添加配置:
mybatis.configuration.log-impl=org.apache.ibatis.logging.nologging.NoLoggingImpl
如果不禁用mybatis打印日志,statement.toString()輸出的就是:org.apache.ibatis.logging.jdbc.PreparedStatementLogger@xxx文章來源地址http://www.zghlxwxcb.cn/news/detail-424796.html
實(shí)現(xiàn)步驟
第一步,實(shí)現(xiàn)Interceptor接口
Interceptor接口是mybatis用來實(shí)現(xiàn)插件功能的攔截器接口,他有三個(gè)方法,
先看setProperties方法,在xml中配置插件時(shí),用<property>標(biāo)簽配置的參數(shù)會(huì)存儲(chǔ)在setProperties方法的參Properties里,可以通過參數(shù)來改變攔截器的行為。
?然后看plugin方法,這個(gè)方法的參數(shù)target就是要攔截的對象,該方法的實(shí)現(xiàn)很簡單,固定用“return Plugin.wrap(target, this)”實(shí)現(xiàn)即可。
最后一個(gè)方法intercept,是我們主要關(guān)注的攔截方法。后面會(huì)講這個(gè)方法怎么實(shí)現(xiàn)。
第二步,給攔截器指定要攔截的方法簽名
回顧java方法簽名有哪幾個(gè)要素:方法所在的類、方法名、方法參數(shù)的順序和類型。
按上圖中的方式,用@Intercepts注解和@Signature屬性來指定好要攔截的方法簽名就可以了??梢灾付ǘ鄠€(gè)方法簽名。
攔截器可以被攔截方法都在這四個(gè)接口里:StatementHandler、Executor、ResultSetHandler、ParameterHandler。
這里只講兩個(gè)方法:StatementHandler.update和StatementHandler.update
int update(Statement var1)方法會(huì)在所有的 INSERT UPDATE DELET 執(zhí)行時(shí)被調(diào)用,因此如果想要攔截這類操作,可以攔截該方法。
<E> List<E> query(Statement var1, ResultHandler var2)方法會(huì)在SELECT 查詢方法執(zhí)行時(shí)被調(diào)用。
攔截了這兩個(gè)方法就攔截了日常工作中大部分被執(zhí)行的sql?。
第三步,實(shí)現(xiàn)攔截器的intercept方法。
?invocation.getArgs()方法可以獲取被攔截方法的參數(shù)數(shù)組,由方法簽名可知,我們要攔截的兩個(gè)方法的第一個(gè)參數(shù)都是Statement,所以獲取參數(shù)數(shù)組第一個(gè)元素后,可以直接強(qiáng)轉(zhuǎn)為Statement類型。
此時(shí)的Statement已經(jīng)將sql模版與參數(shù)組裝好了,直接調(diào)用statement.toString()方法就能得到真正執(zhí)行的sql。
調(diào)用invocation.proceed()方法會(huì)就會(huì)執(zhí)行被攔截的方法,該方法的返回就是sql執(zhí)行結(jié)果,轉(zhuǎn)換為json字符串打印出來就可以了。
第四步,在mybatis-config.xml里配置上這個(gè)攔截器插件
第五步,禁用mybatis打印日志
springboot項(xiàng)目中,在application.properties文件中添加配置:
mybatis.configuration.log-impl=org.apache.ibatis.logging.nologging.NoLoggingImpl
我沒有找到上面的配置在xml的寫法吧,讀者自行研究一下吧文章來源:http://www.zghlxwxcb.cn/news/detail-424796.html
如果不禁用mybatis打印日志,statement.toString()輸出的就是:org.apache.ibatis.logging.jdbc.PreparedStatementLogger@xxx
到了這里,關(guān)于MyBatis攔截器-打印出真正執(zhí)行的sql語句和執(zhí)行結(jié)果的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!