之前看到的分享基本围绕“日志”功能展开,尽管有些已经挺简单了,但还是觉得可以在操作步骤上简化。现介绍如下:
一、基本需求:开发阶段,需要检查最终执行的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);
其实这样就可以了