`

写个mybatis的拦截插件,实现将所有执行的sql写入文件里

 
阅读更多
原文 http://3131854.blog.51cto.com/3121854/1147446
mybatis使用拦截器显示sql,使用druid配置连接信息 http://www.cnblogs.com/babyhhcsy/p/4500884.html



@Intercepts( { 
       @Signature(method = "query", type = Executor.class, args = { 
              MappedStatement.class, Object.class, RowBounds.class, 
              ResultHandler.class }), 
       @Signature(method = "prepare", type = StatementHandler.class, args = { Connection.class }) }) 
@Intercepts标记了这是一个Interceptor,然后在@Intercepts中定义了两个@Signature,即两个拦截点。第一个@Signature我们定义了该Interceptor将拦截Executor接口中参数类型为MappedStatement、Object、RowBounds和ResultHandler的query方法;第二个@Signature我们定义了该Interceptor将拦截StatementHandler中参数类型为Connection的prepare方法。


这次项目中要求把所有mybatis所执行的sql都记录到一个文件中,下面是自己写的一个插件(源是参考网上一个重写mybatis分页插件的例子):

1.配置插件(在mybatis的配置文件里mybatis.xml配置自己写的这个插件(拦截器)):
<plugins>
	<!-- mybatis写出sql记录控件(拦截器) -->
   <plugin interceptor="com.zqgame.interceptors.MyBatisSQLInterceptor">  <!-- 自己写的那个拦截器 -->
	<property name="dialect" value="mysql"/> <!-- mysql的方言 -->
    </plugin>
</plugins>


2.MyBatisSQLInterceptor的内容:
package com.zqgame.interceptors;
 
import java.io.File;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Properties;
import net.sf.json.JSONObject;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.ibatis.executor.statement.StatementHandler;
/*import org.apache.ibatis.mapping.BoundSql;*/
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 com.zqgame.common.Constant;
 
/**
 * 拦截StatementHandler里的 prepare方法把执行的sql进行记录到文件里
 * @author panguixiang
 *
 */
@Intercepts({ @Signature(type = StatementHandler.class, method = "prepare", args = { Connection.class }) })
public class MyBatisSQLInterceptor implements Interceptor {
	public Object intercept(Invocation invocation) throws Throwable {
		StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
		MetaObject metaStatementHandler = MetaObject.forObject(statementHandler);
		String originalSql = (String) metaStatementHandler.getValue("delegate.boundSql.sql");//获得sql
		/* * if(log.isDebugEnabled()){ log.debug("生成分页SQL : "+boundSql.getSql());* }*/
		File sqlFile = null;
		List<String> lines = null;
		@SuppressWarnings("unchecked")
		HashMap<String, String> mapParam = (HashMap<String, String>) metaStatementHandler.getValue("delegate.boundSql.parameterObject");
		synchronized (this) {
			sqlFile = new File(Constant.SQLFILE.concat(
					DateFormatUtils.format(new Date(), "yyyyMMdd")).concat("-sql.txt"));/*此处是构造sql文件名称,那个Constant.SQLFILE是自己配的一个常量内容比如为:d:\\,可以随便写*/
			lines = new ArrayList<String>();
			lines.add(originalSql.replaceAll("\n", "").replaceAll("\t", "").replaceAll(" +", " "));
			JSONObject jsonObject = JSONObject.fromObject(mapParam);
			lines.add(jsonObject.toString());
			FileUtils.writeLines(sqlFile, "utf-8", lines, true);//将sqlString 写入文件
		}
		return invocation.proceed();
	}
	public Object plugin(Object target) {
		return Plugin.wrap(target, this);
	}
	public void setProperties(Properties properties) {
		// TODO Auto-generated method stub
	}
}
分享到:
评论

相关推荐

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

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

    mybatis方式elasticsaerch的sql

    一种可能的做法是创建一个自定义的MyBatis插件或者拦截器,该插件能够解析XML中的“SQL”为Elasticsearch查询DSL。在XML配置文件中,我们可以定义一个类似于SQL查询的元素,比如`&lt;es:query&gt;`,并在其中写入Elastic...

    基于mybatis 来实现对敏感数据在进出DB时候进行脱敏处理, 让各位码友们无需自己各种手动实现

    2. **自定义插件**:通过创建一个 MyBatis 插件,我们可以拦截 SQL 语句,并在执行时动态修改 SQL,对敏感字段进行脱敏处理。这样,无论何时执行涉及敏感数据的 SQL,都可以自动应用脱敏规则。 二、实现步骤 1. **...

    mybatis修改版

    在原版MyBatis中,代理对象是通过动态代理机制生成的,用于拦截SQL执行过程中的方法调用,实现事务管理、缓存控制、参数映射等功能。在MyBatis修改版中,这一部分可能进行了如下优化: 1. **代理对象性能优化**:...

    Mybatis在Mapper.xml文件中的转义字符处理方式.pdf

    Mybatis是一个流行的Java持久层框架,它通过XML或注解的方式,将对象与数据库中的表进行映射,实现数据库操作的自动化。在Mybatis框架中,Mapper.xml文件是定义SQL映射的关键组件,它允许开发者编写SQL语句并执行...

    MyBatis的一个小例子

    MyBatis是一个流行的Java持久层框架,它简化了数据库操作,允许开发者将SQL查询与Java代码直接集成。在这个小例子中,我们将探索MyBatis的基本用法和核心概念。 首先,MyBatis的核心是XML配置文件,其中包含了...

    SpringBoot整合Mybatis和Thymeleaf实现简单的登录拦截、注册账号、修改账号、注销账号功能

    Mybatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。Mybatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。在SpringBoot中整合Mybatis,可以使用Spring的注解来配置数据源、事务...

    MyBatis案例

    在MyBatis中,我们定义Mapper接口来操作数据库,然后创建对应的XML映射文件,将SQL语句写入其中。例如,有一个`UserMapper.java`接口: ```java public interface UserMapper { User selectUser(int id); } `...

    mybatis+springmvc整合

    本文将详细介绍如何将MyBatis与SpringMVC整合,以实现一个完整的增删改查(CRUD)应用,并涉及所需的库文件。 MyBatis是一个优秀的SQL映射框架,它允许开发者直接编写SQL语句,将数据库操作与业务逻辑解耦。而...

    Mybatis讲义.rar

    8. **插件机制**:Mybatis允许开发人员创建自定义插件,可以拦截SqlSession和Executor等接口的方法,实现如性能监控、日志记录等功能。 9. **Mybatis Plus**:作为Mybatis的扩展,Mybatis Plus提供了一些额外的功能...

    Mybatis-ehcache 1.2.1源码(ehcache-cache-mybatis-ehcache-1.2.1.zip)

    这通常涉及到自定义拦截器或者插件,通过拦截Mybatis的SQL执行过程,实现对查询结果的缓存。 2. **配置**:了解如何在Mybatis的配置文件中设置Ehcache,包括设置缓存的策略(如时间过期、容量限制等),以及如何...

    mybatis 3.5.11

    5. **插件扩展**: 通过拦截器实现对SQL执行的拦截,方便添加自定义功能。 **MyBatis 3.5.11的关键改进** 1. **错误修复**: 修复了若干已知问题,提高了框架的稳定性和兼容性。 2. **性能优化**: 对内部机制进行了...

    springmybatis

    前面一章,已经搭建好了eclipse,mybatis,mysql的环境,并且实现了一个简单的查询。请注意,这种方式是用SqlSession实例来直接执行已映射的SQL语句: session.selectOne(...

    Mybatis系列教程Mybatis基本应用共9页.pdf

    Mybatis允许自定义插件,可以拦截SqlSession中的方法,实现如日志、性能分析等功能。 7. **Mybatis的事务管理**: Mybatis支持手动和自动两种事务管理方式,可以通过SqlSessionFactory的getTransaction()方法进行...

    SpringMVC4+MyBatis+SQL Server2014实现数据库读写分离

    下面我们将详细介绍如何使用SpringMVC4、MyBatis和SQL Server 2014实现读写分离。 首先,我们需要了解读写分离的原理。读写分离的主要思想是将数据库的读取和写入操作分离到不同的数据库服务器上,读取操作使用从库...

    mybatis和springMVC集成

    5. **创建Mapper接口和XML文件**:定义Mapper接口,包含SQL查询方法,同时编写对应的XML文件,写入具体的SQL语句。 6. **配置Mapper**:在Spring的配置文件中,为每个Mapper接口创建一个Bean,关联其XML文件。 7. ...

    struts2_spring3.x+mybatis3.x+DB2整合案例

    9. **Service和DAO**:创建Service层接口和实现类,以及DAO接口和实现类,通过MyBatis的SqlSession执行SQL。 10. **测试**:通过单元测试和集成测试确保所有组件正常工作。 这个案例适用于学习如何在实际项目中...

    Struts2+Spring3+MyBatis框架整合源码+pdf整合文档

    MyBatis是一个持久层框架,它简化了SQL操作,将SQL语句与Java代码分离,通过XML或注解配置,将接口方法与SQL语句绑定。在Spring中,MyBatis可以通过Spring的SqlSessionFactoryBean来配置,实现数据访问的事务管理和...

    mybatis项目资料

    5. **plugins**:可以添加MyBatis插件,实现对SQL的拦截、日志等功能。例如,添加PageHelper分页插件: ```xml ``` 6. **objectFactory** 和 **typeHandler**:分别定义了对象工厂和类型处理器,用于...

Global site tag (gtag.js) - Google Analytics