mybatis使用拦截器显示sql,使用druid配置连接信息

mybatis
sql
Druid

1、显示出sql内容:

新建2个类:
MybatisInterceptor ;拦截sql,并获得输出sql内容

package com.cpp.core.filter;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.cpp.core.common.utils.SQLFormatter;@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 Logger logger = LoggerFactory.getLogger(MybatisInterceptor.class);private Properties properties;public Object intercept(Invocation invocation) throws Throwable {MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];Object parameter = null;if (invocation.getArgs().length > 1) {parameter = invocation.getArgs()[1];}String sqlId = mappedStatement.getId();BoundSql boundSql = mappedStatement.getBoundSql(parameter);Configuration configuration = mappedStatement.getConfiguration();Object returnValue = null;long start = System.currentTimeMillis();returnValue = invocation.proceed();long end = System.currentTimeMillis();long time = (end - start);if (time > 1) {String sql = getSql(configuration, boundSql, sqlId, time);logger.info("调用的java方法为:\n "+sql.split(":")[0]);logger.info("查询sql语句为:\n"+SQLFormatter.format(sql.split(":")[1])  +"\n"+"sql语句执行的时间:"+time+"\n\n");}return returnValue;}public static String getSql(Configuration configuration, BoundSql boundSql, String sqlId, long time) {String sql = showSql(configuration, boundSql);StringBuilder str = new StringBuilder(100);str.append(sqlId);str.append(":");str.append(sql);str.append(":");str.append(time);str.append("ms");return str.toString();}private static 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(new Date()) + "'";} else {if (obj != null) {value = obj.toString();} else {value = "";}}return value;}public static String showSql(Configuration configuration, BoundSql boundSql) {Object parameterObject = boundSql.getParameterObject();List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();String sql = boundSql.getSql().replaceAll("[\\s]+", " ");if (parameterMappings.size() > 0 && parameterObject != null) {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;}public Object plugin(Object target) {return Plugin.wrap(target, this);}public void setProperties(Properties properties0) {this.properties = properties0;}
}

2、在新建sql格式化工具,格式化sql语句

package com.cpp.core.filter;
import java.util.Properties;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
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.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
@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 SqlStatementInterceptor implements Interceptor{private Properties properties;@Overridepublic Object intercept(Invocation invocation) throws Throwable {System.out.println("test");return invocation.proceed();}@Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}@Overridepublic void setProperties(Properties properties0) {this.properties = properties0;}
}

3、在spring的配置文件中添加

 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 --><property name="typeAliasesPackage" value="com.cpp.core" /><!-- 显式指定Mapper文件位置 --><property name="mapperLocations" value="classpath:/mybatis/*/*Mapper.xml" /><property name="plugins"><array><ref bean="paginationInterceptor"/><ref bean="sqlStatementInterceptor"/></array></property><property name="configurationProperties"><props><prop key="dialect">mysql</prop></props></property></bean>

配置插件

 <ref bean="sqlStatementInterceptor"/>

配置注入的内容

 <bean id="sqlStatementInterceptor" class="com.cpp.core.filter.MybatisInterceptor"></bean>

2、如果使用的是Druid来连接的数据库


在web.xml文件中添加下面的信息

 <servlet><servlet-name>DruidStatView</servlet-name><servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class></servlet><servlet-mapping><servlet-name>DruidStatView</servlet-name><url-pattern>/druid/*</url-pattern></servlet-mapping>

可以通过web的访问的形式进行访问页面:输入:
http://dev.eop.zhc360.com:8080/cpp-middleman-api/druid/sql.html
就可以查看到输出的sql语句了

转载于:https://www.cnblogs.com/babyhhcsy/p/4497172.html

mybatis使用拦截器显示sql,使用druid配置连接信息相关推荐

  1. Mybatis 通过拦截器动态修改SQL

    01 使用场景 当我们在多租户的项目中,编写SQL语句都要带上tenant字段,用于区分不同的租户只能操作自己的数据. 比如,像下面的SQL select * from member where id ...

  2. 一步步教你mybatis分页,mybatis分页拦截器 使用,mybatis拦截器分页

              mybatis 分页详解.mybatis分页查询,mybatis分页拦截器使用.struts2下mybatis分页 mybatis默认是支持分页的,内部通过创建可滚动的Result ...

  3. 如何使用Mybatis的拦截器实现数据加密与解密

    点击蓝色"程序猿DD"关注我哟 加个"星标",不忘签到哦 转载自公众号:日拱一兵 关注我,回复口令获取可获取独家整理的学习资料: - 001 :领取<Sp ...

  4. Mybatis Interceptor 拦截器原理 源码分析

    Mybatis采用责任链模式,通过动态代理组织多个拦截器(插件),通过这些拦截器可以改变Mybatis的默认行为(诸如SQL重写之类的),由于插件会深入到Mybatis的核心,因此在编写自己的插件前最 ...

  5. mybatis 自定义拦截器

    拦截器注解 mybatis自定义拦截器实现步骤: 实现org.apache.ibatis.plugin.Interceptor接口. 添加拦截器注解org.apache.ibatis.plugin.I ...

  6. Mybatis拦截器修改sql语句

    拦截器介绍 MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能. MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用.默认情况下,MyBatis 允许 ...

  7. mybatis redis_基于人事年假管理的系统springboot+mybatis+redis+拦截器

    那么分享一个项目案例篇吧! 需求是:假设有一个部门表,一个员工表,一个年假表, 员工表里: 部门表: 休假表: 管理员表     项目原型: 效果图: 管理员登录: 登录成功回调: 进入后台首页,这里 ...

  8. 超级详细!!!SpringBoot2核心技术与响应式编程尚硅谷完整知识点笔记 下篇 自动配置、容器、Web、数据响应、拦截器、SQL、NOSQL、原理、Junit5、Actuator、外部化配置等

    所有配套资料已上传到QQ群:167356412  需要的话群文件自取 06.数据访问 1.SQL 1.数据源的自动配置-HikariDataSource 1.导入JDBC场景 <dependen ...

  9. Mybatis分页拦截器

    这个拦截器比较复杂,是通过判断传入的参数有page对象就认定它是需要分页的. 1.首先,自定义一个分页拦截器 package com.jd.controller.interceptor;import ...

最新文章

  1. C++中一些你不知道的冷知识
  2. PostgreSQL的xlog实验一
  3. python的优点-Python语言的优势有哪些?
  4. Java多态-如何理解父类引用指向子类对象
  5. python学习-练习题9*9乘法表巩固
  6. LeTax如何多行注释
  7. 高性能网站建设之 MS Sql Server数据库分区
  8. Eigen入门之密集矩阵 8 - resharp slicing切片
  9. 深度解析大型分布式电商网站演变过程以及构架部署解决方案
  10. unset MAILCHECK
  11. volatile是Java提供的一种轻量级的同步机制
  12. plupload与springmvc分段上传视频
  13. linux添加一块硬盘分区,centos6中添加一块新的硬盘并分区的方法介绍
  14. js配置打印机属性_你还在为如何设置打印机而烦恼吗?一招教你快速共享打印机!...
  15. 极客大学架构师训练营 数据结构与算法 平衡二叉树 红黑树 动态规划 遗传算法 第15课 听课总结
  16. android静态库动态库,Android 动态库和静态库
  17. 在虚拟机上搭建中标麒麟Neokylin6桌面版开发环境
  18. jfinal,jxl导出excel遇到的异常
  19. DC-DC升压变换器 直流隔离 高压稳压输出 电源模块
  20. jsp+ssm计算机毕业设计短视频文案创作平台系统【附源码】

热门文章

  1. TensorFlow tf.squeeze
  2. docker 配置ssh
  3. 信息安全完全参考手册之安全设计原则(第四章)
  4. 通过options探测服务器信息,WEB服务器启用了OPTIONS方法
  5. Exchange Server 2016 独立部署/共存部署 (四)—— 配置DAG(上)
  6. 阿里云各个地域节点速度测试(测试点到阿里云各站点)
  7. Java基础学习总结(129)——Arrays.asList得到的List进行add和remove等操作出现异常解析
  8. 全国中小学生计算机竞赛试题,全国中小学电脑制作活动
  9. redis 命令别名_redis 命令、命令行根据前缀(通配符)批量删除redis存储的key
  10. linux 建立伪目标过程,linux之Makefile 编写、规则、伪目标、变量