SpringBoot PostgreSQL upsert

PostgreSQL 的 upsert 功能:当记录不存在时,执行插入;否则,进行更新。但是版本需要在9.5以上

  • upsert SQL示例
sql 复制代码
INSERT INTO table_name(column_list) 
VALUES(value_list)
ON CONFLICT target action;
  • SQL字符串定义
java 复制代码
    @Autowired
    private EntityManager entityManager;
	
	//具体业务SQL
    private static final String INSERT_QUERY_BASE_OFFLINE_AUTH = 
    "insert INTO etk_lg_life (fbh, offline_auth_id, offline_auth_time) VALUES  ";
    private static final String INSERT_PARAM_FOOTER_OFFLINE_AUTH = 
    "  on conflict (fbh)  do update set offline_auth_id = EXCLUDED.offline_auth_id , offline_auth_time=EXCLUDED.offline_auth_time ";
	
    private static final int INSERT_BATCH_SIZE = 1000;
    private static final String DELIMITER = ",";
  • 函数定义&使用
java 复制代码
 private void insertAll1(List<String> lgs, Date dataDate, int linkId) {
 		//日期转时间字符串的函数而已
        String dataDateStr = DateUtil.format4Sql(dataDate);

        String values = lgs.stream().map(lg -> this.renderSqlForLgLife(lg, dataDateStr, linkId))
                .collect(Collectors.joining(DELIMITER));

        String insertSQL = INSERT_QUERY_BASE_OFFLINE_AUTH + values +INSERT_PARAM_FOOTER_OFFLINE_AUTH ;

        entityManager.createNativeQuery(insertSQL).executeUpdate();
        entityManager.flush();
        entityManager.clear();

    }
java 复制代码
   下方函数为拼接values-SQL///
    private String renderSqlForLgLife(String lg, String dataDateStr, int linkId) {
        StringBuilder sBuilder = new StringBuilder();

        sBuilder.append("('").append(lg).append("',").append(linkId).append(",'").append(dataDateStr).append("')");

        return sBuilder.toString();
    }
java 复制代码
ListUtils.partition(lgLifeModel.getLgs(), INSERT_BATCH_SIZE).forEach(lgs -> {
                insertAll1(lgs, lgLifeModel.getDataDates()[0], lgLifeModel.getLinkId());

                log.info("插入{}life数据成功", lgs.size());
            });
相关推荐
追逐时光者29 分钟前
Everything替代工具,一款基于 .NET 开源免费、高效且用户友好文件搜索工具!
后端·.net
QX_hao44 分钟前
【Go】--数据类型
开发语言·后端·golang
桦说编程1 小时前
线程池拒绝策略避坑:谨慎使用抛弃策略,可能导致系统卡死
java·后端
奋斗的小monkey1 小时前
Java微服务实战:从零搭建电商用户服务系统
java·spring boot·微服务·nacos·电商系统·redis缓存
BingoGo1 小时前
PHP 15 个高效开发的小技巧
后端·php
锥栗1 小时前
【Redis】【缓存】理解缓存三大问题:缓存穿透、缓存击穿与缓存雪崩及解决方案
java·后端·面试
9号达人1 小时前
泛型+函数式:让策略模式不再是复制粘贴地狱
java·后端·面试
柑木1 小时前
开发必备-使用DevContainer技术消除 “在我这能运行”
后端
武子康2 小时前
大数据-122 - Flink Watermark 全面解析:事件时间窗口、乱序处理与迟到数据完整指南
大数据·后端·flink
她说彩礼65万2 小时前
Asp.net core Kestrel服务器详解
服务器·后端·asp.net