package com.yanzuoguang.db.impl; import com.yanzuoguang.extend.ConfigDb; import com.yanzuoguang.util.helper.StringHelper; import com.yanzuoguang.util.log.Log; import org.springframework.stereotype.Component; import javax.annotation.Resource; /** * 打印SQL语句日志工具类 * * @author 颜佐光 */ @Component public class DbPrintSql { @Resource private ConfigDb configDb; /** * 获取参数处理之后的SQL语句 * * @param sql 带参数的SQL语句 * @param paras 参数 * @return 不带参数的SQL语句 */ public String getStringSql(String sql, Object... paras) { StringBuilder sb = new StringBuilder(); String[] split = sql.split("\\?"); int pos = 0; // 进行SQL语句参数替换,后面增加一个空格,方便后续用正则表达式进行替换处理 for (Object item : paras) { String str = StringHelper.toString(item); String strTo = str; if (str == null) { strTo = "null"; } else if (item instanceof Number || item.getClass().isEnum() || item instanceof Boolean) { // 不进行处理 } else { strTo = "'" + str.replace("'", "''") + "'"; } sb.append(split[pos]); pos++; sb.append(strTo); } while (pos < split.length) { sb.append(split[pos]); pos++; } return sb.toString(); } /** * 打印SQL语句 * * @param targetClass 触发类 * @param sqlName SQL语句名称 * @param start 开始执行的语句 * @param row SQL语句 * @param sql SQL语句 * @param paras 参数 */ public void print(Class targetClass, String sqlName, long start, int row, String sql, Object... paras) { // 日志表忽略打印 if (!configDb.isPrintSql()) { return; } if (!StringHelper.isEmpty(configDb.getPrintSqlFilter())) { if (sql.matches(configDb.getPrintSqlFilter())) { return; } } sql = getStringSql(sql, paras); // 打印SQL语句 Log.infoTag(DbPrintSql.class, String.format("%d row %s.%s", row, targetClass.getSimpleName(), sqlName), sql); } }