2019独角兽企业重金招聘Python工程师标准>>>

注:可以拦截sql 执行时间,优化sql。并打印sql 以及参数

第一步:创建类:

SqlPrintInterceptor 并实现 Interceptor

该类如下:

package com.ra.common.plugin;import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.ParameterMapping;
import org.apache.ibatis.mapping.ParameterMode;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.type.TypeHandlerRegistry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.regex.Matcher;
/**  MyBatis 将mybatis要执行的sql拦截打印出来*/
@Intercepts({@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}),@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
public class SqlPrintInterceptor implements Interceptor{private static final Logger log = LoggerFactory.getLogger(SqlPrintInterceptor.class);private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");@Overridepublic Object intercept(Invocation invocation) throws Throwable {MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];Object parameterObject = null;if (invocation.getArgs().length > 1) {parameterObject = invocation.getArgs()[1];}long start = System.currentTimeMillis();Object result = invocation.proceed();String statementId = mappedStatement.getId();BoundSql boundSql = mappedStatement.getBoundSql(parameterObject);Configuration configuration = mappedStatement.getConfiguration();String sql = getSql(boundSql, parameterObject, configuration);long end = System.currentTimeMillis();long timing = end - start;//根据个人喜好看需要打印怎么sql,本人是打印打印  1s的if(log.isInfoEnabled() && timing>1000){log.info("执行sql耗时:" + timing + " ms" + " - id:" + statementId + " - Sql:" );log.info("   "+sql);}return result;}@Overridepublic Object plugin(Object target) {if (target instanceof Executor) {return Plugin.wrap(target, this);}return target;}@Overridepublic void setProperties(Properties properties) {}private String getSql(BoundSql boundSql, Object parameterObject, Configuration configuration) {String sql = boundSql.getSql().replaceAll("[\\s]+", " ");List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();if (parameterMappings != null) {for (int i = 0; i < parameterMappings.size(); i++) {ParameterMapping parameterMapping = parameterMappings.get(i);if (parameterMapping.getMode() != ParameterMode.OUT) {Object value;String propertyName = parameterMapping.getProperty();if (boundSql.hasAdditionalParameter(propertyName)) {value = boundSql.getAdditionalParameter(propertyName);} else if (parameterObject == null) {value = null;} else if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {value = parameterObject;} else {MetaObject metaObject = configuration.newMetaObject(parameterObject);value = metaObject.getValue(propertyName);}sql = replacePlaceholder(sql, value);}}}return sql;}private String replacePlaceholder(String sql, Object propertyValue) {String result;if (propertyValue != null) {if (propertyValue instanceof String) {result = "'" + propertyValue + "'";} else if (propertyValue instanceof Date) {result = "'" + DATE_FORMAT.format(propertyValue) + "'";} else {result = propertyValue.toString();}} else {result = "null";}return sql.replaceFirst("\\?", Matcher.quoteReplacement(result));}
}

第二步:在mybatis-config.xml 文件加上

<plugins><!--监控 sql 埋点 分页--><plugin interceptor="com.ra.common.plugin.SqlPrintInterceptor"></plugin>
</plugins>

转载于:https://my.oschina.net/huangguangsheng/blog/2987847

Mybatis 实现SQL拦截并在控制台打印SQL和参数相关推荐

  1. Mybatis 开启控制台打印sql语句

    概述 springboot+mybatis整合过程中,开启控制台sql语句打印的多种方式: 方法1 在springboot+mybatis整合中,可以将springboot的配置文件添加如下一段也可: ...

  2. mybatis-plus配置控制台打印完整带参数SQL语句

    问题背景 通常我们开发的时候,需要联合控制台和Navicat/PLSQL等工具进行语句的拼接检查,如果只是输出了一堆???,那么将极大降低我们的效率.因此我们需要输出完整的SQL语句以便调试. Upd ...

  3. mybatis-plus控制台打印SQL

    方法一.在application.yml添加配置 #mybatis-plus配置控制台打印完整带参数SQL语句 mybatis-plus:configuration:log-impl: org.apa ...

  4. 配置activiti控制台打印SQL

    配置activiti控制台打印SQL bootstrap.yml配置 #开启Activiti打印日志 logging:level:org.activiti.engine.impl.persistenc ...

  5. 在控制台打印sql语句的办法(MyBatis Log Plugin插件的安装与使用)

    MyBatis Log Plugin插件的安装与使用 在使用Mybatis开发项目时,由于避免出现SQL注入,大部分情况下都是使用#{}占位符的方式传参.如果SQL比较复杂,参数又很多的话,要通过日志 ...

  6. mybatis控制台打印sql

    方案1: 网上说的比较多的,之前也是这么用的一种方式  1:首先将ibatis log4j运行级别调到DEBUG可以在控制台打印出ibatis运行的sql语句  2:添加如下语句 ###显示SQL语句 ...

  7. mybatis在控制台打印sql语句

    1:mybatis-config.xml中配置: <?xml version="1.0" encoding="UTF-8"?> <!DOCTY ...

  8. springboot整合mybatisplus在控制台打印sql的两种方式

    ①.在application.yml文件中新增 logging:level:com.study.testSSMPlus.mapper: debug#mapper接口的存放目录 ②.使用springbo ...

  9. springboot +mybatisPlu控制台打印sql

    # 控制打印sql mybatis-plus:mapper-locations: classpath:com.shijie.box.db.dao/*.xmlconfiguration:log-impl ...

最新文章

  1. golang中的栈帧
  2. 1/2 pymysql:Python连接MySQL数据库
  3. winform直接控制云台_速学指南,2分钟学会Feiyu pocket口袋云台的隐藏功能操作
  4. JavaScript函数调用规则
  5. wms策略文档_内容策略:技术文档的新理念
  6. explode php 正则,php用preg_replace和explode将li列表分割成纯文本数组
  7. Linux内存调试工具初探-MEMWATCH
  8. pooling 与 步长大于1的卷积
  9. Android-蓝牙AVRCP功能实现【转】
  10. 暨南大学人文社科a类期刊_暨南大学人文社会科学重要期刊目录分类
  11. excel 某个单元格不是等于空值_EXCEL中IF函数中怎么表达某一个单元格不等于空白则返回值1.4...
  12. jpg格式图片怎样压缩?电脑如何压缩jpg图片?
  13. “您未被授权查看该页,您不具备使用所提供的凭据查看该目录或
  14. driver其他常用的方法
  15. 示例程序009--阙值化(二值化,cvThreshold)
  16. 如何在当前文件夹打开命令行窗口
  17. hadoop进入退出安全模式
  18. 多传感器融合定位GNSS、IMU、Lidar、Camera
  19. 《拥抱机器人时代——Servo杂志中文精华合集》——4.5 审视无线技术
  20. python爬取地图地址_网络爬虫-python爬取高德地图地点

热门文章

  1. Lua直接调用动态链接库(DLL或so文件)
  2. android官方架构room,Android 官方架构组件介绍之 Room(翻译)
  3. 作业三——原型化系统——外卖app
  4. jQuery ajax的traditional参数的作用
  5. 一种在MVC3框架里面设置模板页的方法,不使用_ViewStart
  6. HTML5开发手机应用--viewport的作用--20150216
  7. 【原创】iframe与父页面之间,变量、方法互相调用
  8. xss实例-输出在script/script之间的情况
  9. AJAX面试题:一个页面实现增删改查(ASP.NET实现)
  10. 新版数采仪问题解决全记录-升级失败问题