利用Ibatis實現Mysql中的不重複插入記錄

2021-09-01 11:05:40 字數 1168 閱讀 7011

以下討論全部針對mysql資料庫:)

通常業務上至少需要兩種型別的不重複插入記錄的需求:

1、針對上面的第一種,mysql提供了insert into ... on duplicate key update ... 語法(mysql自己的語法,不屬於標準sql)來實現。這種場景相對常見。使用的前提是,需要定義主鍵或者唯一性索引,用來告訴mysql哪些欄位的重複會造成主鍵衝突或者違背唯一性約束條件。當這些情況出現時,就放棄insert操作,轉而執行後面的update操作。上乙個具體的例子,在ibatis中寫的乙個上面邏輯的sql:

insert into t_user_info (employ_id,fans_count,follow_count)

values (#employid#,#fanscount#,#followcount#)

on duplicate key update follow_count=follow_count+1

上面的插入操作就會在employ_id發生主鍵衝突的時候,轉變為更新follow_count欄位(自增乙個單位)。

2、針對上面的第二種,mysql提供了insert ignore into ... 語法(mysql自己的語法,不屬於標準sql)來實現。這種場景相對要少見一些。 使用的前提是,需要定義主鍵或者唯一性索引,原因同上面一致。但不同的就是,違背唯一性約束時,直接忽略這次insert操作,然後啥也不幹了,也不會報錯。。。

但這裡有個問題,就是有時業務本身還是需要知道語句到底執行了insert還是沒有執行!因為需要根據這個反饋資訊,做出不同的處理邏輯。這裡給出使用ibatis時,兩種不同的處理方法。

row_count()是mysql提供可以獲得insert、update、delete這幾種操作成功處理行數的乙個內建函式,有了這個函式,再結合上面給出的selectkey標籤的例子,就可以做到獲得insert ignore時,成功insert的行數。有了這個行數,也就知道了到底有沒有發生insert操作。(發生了插入操作該函式返回值會大於0),於是改編一下上面的sql-map中的sql(注意其中的ignore關鍵字):

利用ibatis的update語句:上面之所以要費勁周折的修改insert語句,時因為ibatis本身的insert不是預設支援返回影響的行數的。但是update語句支援!於是,另外乙個思路,就是利用update語句來完成這個insert操作。

ibatis 物件關係實現

hibernate 的強大在於完全的物件化,對於物件之間的關係解決的比較好,如1對1,1對多,多對1,以及多對多。當然也包括繼承關係。而ibatis這方面就比較遜色了,不過對於也支援簡單的關連查詢,如1對1,和1對多。對於一般的情況來說,這兩種已經足夠了,當然不能層疊更新是乙個缺陷,看了半天文件,也...

ibatis 物件關係實現

hibernate 的強大在於完全的物件化,對於物件之間的關係解決的比較好,如1對1,1對多,多對1,以及多對多。當然也包括繼承關係。而ibatis這方面就比較遜色了,不過對於也支援簡單的關連查詢,如1對1,和1對多。對於一般的情況來說,這兩種已經足夠了,當然不能層疊更新是乙個缺陷,看了半天文件,也...

mysql 利用 mysql利用

mysql 寫入webshell復現 1.直接寫入 windows成功率較高 1.檢視是否允許可寫 空可寫,null不行,5.5以前預設為空,5.5以後預設為null 2.寫入檔案 2.日誌檔案寫入shell 5.0以後會建立日誌檔案 資料庫許可權 1.檢視是否開啟日誌 2.開啟日誌 3.設定路徑 ...