Spring Boot的JdbcTemplate实现“不存在即插入,存在即更新”

ops/2024/11/28 19:48:55/

在 Java 中实现【不存在即插入,存在即更新】 INSERT ... ON DUPLICATE KEY UPDATE

Spring BootJdbcTemplate 实现 INSERT ... ON DUPLICATE KEY UPDATE

如果你使用的是 Spring BootJdbcTemplate,可以这样实现:

代码示例
@Autowired
private JdbcTemplate jdbcTemplate;public void upsertUserData(String userId, LocalDateTime dataTime, int field1, int field2, int field3) {String sql = "INSERT INTO table1 (user_id, data_time, field1, field2, field3) " +"VALUES (?, ?, ?, ?, ?) " +"ON DUPLICATE KEY UPDATE " +"field1 = VALUES(field1), " +"field2 = VALUES(field2), " +"field3 = VALUES(field3)";jdbcTemplate.update(sql, devId, dataTime, field1, field2, field3);
}
使用示例
upsertUserData("user_1", LocalDateTime.of(2024, 11, 18, 15, 0), 10, 20, 30);

在批量操作中实现

如果有多条数据需要同时插入或更新,可以使用 batchUpdate

@Autowired
private JdbcTemplate jdbcTemplate;public void batchUpsert(List<Data> dataList) {String sql = "INSERT INTO table1 (dev_id, data_time, field1, field2, field3) " +"VALUES (?, ?, ?, ?, ?) " +"ON DUPLICATE KEY UPDATE " +"field1 = VALUES(field1), " +"field2 = VALUES(field2), " +"field3 = VALUES(field3)";jdbcTemplate.batchUpdate(sql, dataList, dataList.size(), (ps, data) -> {ps.setString(1, data.getUserId());ps.setTimestamp(2, Timestamp.valueOf(data.getDataTime()));ps.setInt(3, data.getField1());ps.setInt(4, data.getField2());ps.setInt(5, data.getField3());});
}
数据模型
@Data
@AllArgsConstructor
public class Data {private String userId;private LocalDateTime dataTime;private int field1;private int field2;private int field3;
}
调用示例
List<Data> dataList = Arrays.asList(new Data("user_1", LocalDateTime.of(2024, 11, 18, 15, 0), 10, 20, 30),new Data("user_2", LocalDateTime.of(2024, 11, 18, 15, 15), 15, 25, 35)
);
batchUpsert(dataList);

注意事项

  1. 主键或唯一索引

    • 确保 user_iddata_time 组成的联合主键或唯一索引已正确设置,否则 ON DUPLICATE KEY UPDATE 无法生效。
    ALTER TABLE table1 ADD UNIQUE INDEX idx_unique_user_data (user_id, data_time);
    
  2. 字段更新逻辑

    • 如果部分字段不需要更新,可以省略对应字段的 ON DUPLICATE KEY UPDATE 语句。
  3. 性能优化

    • 对于大批量插入操作,可以考虑一次性提交多个记录,以减少网络和数据库连接开销。

这样,你就可以灵活地实现对 table1 表的插入和更新逻辑了!


http://www.ppmy.cn/ops/137454.html

相关文章

【八股文】小米

文章目录 一、vector 和 list 的区别&#xff1f;二、include 双引号和尖括号的区别&#xff1f;三、set 的底层数据结构&#xff1f;四、set 和 multiset 的区别&#xff1f;五、map 和 unordered_map 的区别&#xff1f;六、虚函数和纯虚函数的区别&#xff1f;七、extern C …

安装Docker的时候报错

在一台新的虚拟机里安装docker的时候报错了&#xff0c;执行命令如下 yum install -y docker-ce docker-ce-cli containerd.io报错信息如下&#xff1a; Error downloading packages:3:docker-ce-27.0.0~rc.2-1.el7.x86_64: [Errno 256] No more mirrors to try.在网上查询了…

html+css+js打字游戏网页

1. 效果 2. html代码 <!doctype html> <html><head><meta charset"utf-8" /><title>打字练习</title><!--引入第三方动画库--><link rel"stylesheet" href"animate.css"><style>html {h…

一次SQL注入深入利用

1. 在寻找某处的资产时找到一个查询的页面&#xff1a; https://xxxxxxxxxxx/index.php/all 随便查询一下&#xff0c;然后抓包: 测试发现这里存在注入&#xff1a; 由于有报错信息&#xff0c;首先考虑报错注入&#xff1a; Poc&#xff1a; andupdatexml(0x7e,concat(0x7e,…

计算机网络----基本概念

基本概念 在这一章从整体上介绍计算机网络的概况, 为后续的学习搭建起整体的框架; 介绍计算机网络中的基础术语和概念; 什么是因特网 『 因特网 』是一个世界范围内互联了数以亿计的计算设备的计算机网络; 因特网具体构成 因特网互联了数以亿计的计算设备, 这些设备被称为…

【软考速通笔记】系统架构设计师⑤——软件工程基础知识

文章目录 一、前言二、基础知识点2.1 软件危机2.2 软件生命周期 三、软件过程模型&#xff08;论文&#xff09;3.1 瀑布模型3.2 原型模型3.3 螺旋模型3.4 敏捷模型3.5 软件统一过程模型3.6 软件成熟度模型3.7 软件成熟度模型集成 四、需求工程五、软件测试5.1 根据程序执行状态…

QT 实现窗口关闭动画

1.实现效果 两种关闭窗口动画效果。 下坠式关闭动画。 中心式关闭动画 2.实现思路 创建了两个动画并行执行,一个是控制窗口尺寸的动画,一个是控制透明度的动画。 先创建一个closeAnimation动画,然后创建opacityAnimation动画,创建一个QParallelAnimationGroup并行动画…

房屋出租出售预约系统支持微信小程序+H5+APP

核心功能有&#xff1a;新盘销售、房屋租赁、地图找房、小区找房&#xff0c;地铁找房等方式。 地图找房&#xff1a;通过地图标注查看附近房源&#xff0c;方便用户根据地理位置查找合适的房产。二手房资讯&#xff1a;提供租房及二手房市场的相关资讯&#xff0c;帮助用户了…