Java替换sql语句中的时间字段为now()
⼀、背景
在采⽤Navicat复制脚本为insert语句后,sql语句中的时间部分都复制为了具体的时间.
在别处执⾏这个insert语句时,想把语句中的时间字段替换为now().
⼆、⽰例代码
注意点
java虚拟机设置的字符串常量池⼤⼩好像是65536?
当sql语句值中也包含()字符时,如字段值为⽤户收益(%).此时未做处理,在//todo部分,需要⾃⾏完善.
changeTimeStrToNow(⽬标sql语句, 需替换的字段, 具体替换值);
package ls;
import l.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);\n";
String changeTimeStrToNow = changeTimeStrToNow(sqlStr, "`gmt_create`, `gmt_modify`", "NOW()");
System.out.println(changeTimeStrToNow);
//得到多条sql语句List
//List<String> stringList = Arrays.asList(sqlStr.split("\n"));
}
public static String changeTimeStrToNow(String inSqlStr, String targetStr, String replaceStr) {
String target = UpperCase(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++) {
/
/若⽬标字符串中包含(i)
if ((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 + (","))).List());
/
/ valueReplaceList末尾去掉","
valueReplaceList.set(valueReplaceList.size() - 1, (valueReplaceList.size() - 1).replace(",", ""));
// 转换格式( valueReplaceList );
String resValueStr = "(" + String.join("", valueReplaceList) + ");";
//获取原sql语句的VALUES前⾯部分的语句
String[] split2 = UpperCase(Locale.ROOT).split("VALUES");
sql语句替换表中内容
//获得结果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);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。