查看日志的时候,常常需要一个字段一个字段去对照哪个参数是哪个占位符,非常不明了,故写了个工具,将打印到日志中带占位符的sql自动转换成可以运行的sql。
package com.yangyt.sql.replace;
import com.alibaba.druid.sql.SQLUtils;
import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.util.Scanner;
/**
* 根据占位符,替换sql,并生成最终的sql
*
* @author yangyongtao
* @Date 2023/12/21 13:46
**/
public class MybatisSqlReplace {
public static final String RESET = "\u001B[0m";
public static final String RED = "\u001B[31m";
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
// 带占位符的sql
String sqlWithPlaceholder = scanner.nextLine();
String parameter = scanner.nextLine();
// 替换占位符
String replacedSql = updateSqlReplace(sqlWithPlaceholder, parameter);
// 格式化
replacedSql = SQLUtils.formatMySql(replacedSql).replaceAll(",", ",\t\n");
// 将文本复制到剪贴板
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
StringSelection selection = new StringSelection(replacedSql);
clipboard.setContents(selection, null);
System.out.println(RED + "已自动将转换后的sql拷贝至剪贴板!!!" + RESET);
}
scanner.close();
}
private static String updateSqlReplace(String sqlWithPlaceholder, String parameter) {
parameter = parameter.replaceAll(" ", "");
String[] split = parameter.split(",");
for (String s : split) {
if (s.contains("(")) {
String[] split1 = s.split("\\(");
String[] split2 = split1[1].split("\\)");
if ("String".equals(split2[0])) {
sqlWithPlaceholder = sqlWithPlaceholder.replaceFirst("\\?", "'" + split1[0] + "'");
} else {
sqlWithPlaceholder = sqlWithPlaceholder.replaceFirst("\\?", split1[0]);
}
} else {
sqlWithPlaceholder = sqlWithPlaceholder.replaceFirst("\\?", "null");
}
}
return sqlWithPlaceholder;
}
}