1. 程式人生 > >java操作資料庫 存在就更新不存在就插入的優化操作

java操作資料庫 存在就更新不存在就插入的優化操作

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

或者 在function,先Update,再 if not found then insert ... end if; 也可以實現。

參考自:http://blog.163.com/[email protected]/blog/static/1638770402011111274336235/

相關推薦

java操作資料庫 存在更新存在插入優化操作

  當我們用java,jdbc 或者 spring的jdbctemplate來操作資料時候,總有時候會碰到 存在就插入不存在就更新 這樣的需求,我們一般都是用下面的方法解決 public void save(){ JdbcTemplate jdbc = getJd

jdbctemplete 存在更新存在插入優化操作

  當我們用java,jdbc 或者 spring的jdbctemplate來操作資料時候,總有時候會碰到 存在就插入不存在就更新 這樣的需求,我們一般都是用下面的方法解決 public void save(){ JdbcTemplate jdbc = getJdbc(); String

mysql insert判斷記錄存在 存在即更新存在即插入 DUPLICATE key update

當判斷一條記錄是否存在不是唯一的主鍵而是多個條件的時候就懵了啊。。 當這種情況出現時當然還是要用  DUPLICATE key update關鍵詞了  但是但是 是有前提條件的,,因為我們是三個條件判斷記錄是否存在,這個時候必須用到了聯合主鍵,,什麼事聯合主鍵 百度吧  語句

java連線資料庫後進行更新插入操作

接上一次的查詢操作,這次將更新與插入的程式碼補充 首先是服務端的接收端,接收到客戶端的請求則傳送相應操作 if ("1".equals(message)) { //從mysql資料庫倉庫中查詢資料 jc.mysqlSelect("selec

關於MYSQL進行insert操作時,存在則更新存在則插入的解決辦法

在專案開發中經常會遇到資料頻發插入操作且需要進行判斷,這樣會業務層多一次判斷的操作,多請求一次資料庫,造成效能問題,所以採用以下辦法解決了這個令人藍瘦的問題。。。 這裡是一個使用者運動記錄表,記錄使用者每天的運動時間,走的路程,消耗的能量和走的步數,前臺是定時一分鐘向後臺傳送

sql 存在即更新存在則插入的另一種寫法

CREATE PROCEDURE [dbo].[P_ExtensionLinkCount] @BeginDate date AS BEGIN declare @Now date, @Yesterday date, -- 昨天 @IsRefresh

SSIS處理匯入資料時, 存在的更新, 存在的插入

Ø首先新增匯入資料的源 Ø右鍵單擊“連線管理器”區域中的任意位置,再單擊“新建平面檔案連線”。 Ø在“平面檔案連線管理器編輯器”對話方塊的“連線管理器名稱”欄位中,鍵入 Source。 Ø單擊“瀏覽”。 Ø在“開啟”對話方塊中,瀏覽並找到“d:/test/t1.txt”檔案。 Ø“常規”選項中,

假設利用兩個線性表La和Lb分別表示兩個集合A和B(即線性表中的資料元素即為集合中的成員),現要求一個新的 集合A=AUB。這要求對線性表作如下操作:擴大線性表La,將存在於線性表Lb中而不存在於線

/*假設利用兩個線性表La和Lb分別表示兩個集合A和B(即線性表中的資料元素即為集合中的成員),現要求一個新的 集合A=AUB。這就要求對線性表作如下操作:擴大線性表La,將存在於線性表Lb中而不存在於線性表La中的資料元素插入 到線性表La中去,只要從線性表Lb中依次取得

chrome瀏覽器更換favicon.ico後更新解決方案

avi get 什麽 favicon chrome 方案 lan chrome瀏覽器 圖片 chrome瀏覽器更換favicon.ico後不更新緩存 1、按ctrl+F5強制刷新或網頁上右鍵重新載入。2、再不行就刪除緩存。3、但這樣太討厭了,還有個小竅門屢試不爽,那就是直接

基於Html5 Plus + Vue + Mui 移動App開發(三)-文件操作(讀取、保更新數據)

mes das parse 移動 分享 gif ont 包括 ole   實全資訊采用基於Html5 Plus + Vue + Mui 移動App。主要實現功能包括: 實現搜索站點設置 實現搜索關鍵字定義 實現搜索資訊保存、刪除功能。 主界面實現關鍵字搜

Java模型 ,一篇夠了!

滿足 繼續 而且 undefine 按順序 發生 得到 一次 有變 Java 虛擬機 我們都知道 Java 語言的可以跨平臺的,這其中的核心是因為存在 Java 虛擬機這個玩意。虛擬機,顧名思義就是虛擬的機器,這不是真實存在的硬件,但是卻可以和不同的底層平臺進行交互

開源重磅,java內容管理系統CMS,點擊可以編輯,保,輕松構建自己的站點

高效 tps sta -m nts -a 其它 內存 trunk 買的暫時空間不給力。內存不足,老給關閉,先轉到京東雲上了,免費的,也不知免費多久。 這是地址2?

robotframework 判斷下拉框是否存在,如果存在執行下拉框操作存在跳過執行下拉框操作,進行下一步操作

新頁面 存在 robot sel log 是否 work val image #本人新手,僅做學習記錄之用 因為工作要求,打開的ui頁面,根據前面篩選的條件不同,跳轉的新頁面不同,本記錄涉及的就是有下拉框和沒有下拉框,所以要對新打開的頁面進行判斷;run keyword

java 基礎概念 -- 數組與內控制

nbsp 堆內存 數組元素 art pan popu ace article pac 問題1: Java在聲明數組的過程中,是怎樣分配內存的? 在棧內存中 建一個數組變量,再在堆內存中 建一個 數組對象。至於詳細的內存分配細節,還得看 該初始化是 數組動態初始化 還是

java中將int類型數據到數組中

number nbsp 微軟雅黑 微軟 代碼 family span left 我們 //定義一個數據 int number = 123456; //定義一個數組 int[] arr = new int[8]; //通過觀察這個代碼,我們發現應該是可以通過循

spark項目啟動報內溢出能創建線程錯誤

def span 占用 nbsp ssp 數據 mes 線程數 listen 1.錯誤信息如下: java.lang.OutOfMemoryError: unable to create new native thread at java.lang.Thread.st

4.3-全棧Java筆記:面向對象的內分析

java面向對象的內存分析為了讓大家對於面向對象編程有更深入的了解,我們要對程序的執行過程中,內存到底發生了什麽變化,進行剖析,讓大家做到“心中有數”,通過更加形象的方式理解程序的執行方式。老鳥建議: 本節是為了讓初學者更深入了解程序底層執行情況,為了完整的體現內存分析流程,會有些新的名詞,比如

java 庫存 商戶 用戶 進銷 管理系統 SSM springmvc 項目源碼

地址 ext 多代理 管理後臺 月份 圖標 src 無限級別 點對點 需求分析: 有個廠家,下面有很多代理商(商戶或門頭等),之前商戶進貨、庫存、銷售、客戶資料等記錄在excel表格中 或者無記錄,管理比較混亂,盈利情況不明。不能有效了解店鋪經營情況和客戶跟蹤記錄 廠家也不

java寬度優先將二叉樹成數組

元素 max imp tree list() style 排列 順序 源碼 題目: 有一棵二叉樹,請設計一個算法,按照層次打印這棵二叉樹。給定二叉樹的根結點root, 請返回打印結果,結果按照每一層一個數組進行儲存,所有數組的順序按照層數從上往下,且每一層的數組內元素按照從

java對象創建與內模型總結

對象的引用 創建 生命周期 運行時 強制 地址 class文件 發生 停止 1、JVM管轄的內存大致分為三個邏輯部分:java棧(Heap)、java堆(JavaStack)和方法區(MethodArea)。在JVM啟動時創建,關閉時全部回收。      棧、本地方法棧、