代码:

  1. package com.chainup.exchange.service.adapter;
  2.  
  3. import com.chainup.exchange.service.impl.AccountServiceImpl;
  4. import org.apache.ibatis.executor.Executor;
  5. import org.apache.ibatis.mapping.BoundSql;
  6. import org.apache.ibatis.mapping.MappedStatement;
  7. import org.apache.ibatis.mapping.ParameterMapping;
  8. import org.apache.ibatis.plugin.*;
  9. import org.apache.ibatis.reflection.MetaObject;
  10. import org.apache.ibatis.session.Configuration;
  11. import org.apache.ibatis.session.ResultHandler;
  12. import org.apache.ibatis.session.RowBounds;
  13. import org.apache.ibatis.type.TypeHandlerRegistry;
  14. import org.slf4j.Logger;
  15. import org.slf4j.LoggerFactory;
  16.  
  17. import java.text.DateFormat;
  18. import java.util.Date;
  19. import java.util.List;
  20. import java.util.Locale;
  21. import java.util.Properties;
  22.  
  23. @Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
  24. public class AccountInterceptor implements Interceptor {
  25. private Properties properties;
  26.  
  27. private static final Logger logger = LoggerFactory.getLogger(AccountInterceptor.class);
  28.  
  29. @Override
  30. public Object intercept(Invocation invocation) throws Throwable {
  31. MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
  32. Object parameter = null;
  33. if (invocation.getArgs().length > 1) {
  34. parameter = invocation.getArgs()[1];
  35. }
  36. String sqlId = mappedStatement.getId();
  37. BoundSql boundSql = mappedStatement.getBoundSql(parameter);
  38. Configuration configuration = mappedStatement.getConfiguration();
  39. Object returnValue = null;
  40. long start = System.currentTimeMillis();
  41. returnValue = invocation.proceed();
  42. long end = System.currentTimeMillis();
  43. long time = (end - start);
  44. if (time > 1) {
  45. String sql = getSql(configuration, boundSql, sqlId, time);
  46. logger.info("拦截器打印sql语句:{}", sql);
  47. }
  48. return returnValue;
  49. }
  50.  
  51. @Override
  52. public Object plugin(Object target) {
  53. return Plugin.wrap(target, this);
  54. }
  55.  
  56. @Override
  57. public void setProperties(Properties properties) {
  58. this.properties = properties;
  59. }
  60.  
  61. public static String getSql(Configuration configuration, BoundSql boundSql, String sqlId, long time) {
  62. String sql = showSql(configuration, boundSql);
  63. StringBuilder str = new StringBuilder(100);
  64. str.append(sqlId);
  65. str.append(":");
  66. str.append(sql);
  67. str.append(">>>>>>");
  68. str.append(time);
  69. str.append("ms");
  70. return str.toString();
  71. }
  72.  
  73. private static String getParameterValue(Object obj) {
  74. String value = null;
  75. if (obj instanceof String) {
  76. value = "'" + obj.toString() + "'";
  77. } else if (obj instanceof Date) {
  78. DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.CHINA);
  79. value = "'" + formatter.format(new Date()) + "'";
  80. } else {
  81. if (obj != null) {
  82. value = obj.toString();
  83. } else {
  84. value = "";
  85. }
  86.  
  87. }
  88. return value;
  89. }
  90.  
  91. public static String showSql(Configuration configuration, BoundSql boundSql) {
  92. Object parameterObject = boundSql.getParameterObject();
  93. List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
  94. String sql = boundSql.getSql().replaceAll("[\\s]+", " ");
  95. if (parameterMappings.size() > 0 && parameterObject != null) {
  96. TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();
  97. if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {
  98. sql = sql.replaceFirst("\\?", getParameterValue(parameterObject));
  99.  
  100. } else {
  101. MetaObject metaObject = configuration.newMetaObject(parameterObject);
  102. for (ParameterMapping parameterMapping : parameterMappings) {
  103. String propertyName = parameterMapping.getProperty();
  104. if (metaObject.hasGetter(propertyName)) {
  105. Object obj = metaObject.getValue(propertyName);
  106. sql = sql.replaceFirst("\\?", getParameterValue(obj));
  107. } else if (boundSql.hasAdditionalParameter(propertyName)) {
  108. Object obj = boundSql.getAdditionalParameter(propertyName);
  109. sql = sql.replaceFirst("\\?", getParameterValue(obj));
  110. }
  111. }
  112. }
  113. }
  114. return sql;
  115. }
  116. }

mybatis-config.xml 配置

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
  3. <configuration>
  4. <typeAliases>
  5.  
  6. </typeAliases>
  7. <plugins>
  8. <plugin interceptor="com.chainup.exchange.service.adapter.AccountInterceptor"></plugin>
  9. </plugins>
  10. </configuration>

spring-mvc Mybatis插件打印SQL的更多相关文章

  1. MyBatis 插件 : 打印 SQL 及其执行时间

    Plugins 摘一段来自MyBatis官方文档的文字. MyBatis允许你在某一点拦截已映射语句执行的调用.默认情况下,MyBatis允许使用插件来拦截方法调用: Executor(update. ...

  2. 基于Spring + Spring MVC + Mybatis + shiro 高性能web构建

    一直想写这篇文章,前段时间 痴迷于JavaScript.NodeJs.AngularJS,做了大量的研究,对前后端交互有了更深层次的认识. 今天抽个时间写这篇文章,我有预感,这将是一篇很详细的文章,详 ...

  3. [转]基于Spring + Spring MVC + Mybatis 高性能web构建

    http://blog.csdn.net/zoutongyuan/article/details/41379851/ 一直想写这篇文章,前段时间 痴迷于JavaScript.NodeJs.Angula ...

  4. Spring+Spring MVC+MyBatis

    Spring+Spring MVC+MyBatis 目录 一.新建一个基于Maven的Web项目 二.创建数据库与表 三.添加依赖包 四.新建POJO实体层 五.新建MyBatis SQL映射层 六. ...

  5. 基于Spring + Spring MVC + Mybatis 高性能web构建

    基于Spring + Spring MVC + Mybatis 高性能web构建 一直想写这篇文章,前段时间 痴迷于JavaScript.NodeJs.AngularJs,做了大量的研究,对前后端交互 ...

  6. ssm整合说明与模板-Spring Spring MVC Mybatis整合开发

    ssm整合说明 spring+spring mvc+mybatis 说明 源码下载 由于之前存在ssh框架,spring+struts+hibernate,其中spring负责aop与ioc,所以一般 ...

  7. Spring MVC 学习总结(十)——Spring+Spring MVC+MyBatis框架集成(IntelliJ IDEA SSM集成)

    与SSH(Struts/Spring/Hibernate/)一样,Spring+SpringMVC+MyBatis也有一个简称SSM,Spring实现业务对象管理,Spring MVC负责请求的转发和 ...

  8. 基于Spring+Spring MVC+Mybatis的B2C购物网站

    代码地址如下:http://www.demodashi.com/demo/12935.html 准备工作 当前项目运行的系统环境是MacOS,已经测试可以正常运行,并且之前开发的时候也在Windows ...

  9. spring Mvc + Mybatis 中使用junit

    在Spring Mvc + Mybatis的项目中我们有时候需要在测试代码中注入Dao操作数据库,对表进行增删改查,实现如下: 这是一般的maven项目项目结构 测试代码一般写在src/test/ja ...

随机推荐

  1. 个人作业-week2(代码复审)

    一.代码复审check list 概要部分 代码符合需求和规格说明吗? 符合要求和规格说明,-s指令和-c指令都能实现需求.并且能够处理非法输入. 代码设计是否有周全的考虑? 程序的main函数中对各 ...

  2. date format 参数表

    format 必需.规定输出日期字符串的格式.可使用下列字符: d - 一个月中的第几天(从 01 到 31) D - 星期几的文本表示(用三个字母表示) j - 一个月中的第几天,不带前导零(1 到 ...

  3. Qt之美(一):d指针/p指针详解(解释二进制兼容,以及没有D指针就会崩溃的例子。有了D指针,所使用的对象大小永远不会改变,它就是该指针的大小。这个指针就被称作D指针)good

    Translated  by  mznewfacer   2011.11.16 首先,看了Xizhi Zhu 的这篇Qt之美(一):D指针/私有实现,对于很多批评不美的同路人,暂且不去评论,只是想支持 ...

  4. OneZero第二周第一次站立会议(2016.3.28)

    会议时间:2016年3月28日 会议成员:冉华,张敏,王巍,夏一鸣. 会议目的:分配第二周任务. 会议内容:由于老师要求4月1日进行Alpha发布,我们决定最优先完成消息录入功能.工作具体分配如下 1 ...

  5. angular 调用element的 onfocus onkeydown onblur等事件

    项目里要实现一个input验证通过就切换到下一个input的功能 当然用jq dom操作很简单  ,大家都懂,现在用 angular,mvc 数据模型控制分离,不想再dom操作怎么办 以下方法 < ...

  6. 用JavaScript添加选择按钮的背景颜色和juqery添加选择按钮的背景色

    在项目开发中经常遇到要选择的按钮,选择完之后被选择的按钮的背景色会发生变化,表示被选择 样式图如下: 每点击一个数字,相应的背景色变为蓝色,其他的依旧是白色,先用JavaScript实现 html代码 ...

  7. springMVC 访问静态资源

    问题描述 使用SpringMVC时遇到静态资源无法加载的问题,报404 问题原因 如果SpringMVC的映射模式采用的是后缀名匹配,如[*.do]或者[*.action]则不会出现该问题,因为静态资 ...

  8. 解决MySQL复制出错 Last_SQL_Errno:1146

    背景:我们在做数据迁移或者拆分的时候,使用Tablespace transcation 这种解决方案时,很有可能就会遇到 从库复制出错,报: Last_SQL_Errno: 1146 那么具体错误内容 ...

  9. DAY...

    讲道理,我还是以前的我.没有坚持每天写......... 又到了谷底......... 坚持啊........

  10. 题解 P4379 【[USACO18OPEN]Lemonade Line】

    不敢快速排序又想要快排的速度,还不用STL的小伙伴们看这里! 小金羊终于学会了堆排以外的另外的一种排序 (打个题解巩固一下) 归并排序(mergesort): 时间复杂度和快排一样的优秀. 先说归并排 ...