java利用mybatis拦截器统计sql执行时间示例
java利用mybatis拦截器统计sql执行时间示例
发布时间:2016-12-28 来源:查字典编辑
摘要:可以根据执行时间打印sql语句,打印的sql语句是带参数的,可以拷贝到查询分析器什么的直接运行复制代码代码如下:packagemybatis...

可以根据执行时间打印sql语句,打印的sql语句是带参数的,可以拷贝到查询分析器什么的直接运行

复制代码 代码如下:

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));

}

}

}

}

return sql;

}

public Object plugin(Object target) {

return Plugin.wrap(target, this);

}

public void setProperties(Properties properties0) {

this.properties = properties0;

}

}

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新Java学习
热门Java学习
编程开发子分类