package mybatis; 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; @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 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); System.err.println(sql); } 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)); } else{ Map map = (Map)metaObject ; sql = sql.replaceFirst("\\?", getParameterValue(map.get(propertyName)));} } } } return sql; } public Object plugin(Object target) { return Plugin.wrap(target, this); } public void setProperties(Properties properties0) { this.properties = properties0; }}
详细解决方案
利用Mybatis拦截器统计sql执行时间及打印会直接运行的sql语句
热度:93 发布时间:2016-05-05 09:52:09.0
相关解决方案
- spring3.1 + mybatis 回来null正常,返回结果前台接收不到
- mybatis 传参查询急解决方法
- Spring + Mybatis 组合报错
- 求SSM分页 struts +spring+mybatis 给小弟我发个学习学习吧 多谢大神们
- 求解 struts+spring+mybatis sqlsession为空 debug发现没有执行set方法 检查配置好像没有关问题
- 求解 mybatis 动态sql语句 choose和if 一起用时,为什么只执行otherwise里面的Sql语句 求解
- Mybatis 自定义 Plugin(Interceptor) 研讨! 急
- myBatis 动态生成排序有关问题
- MyBatis 读取 Mysql Blob类型的SQL如何写呢
- mybatis 传入表名参数,怎么判断呢
- MyBatis 怎么通过XML中配置的NameSpace和SQL的ID获取SQL字符串到JAVA
- mybatis-spring编程式事务处理BUG,该如何解决
- mybatis 关联查询插入的有关问题
- mybatis update 时空值,回复!
- mybatis+spring,加入mybatis的拦截器就会报NullPointerException,该如何解决
- mybatis 中设立useGeneratedKeys="false"执行就报不支持的特性
- mybatis 回到插入数据的逐渐(MySQL)
- MyBatis:XML fragments parsed from previous mappers does not contain va ...
- mybatis(ibatis3.x)
- mybatis 学习 之根本配置使用
- mybatis 学习之多数据源调整
- mybatis 1.5.2 websphere上发布
- Spring3 MVC 课程 (Mybatis+ExtJS基本权限管理)
- Spring3MVC+MyBatis+ExtJs3调整开发系列之四:角色管理模块
- MyBatis(iBatis 三)入门示例 及 整合Mybatis与Spring3
- mybatis 插入日期类型精确到秒的有关问题
- Spring3MVC+MyBatis+ExtJs3调整开发系列之二:菜单模块演示
- Spring3MVC+MyBatis+ExtJs3调整开发系列之三:人员管理模块
- mybatis spring 用tomcat发布的小疑点
- mybatis 批量安插,返回自增主键的主键值