问题:jfinal开发时,自带的SQL语句只显示带 ?的SQL,不方便查看调试。
查找:搜索了一下解决方案,通过日志框架和通过自定义的Filter解决的很多。很不幸,我试用那几个方法都没有能够解决我的问题,依然不能打印带参数的SQL完整语句。
解决:参考了https://jfinal.com/share/1909的方式添加了Filter,复制过去测试,涛声依旧,八成是人品问题。最后在评论区里看到完善的,复制过去测试,竟然解决了问题。
代码:
1、定义过滤器:SQLDruidFilter
package com.exam.common.filter;
import java.sql.SQLException;
import java.util.Map;
import com.alibaba.druid.filter.FilterAdapter;
import com.alibaba.druid.filter.FilterChain;
import com.alibaba.druid.proxy.jdbc.JdbcParameter;
import com.alibaba.druid.proxy.jdbc.StatementProxy;
import com.jfinal.kit.StrKit;
/**
* 输出完整 sql语句
*
* @author Administrator
*
*/
public class SQLDruidFilter 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();
// java.sql.Types
switch (lValue.getSqlType()) {
case 12:
lS = "'" + lS + "'";
// 语句
break; // 可选
case 1:
lS = "'" + lS + "'";
// 语句
break; // 可选
case 91:
lS = "'" + lS + "'";
// 语句
break; // 可选
}
lSql = lSql.replaceFirst("\\?", lS);
}
System.out.println("===: " + lSql);
}
}
}
2、配置
@Override
public void configPlugin(Plugins me) {
//配置数据库连接池插件
DruidPlugin dbPlugin=getDruidPlugin();
dbPlugin.addFilter(new SQLDruidFilter());//完整显示SQL语句
//添加到插件列表中
me.add(dbPlugin);
}
参考: