jfinal控制台输出带参数的完整SQL语句

问题:jfinal开发时,自带的SQL语句只显示带 ?的SQL,不方便查看调试。

image.png

查找:搜索了一下解决方案,通过日志框架和通过自定义的Filter解决的很多。很不幸,我试用那几个方法都没有能够解决我的问题,依然不能打印带参数的SQL完整语句。

解决:参考了https://jfinal.com/share/1909的方式添加了Filter,复制过去测试,涛声依旧,八成是人品问题。最后在评论区里看到完善的,复制过去测试,竟然解决了问题。

image.png

代码:

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);

}

参考:

https://jfinal.com/share/1909

评论区

chcode

2021-05-10 11:21

这里有更加极简的方案,代码量极少https://jfinal.com/share/2250

JackHappiness

2021-05-10 11:24

yuwen01

2021-05-11 11:20

@JackHappiness 楼主你这一个我复制过去直接可以用没有问题,一楼那个复制过去用不了,有问题

chcode

2021-05-11 12:04

@yuwen01 我觉得的日志级别没有设置对

yuwen01

2021-05-11 16:56

@chcode 解决了,需要注册filter和log4j.properties设置为log4j.rootLogger=DEBUG, stdout, file

JackHappiness

2021-05-11 17:10

@yuwen01 我刚开始也是这么配置的,但是没有解决问题,可以共享一下

yuwen01

2021-05-11 17:14

@JackHappiness 需要注册filter(dbPlugin.addFilter(new SQLDruidFilter());)和log4j.properties设置为log4j.rootLogger=DEBUG, stdout, file ,然后要引入https://mvnrepository.com/artifact/cn.hutool/hutool-log jar包,用最新的就可以了

杜福忠

2021-05-11 18:33

@JackHappiness 波总很早就有整理为分享了 https://jfinal.com/share/621 收藏起来吧2333