java操作数据库 存在就更新不存在就插入的优化操作
2014-12-30 23:24
561 查看
当我们用java,jdbc 或者 spring的jdbctemplate来操作数据时候,总有时候会碰到 存在就插入不存在就更新 这样的需求,我们一般都是用下面的方法解决
在这里仅仅只是一条数据,看着还行,但是如果是批量的数据呢?代码就会变成下面这样
这样感觉就不怎么好看了,而且效率也不怎么样。
优化方法如下:
1. 可以在数据库中建立存储过程,逻辑为单条记录的 存在就更新不存在就插入;
2. 在java中通过jdbc调用存储过程,如果是批量数据的话,跟批量插入差不多。
实例代码:
1. 存储过程(postgres数据库):
2. java中调用:
或者 在function,先Update,再 if not found then insert ... end if; 也可以实现。
参考自:http://blog.163.com/digoal@126/blog/static/1638770402011111274336235/
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/
相关文章推荐
- mysql如何实现插入数据时如果不存在则插入如果存在则更新的操作
- android数据库中数据不存在就插入,存在就更新操作方法
- sql 批量操作(存在的更新,不存在的插入)
- sql 批量操作(存在的更新,不存在的插入)
- 数据库记录存在则更新,不存在则插入。
- oracle merge及其他方式实现存在更新不存在插入操作
- MySQL 如何实现插入时如果不存在则插入,如果存在则更新的操作?
- MySQL数据表中记录不存在则插入,存在则更新/不操作
- PostgreSQL数据库如果不存在则插入,存在则更新
- 如何实现插入时如果不存在则插入如果存在则更新的操作(分别用oracle、MySQL和SQL Server实现)
- PostgreSQL数据库如果不存在则插入,存在则更新
- java连接数据库后进行更新插入操作
- C#使用SqlBulkCopy将DataTable写入数据库的表中(表不存在则创建新表,数据存在则更新,不存在则插入)
- postgresql数据库 如果存在则更新(update),如果不存在则插入(insert)
- mysql如何实现插入时如果不存在则插入如果存在则更新的操作?
- 数据库优化——删除和更新操作对性能的影响
- JAVA操作数据库-->从一张表中取值,经过判断,然后插入另一张表中。
- mysql 存在该记录则更新,不存在则插入记录的sql
- mysql 存在该记录则更新,不存在则插入记录的sql
- MySQL 当记录不存在时插入,当记录存在时更新