sql的日志输出还是比较有必要的,后期可以做日志管理,做可视化日志的查看。
下面是query,update的示例。如果需要监听其他类型的,只需要再添加update方法即可(因为主要业务的增删改基本由update来掌控了)
使用前请导入Mybatis相关依赖即可。
Intercepts的拦截位置主要看你需要做什么,这里的话拦截StatmentHandler是因为如果再往下的话就方法就到了excute方法了,所有得在doquery或者update之前就进行拦截。
SQLPlugin.java
@Intercepts(
@Signature(
type = StatementHandler.class,//指定拦截器增强的内置对象的类型
method = "query",//指定内置对象中的方法
args = {Statement.class, ResultHandler.class}//指定方法中的行参列表
),
@Signature(
type = StatementHandler.class,//指定拦截器增强的内置对象的类型
method = "update",//指定内置对象中的方法
args = {Statement.class}//指定方法中的行参列表
)
)
@Slf4j
public class SQLPlugin implements Interceptor {
@Override
/**
* 核心的拦截方法,拦截那个内置对象中的哪个方法
* @param invocation
* @return
* @throws Throwable
*/
@Override
public Object intercept(Invocation invocation) throws Throwable {
// 记录当前执行的sql语句 & 记录sql语句执行的耗时
// 获取拦截的目标对象,因为拦截的就是StatementHandler
StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
// 获取sql语句,还要格式化一下才能正常输出
String sql = statementHandler.getBoundSql().getSql().toLowerCase().replaceAll("\n","").replaceAll(" ","");
log.info("[SQL - EXEC] 执行的sql语句:{}", sql);
// 查询记录耗时
long begin = System.currentTimeMillis();
// 执行sql - 放行
Object result = invocation.proceed();
long end = System.currentTimeMillis();
// 这里需要格式化一下
log.info("[SQL - EXEC] SQL的耗时: {}s", BigDecimal.valueOf(end).subtract(BigDecimal.valueOf(begin)).divide(BigDecimal.valueOf(1000).setScale(6, RoundingMode.DOWN)) );
// 要返回
return result;
}
}
MySQLAutoConfiguration.java
public class MySQLAutoConfiguration {
//注册MyBatis插件
@Bean
//havingValue为true的时候才启动,matchIfMissing如果没找到对应配置就默认关闭
@ConditionalOnProperty(name = "*.plugin.sql.enable", havingValue = "true", matchIfMissing = false)
public SQLPlugin getSQLPlugin() {
return new SQLPlugin();
}
}
这个的Configuration文件主要是方便我们使用的时候在yml或者properties等文件中可以有提示。
SQLPluginConfiguration.java
@Data
@ConfigurationProperties(prefix = "pbshop.plugin.sql")
public class SQLPluginConfiguration {
private boolean enable;
}
如果成功配置的情况下是可以在编译文件中产生下面这个文件的。
截屏2022-07-04 下午2.31.53.png
里面是这样的
截屏2022-07-04 下午2.32.57.png
然后再看一下目录,大概是这样
截屏2022-07-04 下午2.35.43.png
最后再配置一下yml或者properties文件来控制它是否启用
截屏2022-07-04 下午2.36.52.png
基本操作都做完了,就结束啦。
网友评论