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);\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 = 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);

__EOF__

本文作者羊37
本文链接https://www.cnblogs.com/yang37/p/14597101.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   羊37  阅读(562)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示