java操作数据库 存在就更新不存在就插入的优化操作

白色玫瑰 程序猿

时间: 2023-05-22 阅读: 1 字数:3481

{}
当我们用java,jdbc 或者 spring的jdbctemplate来操作数据时候,总有时候会碰到 存在就插入不存在就更新 这样的需求,我们一般都是用下面的方法解决 public void save(){ JdbcTemplate jdbc = getJdbc(); String ...

当我们用java,jdbc 或者 spring的jdbctemplate来操作数据时候,总有时候会碰到 存在就插入不存在就更新 这样的需求,我们一般都是用下面的方法解决

public void save(){
   JdbcTemplate jdbc = getJdbc();
   String updateStatement="";
   String insertStatement="";
   int cout = jdbc.update(updateStatement);
   if(count<=0){
       //不存在需要被更新的数据,那就插入
       jdbc.update(insertStatement);
   }
   jdbc.close();
}

在这里仅仅只是一条数据,看着还行,但是如果是批量的数据呢?代码就会变成下面这样

public void save(List<Param> list){
   JdbcTemplate jdbc = getJdbc();
   String updateStatement="";
   String insertStatement="";
   for(Param p:list){
      int cout = jdbc.update(updateStatement);
      if(count<=0){
          //不存在需要被更新的数据,那就插入
          jdbc.update(insertStatement);
       }
   }
   jdbc.close();
}

这样感觉就不怎么好看了,而且效率也不怎么样。

优化方法如下:

  1. 可以在数据库中建立存储过程,逻辑为单条记录的 存在就更新不存在就插入;
  2. 在java中通过jdbc调用存储过程,如果是批量数据的话,跟批量插入差不多。

实例代码:

  1. 存储过程(postgres数据库):
CREATE OR REPLACE FUNCTION insert_exists_device(p_deviceid integer, p_eventtype integer, p_state integer, p_eventvalue character varying)
  RETURNS integer AS
$BODY$
   BEGIN
     perform 1 FROM tablename WHERE deviceid=p_deviceid AND eventtype=p_eventtype; --判断是否有该条记录
     IF NOT found THEN
       insertStatement;
     ELSE
       updateStatement;
     END IF;
     RETURN 1; 
   END
$BODY$
  LANGUAGE plpgsql;

  1. java中调用:
public void save(List<Param> list){   
    return jdbc.execute("{call insert_exists_device_monitor(?,?,?,?)}", new CallableStatementCallback<Boolean>() {

    @Override
    public Boolean doInCallableStatement(CallableStatement cs)throws SQLException, DataAccessException {
   
        for (Param p: list) {
            cs.setInt(1, deviceid);
            cs.setInt(2, p.getEventType());
            cs.setInt(3, p.getState());
            cs.setString(4, p.getEventValue());
            cs.addBatch();
        }
        s.executeBatch();
     }
            
    });
}

或者 在function,先Update,再 if not found then insert ... end if; 也可以实现。

参考自:<a href="http://blog.163.com/digoal@126/blog/static/1638770402011111274336235/" title="http://blog.163.com/digoal@126/blog/static/1638770402011111274336235/">http://blog.163.com/digoal@126/blog/static/1638770402011111274336235/</a>

原文地址:https://blog.csdn.net/luojinbai/article/details/42277629?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168475004016800197081290%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=168475004016800197081290&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-7-42277629-null-null.142^v87^insert_down1,239^v2^insert_chatgpt&utm_term=java%E4%BC%98%E5%8C%96

本文章网址:https://www.sjxi.cn/detil/1bd9e6d2d673436ab0eff92742321227

最新评论

当前未登陆哦
登陆后才可评论哦

湘ICP备2021009447号

×

(穷逼博主)在线接单

QQ: 1164453243

邮箱: abcdsjx@126.com

前端项目代做
前后端分离
Python 爬虫脚本
Java 后台开发
各种脚本编写
服务器搭建
个人博客搭建
Web 应用开发
Chrome 插件编写
Bug 修复