• 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);
    
  • 相关阅读:
    《计算机图形学》学习笔记 0
    最全面的百度地图JavaScript离线版开发
    android 中文api
    SQL Compare数据库比较工具 完全破解+使用教程
    Android系统自带样式(android:theme)
    android studio 导入第三方库的记录
    web在线打印,打印阅览,打印维护,打印设计
    Oracle如何实现跨库查询
    WPF自适应窗体实现小结
    【转】WCF OpenTimeout, CloseTimeout, SendTimeout, ReceiveTimeout
  • 原文地址:https://www.cnblogs.com/yang37/p/14597101.html
Copyright © 2020-2023  润新知