公司项目大部分采用SpringMVC +Spring-JDBC框架来搭建web项目,每次需要分析代码的SQL的时候,都需要将代码打上断点,运行程序,定位到SQL,然后粘到对应的查询工具上进行查询,查询期间还要手动替换 上查询参数。这种做法做多了,令人生厌,所以利用AOP原理,写一个SQL调试管理小功能。
以下为项目dao层的简单接口定义:
public interface BaseDao {
public List<List<String>> queryListData(String sql, Object[] o);
public List<List<String>> queryListDataNoParams(String sql);
public List queryList(String sql, Object[] o);
public <T> List<T> queryObjList(String sql, Object[] args, Class<T> clazz);
public int queryForInt(String sql, Object[] o);
public int addOrUpdate(String sql, Object[] o);
}
可以发现传参比较简单,基本都是传入sql,以及一些sql参数,我们只需要拦截到这些要执行的方法,通过JAVA反射拿到对应的参数,进行控制台输出就好了。但是仅仅输出了sql还不够,我们还需要显示的知道这个方法的调用过程。这里通过Java线程来获取方法运行栈的信息。对比看了下具有sql监控的淘宝数据源druid,其实现逻辑大体上也是运用了AOP的原理进行SQL的监控。
废话不少说直接上代码:
1)自定义一个方法拦截器 DisplayExecuteSqlInterceptor :
package com.XXX.CCC.aop;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.Method;
/**
*
* 方法拦截 粒度在方法上
*
* @desc 调试管理 利用 AOP 原理, 在开发模式下于控制台展示 dao层 的实际执行的SQL
* 粘出来即可 在pl/sql下执行,已经替换掉 ? 了
*
* @author luotianyi
* @create 2017-11-30 14:03
**/
public class DisplayExecuteSqlInterceptor implements MethodInterceptor {
private static final Logger log = LoggerFactory.getLogger(DisplayExecuteSqlInterceptor.class);
private