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; 也可以实现。
0 0
- java操作数据库 存在就更新不存在就插入的优化操作
- mysql,存在就更新,不存在就插入
- SqlServer存在就更新,不存在就插入的写法
- sql存在该记录就更新,不存在就插入
- mysql记录存在就更新不存在就插入
- mysql记录存在就更新不存在就插入
- android数据库中数据不存在就插入,存在就更新操作方法
- mysql和sqlserver存在就更新,不存在就插入的写法
- sql 批量操作(存在的更新,不存在的插入)
- mysql 存在就插入,存在就更新
- Mysql—实现批量插入,存在就更新,不存在就插入
- MySql_插入记录时,存在就更新(或不做任何动作),不存在就添加
- oracle 实现 存在记录就更新,不存在就插入 merge into
- mybatise+oracle添加数据时如果数据存在就更新,如果不存在就插入
- mybatis+oracle添加数据时如果数据存在就更新,如果不存在就插入
- myql_mybatis添加数据时如果数据存在就更新,如果不存在就插入
- mysql如何实现插入数据时如果不存在则插入如果存在则更新的操作
- 数据库-在表中插入数据;如果存在就更新
- java解惑之表达式之谜(谜题5)
- Pat(Basic Level)Practice--1029(旧键盘)
- 《暗时间》 第一部分 读后感
- php中的iterator迭代器(遍历)
- 【微信开发系列】之快速用户增长
- java操作数据库 存在就更新不存在就插入的优化操作
- but the supplied types were (flex.messaging.io.amf.ASObject) and converted to (null)."
- OnMouseHover 与 OnMouseLeave
- Mongo学习笔记(1)
- 【转载】年终总结 & 算法数据的思考 & 结尾彩蛋
- Pat(Basic Level)Practice--1030(完美数列)
- C语言之霍夫曼编码学习
- java中的队列Queue
- 设计模式之模板方法模式(Template)