Mybatis 实现SQL拦截并在控制台打印SQL和参数
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和参数相关推荐
- Mybatis 开启控制台打印sql语句
概述 springboot+mybatis整合过程中,开启控制台sql语句打印的多种方式: 方法1 在springboot+mybatis整合中,可以将springboot的配置文件添加如下一段也可: ...
- mybatis-plus配置控制台打印完整带参数SQL语句
问题背景 通常我们开发的时候,需要联合控制台和Navicat/PLSQL等工具进行语句的拼接检查,如果只是输出了一堆???,那么将极大降低我们的效率.因此我们需要输出完整的SQL语句以便调试. Upd ...
- mybatis-plus控制台打印SQL
方法一.在application.yml添加配置 #mybatis-plus配置控制台打印完整带参数SQL语句 mybatis-plus:configuration:log-impl: org.apa ...
- 配置activiti控制台打印SQL
配置activiti控制台打印SQL bootstrap.yml配置 #开启Activiti打印日志 logging:level:org.activiti.engine.impl.persistenc ...
- 在控制台打印sql语句的办法(MyBatis Log Plugin插件的安装与使用)
MyBatis Log Plugin插件的安装与使用 在使用Mybatis开发项目时,由于避免出现SQL注入,大部分情况下都是使用#{}占位符的方式传参.如果SQL比较复杂,参数又很多的话,要通过日志 ...
- mybatis控制台打印sql
方案1: 网上说的比较多的,之前也是这么用的一种方式 1:首先将ibatis log4j运行级别调到DEBUG可以在控制台打印出ibatis运行的sql语句 2:添加如下语句 ###显示SQL语句 ...
- mybatis在控制台打印sql语句
1:mybatis-config.xml中配置: <?xml version="1.0" encoding="UTF-8"?> <!DOCTY ...
- springboot整合mybatisplus在控制台打印sql的两种方式
①.在application.yml文件中新增 logging:level:com.study.testSSMPlus.mapper: debug#mapper接口的存放目录 ②.使用springbo ...
- springboot +mybatisPlu控制台打印sql
# 控制打印sql mybatis-plus:mapper-locations: classpath:com.shijie.box.db.dao/*.xmlconfiguration:log-impl ...
最新文章
- golang中的栈帧
- 1/2 pymysql:Python连接MySQL数据库
- winform直接控制云台_速学指南,2分钟学会Feiyu pocket口袋云台的隐藏功能操作
- JavaScript函数调用规则
- wms策略文档_内容策略:技术文档的新理念
- explode php 正则,php用preg_replace和explode将li列表分割成纯文本数组
- Linux内存调试工具初探-MEMWATCH
- pooling 与 步长大于1的卷积
- Android-蓝牙AVRCP功能实现【转】
- 暨南大学人文社科a类期刊_暨南大学人文社会科学重要期刊目录分类
- excel 某个单元格不是等于空值_EXCEL中IF函数中怎么表达某一个单元格不等于空白则返回值1.4...
- jpg格式图片怎样压缩?电脑如何压缩jpg图片?
- “您未被授权查看该页,您不具备使用所提供的凭据查看该目录或
- driver其他常用的方法
- 示例程序009--阙值化(二值化,cvThreshold)
- 如何在当前文件夹打开命令行窗口
- hadoop进入退出安全模式
- 多传感器融合定位GNSS、IMU、Lidar、Camera
- 《拥抱机器人时代——Servo杂志中文精华合集》——4.5 审视无线技术
- python爬取地图地址_网络爬虫-python爬取高德地图地点
热门文章
- Lua直接调用动态链接库(DLL或so文件)
- android官方架构room,Android 官方架构组件介绍之 Room(翻译)
- 作业三——原型化系统——外卖app
- jQuery ajax的traditional参数的作用
- 一种在MVC3框架里面设置模板页的方法,不使用_ViewStart
- HTML5开发手机应用--viewport的作用--20150216
- 【原创】iframe与父页面之间,变量、方法互相调用
- xss实例-输出在script/script之间的情况
- AJAX面试题:一个页面实现增删改查(ASP.NET实现)
- 新版数采仪问题解决全记录-升级失败问题