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

  当我们用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;

 

2. 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; 也可以实现。

参考自:http://blog.163.com/digoal@126/blog/static/1638770402011111274336235/

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值