Mybatis日志输出sql语句是带?的,要拎出来查询的话不太方便。所以写了这个,自动替换所有的?为实际的参数。
package com.shy;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Data
public class SqlLog {
private String preparing;//对应带?的jdbc sql语句
private String parameters;//对应所有的参数字符串
private Integer updates;//对应受影响的行数
private List<String> params;//对应所有的参数集合
private String resultSql;//对应输出的sql
/**
* 解析sql
* @param content mybatis日志sql打印部分
* @return 输出的sql
*/
public String parseSql(String content){
String preParingPn = "==> Preparing: (.*?)\n";
Pattern r = Pattern.compile(preParingPn);
Matcher m = r.matcher(content);
if(m.find()){
preparing = m.group(1);
}
String parametersPn = "==> Parameters: (.*?)\n";
r = Pattern.compile(parametersPn);
m = r.matcher(content);
if(m.find()){
parameters = m.group(1);
}
String updatesPn = "<== Updates: (\\d+)\n";
r = Pattern.compile(updatesPn);
m = r.matcher(content);
if(m.find()){
updates = Integer.valueOf(m.group(1));
}
parseParameters();
return resultSql;
}
/**
* 正则匹配所有的参数
*/
private void parseParameters(){
parameters = parameters+ ",";
String pattern = "([^,]*?)\\((.*?)\\),|null,";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(parameters);
params = new ArrayList<>();
while(m.find()){
String param = m.group(1);
String type = m.group(2);
if("String".equals(type)){
params.add("\'"+param.trim()+"\'");
}else if(param == null) {
params.add("null");
}else{
params.add(param.trim());
}
}
resultSql = preparing;
for (String param : params) {
resultSql = resultSql.replaceFirst("\\?", param);
}
}
}
测试类
package com.shy;
public class SqlUtil {
public static void main(String[] args) {
String content = "==> Preparing: update AAA set A = '1', B =?, C =?, D = ?, CONFIRM_FILE = ?, E = sysdate, F = '1', G = '1' where ID = ? \n" +
"==> Parameters: 800(Integer), 1(String), 通过(String), null, 1652(Integer)\n" +
"<== Updates: 1";
SqlLog sqlLog = new SqlLog();
String resultSql = sqlLog.parseSql(content);
System.out.println(resultSql);
}
}
运行结果
update AAA set A = '1', B =800, C ='1', D = '通过', CONFIRM_FILE = null, E = sysdate, F = '1', G = '1' where ID = 1652