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

来源:互联网 发布:黄一琳淘宝店质量如何 编辑:程序博客网 时间:2024/05/17 12:54

  当我们用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>() {@Overridepublic 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/





0 0
原创粉丝点击