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配置连接信息相关推荐
- Mybatis 通过拦截器动态修改SQL
01 使用场景 当我们在多租户的项目中,编写SQL语句都要带上tenant字段,用于区分不同的租户只能操作自己的数据. 比如,像下面的SQL select * from member where id ...
- 一步步教你mybatis分页,mybatis分页拦截器 使用,mybatis拦截器分页
mybatis 分页详解.mybatis分页查询,mybatis分页拦截器使用.struts2下mybatis分页 mybatis默认是支持分页的,内部通过创建可滚动的Result ...
- 如何使用Mybatis的拦截器实现数据加密与解密
点击蓝色"程序猿DD"关注我哟 加个"星标",不忘签到哦 转载自公众号:日拱一兵 关注我,回复口令获取可获取独家整理的学习资料: - 001 :领取<Sp ...
- Mybatis Interceptor 拦截器原理 源码分析
Mybatis采用责任链模式,通过动态代理组织多个拦截器(插件),通过这些拦截器可以改变Mybatis的默认行为(诸如SQL重写之类的),由于插件会深入到Mybatis的核心,因此在编写自己的插件前最 ...
- mybatis 自定义拦截器
拦截器注解 mybatis自定义拦截器实现步骤: 实现org.apache.ibatis.plugin.Interceptor接口. 添加拦截器注解org.apache.ibatis.plugin.I ...
- Mybatis拦截器修改sql语句
拦截器介绍 MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能. MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用.默认情况下,MyBatis 允许 ...
- mybatis redis_基于人事年假管理的系统springboot+mybatis+redis+拦截器
那么分享一个项目案例篇吧! 需求是:假设有一个部门表,一个员工表,一个年假表, 员工表里: 部门表: 休假表: 管理员表 项目原型: 效果图: 管理员登录: 登录成功回调: 进入后台首页,这里 ...
- 超级详细!!!SpringBoot2核心技术与响应式编程尚硅谷完整知识点笔记 下篇 自动配置、容器、Web、数据响应、拦截器、SQL、NOSQL、原理、Junit5、Actuator、外部化配置等
所有配套资料已上传到QQ群:167356412 需要的话群文件自取 06.数据访问 1.SQL 1.数据源的自动配置-HikariDataSource 1.导入JDBC场景 <dependen ...
- Mybatis分页拦截器
这个拦截器比较复杂,是通过判断传入的参数有page对象就认定它是需要分页的. 1.首先,自定义一个分页拦截器 package com.jd.controller.interceptor;import ...
最新文章
- C++中一些你不知道的冷知识
- PostgreSQL的xlog实验一
- python的优点-Python语言的优势有哪些?
- Java多态-如何理解父类引用指向子类对象
- python学习-练习题9*9乘法表巩固
- LeTax如何多行注释
- 高性能网站建设之 MS Sql Server数据库分区
- Eigen入门之密集矩阵 8 - resharp slicing切片
- 深度解析大型分布式电商网站演变过程以及构架部署解决方案
- unset MAILCHECK
- volatile是Java提供的一种轻量级的同步机制
- plupload与springmvc分段上传视频
- linux添加一块硬盘分区,centos6中添加一块新的硬盘并分区的方法介绍
- js配置打印机属性_你还在为如何设置打印机而烦恼吗?一招教你快速共享打印机!...
- 极客大学架构师训练营 数据结构与算法 平衡二叉树 红黑树 动态规划 遗传算法 第15课 听课总结
- android静态库动态库,Android 动态库和静态库
- 在虚拟机上搭建中标麒麟Neokylin6桌面版开发环境
- jfinal,jxl导出excel遇到的异常
- DC-DC升压变换器 直流隔离 高压稳压输出 电源模块
- jsp+ssm计算机毕业设计短视频文案创作平台系统【附源码】
热门文章
- TensorFlow tf.squeeze
- docker 配置ssh
- 信息安全完全参考手册之安全设计原则(第四章)
- 通过options探测服务器信息,WEB服务器启用了OPTIONS方法
- Exchange Server 2016 独立部署/共存部署 (四)—— 配置DAG(上)
- 阿里云各个地域节点速度测试(测试点到阿里云各站点)
- Java基础学习总结(129)——Arrays.asList得到的List进行add和remove等操作出现异常解析
- 全国中小学生计算机竞赛试题,全国中小学电脑制作活动
- redis 命令别名_redis 命令、命令行根据前缀(通配符)批量删除redis存储的key
- linux 建立伪目标过程,linux之Makefile 编写、规则、伪目标、变量