spring+mybatis+log4j 输出SQL
1、在mybatis-config.xml配置中添加setting配置参数,会打印SQL执行结果
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><settings><!-- 打印查询语句 --><setting name="logImpl" value="STDOUT_LOGGING" /></settings> </configuration> 2、在spring-mybatis配置文件中添加配置参数
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="configLocation" value="classpath:mybatis-config.xml"></property><property name="mapperLocations" value="classpath:xxx/xxx/xxx/xxx/*.xml"></property> </bean> 备注: 之前通过log4j的配置文件方式来实现,没有成功!!!项目环境:ssm+shiro 第二种方式(通过拦截器的方式)1、在sqlSessionFactory 配置参数中,添加参数配置:
<property name="plugins"><list><bean class="xxx.MybatisInterceptor"></bean></list> </property>
2、mybatis sql拦截器类
package xxx;import java.text.DateFormat; import java.util.Date; import java.util.List; import java.util.Locale; import java.util.Properties;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.plugin.Interceptor; import org.apache.ibatis.plugin.Intercepts; import org.apache.ibatis.plugin.Invocation; import org.apache.ibatis.plugin.Plugin; import org.apache.ibatis.plugin.Signature; 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.apache.log4j.Logger;/*** @author Tim** 2019年4月24日* * mybatis sql 拦截器*/ @Intercepts({ @Signature(type = Executor.class, method = "update", args = { MappedStatement.class, Object.class }), @Signature(type = Executor.class, method = "query", args = { MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class }) }) public class MybatisInterceptor implements Interceptor {private static final Logger log = Logger.getLogger(MybatisInterceptor.class);@Overridepublic Object intercept(Invocation invocation) throws Throwable {MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0]; Object parameter = null; if (invocation.getArgs().length > 1) { parameter = invocation.getArgs()[1]; } BoundSql boundSql = mappedStatement.getBoundSql(parameter); Configuration configuration = mappedStatement.getConfiguration(); Object returnVal = invocation.proceed();//获取sql语句String sql = getSql(configuration, boundSql); log.info("#####拦截器获取SQL#### "+sql); //统计SQL执行时间 Object target = invocation.getTarget(); Object result = null; if (target instanceof Executor) { long start = System.currentTimeMillis();
Method method = invocation.getMethod();/**执行方法*/result = invocation.proceed();long end = System.currentTimeMillis();logger.info("[" + method.getName() + "] 耗时 [" + (end - start) + "] ms");} return returnVal;
}@Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}@Overridepublic void setProperties(Properties arg0) {}/*** 获取SQL* @param configuration* @param boundSql* @return*/private String getSql(Configuration configuration, BoundSql boundSql) {Object parameterObject = boundSql.getParameterObject(); List<ParameterMapping> parameterMappings = boundSql.getParameterMappings(); String sql = boundSql.getSql().replaceAll("[\\s]+", " "); if (parameterObject == null || parameterMappings.size() == 0) {return sql;} TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry(); if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) { sql = sql.replaceFirst("\\?", getParameterValue(parameterObject)); } else { MetaObject metaObject = configuration.newMetaObject(parameterObject); for (ParameterMapping parameterMapping : parameterMappings) { String propertyName = parameterMapping.getProperty(); if (metaObject.hasGetter(propertyName)) { Object obj = metaObject.getValue(propertyName); sql = sql.replaceFirst("\\?", getParameterValue(obj)); } else if (boundSql.hasAdditionalParameter(propertyName)) { Object obj = boundSql.getAdditionalParameter(propertyName); sql = sql.replaceFirst("\\?", getParameterValue(obj)); } } } return sql;}private String getParameterValue(Object obj) { String value = null; if (obj instanceof String) { value = "'" + obj.toString() + "'"; } else if (obj instanceof Date) { DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.CHINA); value = "'" + formatter.format(obj) + "'"; } else { if (obj != null) { value = obj.toString(); } else { value = ""; } } return value; } }
转载于:https://www.cnblogs.com/codechange/p/10718416.html
spring+mybatis+log4j 输出SQL相关推荐
- spring boot 整合mybatis 无法输出sql的问题
使用spring boot整合mybatis,测试功能的时候,遇到到了sql问题,想要从日志上看哪里错了,但是怎么都无法输出执行的sql,我使用的是log4j2,百度了一下,很多博客都说,加上下面的日 ...
- SSM中配置log4J输出sql语句
场景 在SSM整合时需要查看输出的sql语句以便排查错误信息. 实现 在项目的classpath(src目录)下或者resource包下(maven项目)新建一个log4j.properties文件. ...
- mybatis log4j打印sql
log4j.logger.p6spy=ERROR,STDOUT #log4j.logger.p6spy=DEBUG,STDOUT #log4j.logger.p6spy=DEBUG, SQLPROFI ...
- SSM中实现CRUD并配置输出sql语句
场景 前面SSM的项目整合以及分页等参照 https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/85120936 使用log4j输出sql ...
- MyBatis3 用log4j在控制台输出 SQL
方法一:使用标准日志输出 此方法比较简单,只需要配置 MyBatis 的配置文件 Configuration 中有相关属性即可,不用再放一个 log4j.properties 文件. [html] v ...
- mybatis结合log4j打印SQL日志
mybatis结合log4j打印SQL日志 1.Maven引用jar包 默认的mybatis不能打印出SQL日志,不便于查看调试,需要结合log4jdbc-log4j2就可以完整的输入SQL的调试信息 ...
- MyBatis使用log4j输出日志
MyBatis使用log4j输出日志 引入依赖 创建log4j.xml 引入依赖 在当前项目的pom.xml中引入log4j.xml的依赖. <!-- log4j日志 --><dep ...
- mybatis开启log_mybatis使用spring-druid数据源连接池配置log4j打印sql语句以及开启监控平台...
杂七杂的杂 作为程序员,开发工程中,一套利于测试或者监控的工具很重要,mybatis默认没有提供log4j的打印sql语句的配置. 这对于开发rest服务,提供接口的开发者而言,是在很不好做,再加上m ...
- Log4j控制台输出sql语句
1.引入log4j包 <!-- log4j --><dependency><groupId>log4j</groupId><artifactId& ...
- mybatis配置log4j打印sql日志
mybatis配置log4j打印sql日志 前提是你已经配置好了log4j. 在mybatis的配置文件中设置 <?xml version="1.0" encoding=&q ...
最新文章
- 【Python学习笔记】输入raw_input(),特殊情况下也可以用input()
- Pinyin4j中文字符和拼音之间的转换
- boost::hana::members用法的测试程序
- Can not find the tag library descriptor for http://java.sun.com/jsp/jstl/
- 操作word打印网址
- html中js定义的方法无效,javascript中定义函数有几种常用方法?
- Java9 jar兼容_java9新特性-6-多版本兼容jar包
- STM8单片机产生随机数
- HTML+CSS制作彩色波动
- YaoLingJump开发者日志(四)
- cobbler安装4个报错汇总及解决方法:ImportError
- atitit.身份认证解决方案attilax总结
- 海康rtsp抓包分析
- 计算机子网掩码在线,ip子网掩码计算器 子网掩码计算
- bom树形结构 表设计_按树型显示BOM的结构
- (2022年6月)注册ArcGIS Online(Learn ArcGIS) 21天免费账号笔记
- 产品之路第四年的再思考
- PhotoShop - 滤色模式(screen) 的 响应曲线(关于加镜头光晕的思考)
- 移动应用开发课堂总结
- 搭建ftp文件服务器