当我们用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();
}
这样感觉就不怎么好看了,而且效率也不怎么样。
优化方法如下:
实例代码:
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;
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>
本站主要用于日常笔记的记录和生活日志。本站不保证所有内容信息可靠!(大多数文章属于搬运!)如有版权问题,请联系我立即删除:“abcdsjx@126.com”。
QQ: 1164453243
邮箱: abcdsjx@126.com