jdbctemplete 存在就更新不存在就插入的優化操作


 

當我們用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();
	 }
			
     });
}

  

 


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM