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

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

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

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

代码示例
java 复制代码
@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);
}
使用示例
java 复制代码
upsertUserData("user_1", LocalDateTime.of(2024, 11, 18, 15, 0), 10, 20, 30);

在批量操作中实现

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

java 复制代码
@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());
    });
}
数据模型
java 复制代码
@Data
@AllArgsConstructor
public class Data {
    private String userId;
    private LocalDateTime dataTime;
    private int field1;
    private int field2;
    private int field3;
}
调用示例
java 复制代码
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 无法生效。
    sql 复制代码
    ALTER TABLE table1 ADD UNIQUE INDEX idx_unique_user_data (user_id, data_time);
  2. 字段更新逻辑

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

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

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

相关推荐
玛卡巴卡0113 分钟前
Maven 从入门到实战:搞定依赖管理与 Spring Boot 项目构建
java·spring boot·maven
俊俊谢15 分钟前
【第一章】金融数据的获取——金融量化学习入门笔记
笔记·python·学习·金融·量化·akshare
国服第二切图仔37 分钟前
Rust开发之使用panic!处理不可恢复错误
开发语言·后端·rust
جيون داد ناالام ميづ1 小时前
Spring Boot 核心原理(一):基础认知篇
java·spring boot·后端
闲人编程1 小时前
现代Python开发环境搭建(VSCode + Dev Containers)
开发语言·vscode·python·容器·dev·codecapsule
南囝coding1 小时前
现代Unix命令行工具革命:30个必备替代品完整指南
前端·后端
夏之小星星2 小时前
Springboot结合Vue实现分页功能
vue.js·spring boot·后端
唐僧洗头爱飘柔95272 小时前
【SpringCloud(8)】SpringCloud Stream消息驱动;Stream思想;生产者、消费者搭建
后端·spring·spring cloud·设计思想·stream消息驱动·重复消费问题
韩立学长2 小时前
【开题答辩实录分享】以《自动售货机刷脸支付系统的设计与实现》为例进行答辩实录分享
vue.js·spring boot·后端
nvd112 小时前
python异步编程 -- 深入理解事件循环event-loop
python