`
zhanghteye
  • 浏览: 51938 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Mybatis拦截器实现统计sql执行时间及打印完整sql语句

阅读更多

1、java拦截器类:

package com.qhfax.extend.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;
	}
}

 

2、mybatis配置:

<!-- 利用Mybatis拦截器统计sql执行时间及打印能直接运行的sql语句  -->
<plugin interceptor="com.qhfax.extend.mybatis.MybatisInterceptor"></plugin>

 3、总结:

就是这么简单! 

分享到:
评论

相关推荐

    通过Mybatis拦截器自动定位慢SQL并记录日志

    Mybatis拦截器(Interceptor)是一种插件机制,它允许我们在Mybatis执行SQL语句之前或之后进行自定义操作,比如统计SQL执行时间、添加日志等。拦截器基于Java的动态代理实现,可以拦截Mapper接口方法的调用。 接...

    mybatis拦截器修改执行sql语句

    通过mybatis拦截器将查询语句、更新语句、删除语句、插入语句中指定表明替换为另一个表名

    mybatis拦截器实现通用权限字段添加的方法

    MyBatis拦截器是一个接口,用于拦截MyBatis的Executor对象,以便在执行SQL语句之前或之后执行一些特定的操作。拦截器可以实现各种功能,如权限控制、日志记录、性能监控等。 实现通用权限字段添加 在实际开发中,...

    MyBatis拦截器分页与动态修改SQL及其参数值

    1. **MyBatis拦截器**:MyBatis提供了一种插件机制,即拦截器(Interceptor),它基于Java的动态代理,可以在SQL执行前或执行后进行干预。例如,我们可以创建一个自定义的拦截器,来实现特定的功能,如日志记录、...

    mybatis慢SQL插件

    拦截器监控慢SQL并将完整的可执行的SQL语句打印在日志文件中,复制该SQL语句即可在数据库工具中执行。 使用方法: 找到你springboot项目中的配置文件,增加如下配置即可 application.yml 配置如下: sql: slow...

    mybatis拦截器的完整实现

    在这个"mybatis拦截器的完整实现"项目中,我们可以通过设置拦截器来观察并控制SQL的执行过程。 首先,我们要理解MyBatis拦截器的工作原理。MyBatis使用了Java的动态代理和AOP(面向切面编程)思想,拦截器实际上是...

    Mybatis拦截器记录数据更新历史记录到MongoDB

    Mybatis的拦截器是基于Java的动态代理机制实现的,它允许我们在特定的执行点(如SQL语句的执行前、后或结果返回前)插入自定义的行为。这在很多场景下都非常有用,比如日志记录、权限验证或本例中的数据变更监控。 ...

    mybatis使用拦截器实现分页操作

    在该类中,我们需要重写`intercept`方法,此方法会在每次执行SQL语句之前被调用。 ```java public class PageInterceptor implements Interceptor { @Override public Object intercept(Invocation invocation) ...

    MyBatis拦截器分页

    MyBatis拦截器分页是实现数据库查询优化和提高应用性能的一种有效手段。在MyBatis框架中,拦截器扮演着动态代理的角色,允许我们在执行SQL之前或之后进行额外的操作,比如统计、日志记录或者在本例中的分页处理。...

    springboot+mybatis拦截器实现自动分页

    MyBatis本身并不直接支持分页,但可以通过拦截器或者自定义插件的方式来实现。这里我们将使用拦截器。 1. **创建拦截器**: 首先,我们需要创建一个实现了`Interceptor`接口的类。在`intercept`方法中,我们可以获取...

    mybatissql_mybatis解决sql注入

    3. **使用MyBatis的拦截器**:通过实现`Interceptor`接口,开发者可以自定义拦截器来检查和修正SQL语句,进一步增强安全性。 4. **动态SQL**:MyBatis允许使用`&lt;if&gt;`,`&lt;choose&gt;`,`&lt;when&gt;`,`&lt;otherwise&gt;`等标签来...

    MyBatis拦截器(csdn)————程序.pdf

    MyBatis拦截器概述 MyBatis拦截器是一种强大的工具,允许开发者在DAO层和数据库之间进行额外的处理。通过拦截器,可以实现诸如分页、插入和更新时间/人、数据权限、SQL监控日志等功能,从而提高开发效率。 MyBatis...

    Mybatis拦截器介绍及分页插件示例

    ### Mybatis拦截器介绍及分页插件 #### 1.2 前言 在Mybatis框架中,拦截器(Interceptor)是一个重要的组件,它允许开发者在不修改框架核心逻辑的情况下,添加自定义的行为。例如,可以在SQL执行前后添加日志记录...

    mybatis 分页拦截器及拦截器配置

    MyBatis中的拦截器(Interceptor)是基于Java的动态代理机制实现的,它可以拦截执行SQL的生命周期中的某些环节,如:预处理、结果映射等。在分页拦截器中,它会在执行查询之前对SQL进行修改,自动添加LIMIT和OFFSET...

    mybatis自动sql生成插件源码

    在MyBatis中,拦截器用于在特定的执行点插入自定义行为,比如在SQL语句执行前或后。`AutoMapperInterceptor`实现了`org.apache.ibatis.plugin.Interceptor`接口,具备拦截执行方法的能力。它会检测到对Mapper接口的...

    spring+springMVC+mybatis拦截器分页 源码

    综上所述,"spring+springMVC+mybatis拦截器分页"项目结合了三大框架的优势,通过SpringMVC的拦截器实现业务逻辑的扩展,利用MyBatis的分页插件处理后台数据,再由EasyUI提供友好的用户界面。这样的组合为高效且可控...

Global site tag (gtag.js) - Google Analytics