起因:
开发的时候看到后台打印出来的sql还需要一个个参数手动拼接去执行一下,好麻烦,然后就叫chatgpt帮忙生成了一个方法,手动改了一下,能拼接完整的sql
正片:
@Test
public void createSql(){
String sql="insert into depart_info(emp_id, depart_type, depart_status, apply_time, depart_time, final_work_time, reality_depart_time, depart_reason, depart_reason_illustrate, notes, revoke_depart_reason, abandon_depart_reason, creator, create_time) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
String param="2(Integer), 1(Integer), 1(Integer), 2023-11-14 00:00:00.0(Timestamp), 2023-11-21 00:00:00.0(Timestamp), 2023-11-21 00:00:00.0(Timestamp), null, 3(Integer), 111(String), 222(String), null, null, admin(String), 2023-11-30 09:53:07.143(Timestamp)";
System.out.println( replaceQuestionMark(sql, param));
}
private static String replaceQuestionMark(String original, String replacement) {
original=original.trim();
replacement=replacement.trim();
// 将replacement字符串按逗号分割成ArrayList
List<String> replacementList = new ArrayList<>(Arrays.asList(replacement.split(", ")))
.stream().map(s->{
s=s.trim();
// 使用正则表达式匹配括号中的内容
Pattern pattern = Pattern.compile("\\(([^)]+)\\)");
Matcher matcher = pattern.matcher(s);
String type= matcher.find() ? matcher.group(1) : "";
//剔除括号内容
s=s.replaceAll("\\([^)]*\\)", "");
//判断括号内的类型
if (!type.equalsIgnoreCase("Integer")){
if (!s.equalsIgnoreCase("null")){
s="'"+s+"'";
}
}
return s;
}).collect(Collectors.toList());
// 使用StringBuilder来构建替换后的字符串
StringBuilder resultBuilder = new StringBuilder();
// 遍历原始字符串的每一个字符
for (char c : original.toCharArray()) {
// 如果是问号字符,将其替换为replacementList中的下一个字段
if (c == '?') {
// 检查是否还有更多的字段
if (!replacementList.isEmpty()) {
resultBuilder.append(replacementList.get(0));
// 删除已经使用的字段
replacementList.remove(0);
} else {
// 如果replacementList中的字段已经用完,保留原始的问号字符
resultBuilder.append(c);
}
} else {
// 如果不是问号字符,直接添加到结果中
resultBuilder.append(c);
}
}
return resultBuilder.toString();
}
输出内容测试
彩蛋
sql很长的话可以用快捷键,光标选定开始,shift+end ,我是联想小新的笔记本,end键在右箭头上,所以要加个alt,变成shift+alt+end,就可以选到末尾