一、背景
在采用Navicat复制脚本为insert语句后,sql语句中的时间部分都复制为了具体的时间.
在别处执行这个insert语句时,想把语句中的时间字段替换为now().
二、示例代码
注意点
- java虚拟机设置的字符串常量池大小好像是65536?
- 当sql语句值中也包含()字符时,如字段值为 用户收益(%).此时未做处理,在//todo部分,需要自行完善.
- changeTimeStrToNow(目标sql语句, 需替换的字段, 具体替换值);
package cn.yang37.tools;
import com.sun.xml.internal.ws.util.StringUtils;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @Description:
* @Class: TimeToNow
* @Author: Yiang37
* @Date: 2021/3/30 10:41
* @Version: 1.0
*/
public class ChangeSqlTimeToNow {
public static void main(String[] args) {
String sqlStr = "INSERT INTO `bolg`.`message`(`id`, `nickname`, `avatar`, `content`, `ip`, `city`, `user_id`, `gmt_create`, `gmt_modify`, `state`) VALUES (49, '0', '0', '嘘', '119.39.133.74', '湖南省', 0, 1590681919947, 1590681919947, 1);
";
String changeTimeStrToNow = changeTimeStrToNow(sqlStr, "`gmt_create`, `gmt_modify`", "NOW()");
System.out.println(changeTimeStrToNow);
//得到多条sql语句List
//List<String> stringList = Arrays.asList(sqlStr.split("
"));
}
public static String changeTimeStrToNow(String inSqlStr, String targetStr, String replaceStr) {
String target = targetStr.toUpperCase(Locale.ROOT);
//计算出sql()中的 字段名部分 和 值部分
// INSERT INTO TABLE_NAME( aa,bb ) VALUES ( xx,yy );
// stringArr[0] : aa,bb
// stringArr[1] : xx,yy
String[] stringArr = splitSqlStr(inSqlStr);
//根据","分割,转为对应的 List<String>
List<String> nameList = Arrays.asList(stringArr[0].replace(" ", "").split(","));
List<String> valueList = Arrays.asList(stringArr[1].replace(" ", "").split(","));
//记录nameList中时间部分的索引
List<Integer> indexList = new ArrayList<>();
for (int i = 0; i < nameList.size(); i++) {
//若目标字符串中包含nameList.get(i)
if (target.contains(nameList.get(i).toUpperCase(Locale.ROOT))) {
indexList.add(i);
}
}
//valueList的对应位置替换成 replaceStr eg:now()
for (Integer integer : indexList) {
valueList.set(integer, replaceStr);
}
// 至此替换完成,valueList转换回去 流中每个元素末尾追加,
List<String> valueReplaceList = valueList.stream().map((e -> e + (","))).collect(Collectors.toList());
// valueReplaceList末尾去掉","
valueReplaceList.set(valueReplaceList.size() - 1, valueReplaceList.get(valueReplaceList.size() - 1).replace(",", ""));
// 转换格式( valueReplaceList );
String resValueStr = "(" + String.join("", valueReplaceList) + ");";
//获取原sql语句的VALUES前面部分的语句
String[] split2 = inSqlStr.toUpperCase(Locale.ROOT).split("VALUES");
//获得结果str
return split2[0] + "VALUES " + resValueStr;
}
public static String[] splitSqlStr(String inSqlStr) {
String[] resStrArr = new String[2];
//输入的sql按"("分割
//INSERT INTO TABLE_NAME( xx ) VALUES ( yy );
// INSERT INTO TABLE_NAME
// xx ) VALUES
// yy );
String[] split = inSqlStr.split("\(");
//value中不包含(
if (split.length == 3) {
//字段名部分
resStrArr[0] = split[1].split("\)")[0];
//字段值部分 如果value中包含() 则此处不能采用
resStrArr[1] = split[2].split("\)")[0];
} else {
//说明value部分包含()的值
//todo
}
return resStrArr;
}
}
结果
INSERT INTO `BOLG`.`MESSAGE`(`ID`, `NICKNAME`, `AVATAR`, `CONTENT`, `IP`, `CITY`, `USER_ID`, `GMT_CREATE`, `GMT_MODIFY`, `STATE`) VALUES (49,'0','0','嘘','119.39.133.74','湖南省',0,NOW(),NOW(),1);