之前看到的分享基本围绕“日志”功能展开,尽管有些已经挺简单了,但还是觉得可以在操作步骤上简化。现介绍如下:
一、基本需求:开发阶段,需要检查最终执行的sql语句——不仅仅是带有“?”的预编译语句,还应该包括各个字段的参数。
拒绝形如:select * from worker where id = ? or name = ?
改造目标:select * from worker where id = 2 or name = WangWei
二、基本思路:为数据源插件DruidPlugin添加过滤Filter。
三、步骤:
1、新建类MyDruidFilter
public class MyDruidFilter extends FilterAdapter { @Override public void statement_close(FilterChain chain, StatementProxy statement) throws SQLException { super.statement_close(chain, statement); Map<Integer, JdbcParameter> lParameters = statement.getParameters(); String lSql = statement.getBatchSql(); if(StrKit.notBlank(lSql)){ for (Map.Entry<Integer,JdbcParameter> lEntry : lParameters.entrySet()){ JdbcParameter lValue = lEntry.getValue(); if(lValue == null){ continue; } Object lO = lValue.getValue(); if(lO == null){ continue; } String lS = lO.toString(); lSql = lSql.replaceFirst("\\?",lS); } System.out.println("Sql = " + lSql); } } }
注意:1)这个类继承了FilterAdapter。2)这里重载方法有很多选择,并非一定要选statement_close
2、项目的Config的ConfigPlugin(Plugins me)中进行适当改写
@Override public void configPlugin(Plugins me) { // 配置数据库插件 DruidPlugin druidPlugin = getDruidPlugin(); if (prop.getBoolean("devMode", false)){ //打印完整sql语句,核心语句就这一句 druidPlugin.addFilter(new MyDruidFilter()); } 。。。 }
仅两步!即可达成目标!
logFilter.setStatementLogEnabled(false);
logFilter.setStatementLogErrorEnabled(true);
logFilter.setStatementExecutableSqlLogEnable(true);
dbPlugin.addFilter(logFilter);
其实这样就可以了