环境JFinal 4.9,打印输出效果如下:
看了前辈的帖子,但是感觉都不是自己想要的,druid虽然自带打印sql功能,但是我很讨厌它打印的sql,附加了太多我不关注的信息,当然,生产模式会切换使用它,而开发模式使用自己简洁优雅的sql输出。
需求:开发时控制台打印清爽的sql,于是就自己写了个玩一玩:
MyDruidFilter.java: 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.alibaba.druid.sql.SQLUtils; import com.jfinal.log.Log; import com.jfinal.log.Log4jLog; import java.sql.SQLException; import java.util.ArrayList; import java.util.Date; import java.util.List; /* author: Timor date: 2020/7/12 0012 */ public class MyDruidFilter extends FilterAdapter { private static final Log log = Log4jLog.getLog(MyDruidFilter.class); private boolean formatSQL = false; public MyDruidFilter() {} public MyDruidFilter(boolean formatSQL) { this.formatSQL = formatSQL; } @Override public void statement_close(FilterChain chain, StatementProxy statement) throws SQLException { super.statement_close(chain, statement); String sql = statement.getBatchSql(); // 不输出无意义的内容 if(sql.isEmpty()) return; int parametersSize = statement.getParametersSize(); if (parametersSize > 0) { List<Object> parameters = new ArrayList<>(parametersSize); for(int i = 0; i < parametersSize; ++i) { JdbcParameter jdbcParam = statement.getParameter(i); parameters.add(jdbcParam != null ? jdbcParam.getValue() : null); } // 这里可以使用数据库类型常量 String dbType = statement.getConnectionProxy().getDirectDataSource().getDbType(); if(formatSQL){ sql = SQLUtils.format(sql, dbType, parameters, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION); } } // 打印sal printSQL(sql); } public void printSQL(String sql){ String sb = "\n" + "MyDruidFilter SQL report ---------- " + new Date().toString() + " ---------------\n" + sql.trim() + "\n--------------------------------------------------------------------------------\n"; // 这会输出一些看着不爽的信息…… // log.info(sb); System.out.println(sb); } }
在config里面加载过滤器:
大功告成,启动后等sql执行就可在控制台看见优雅地sql了