Java替换sql语句中的时间字段为now()

一、背景

在采用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);
原文地址:https://www.cnblogs.com/yang37/p/14597101.html