MyBatis中主鍵回填的兩種實現方式,程序員快拿小本子記下來!

主鍵回填其實是一個非常常見的需求,特別是在數據添加的過程中,我們經常需要添加完數據之後,需要獲取剛剛添加的數據 id,無論是 Jdbc 還是各種各樣的數據庫框架都對此提供了相關的支持,本文我就來和和大家分享下數據庫主鍵回填在 MyBatis 中的兩種實現思路。

MyBatis中主鍵回填的兩種實現方式,程序員快拿小本子記下來!

原生寫法

框架來源於我們學過的基礎知識,主鍵回填實際上是一個在 JDBC 中就被支持的寫法,有的小夥伴可能不知道這一點,因此這裡我先來說說在 JDBC 中如何實現主鍵回填。

JDBC 中實現主鍵回填其實非常容易,主要是在構造 PreparedStatement 時指定需要主鍵回填,然後在插入成功後,查詢剛剛插入數據的 id ,示例代碼如下:

MyBatis中主鍵回填的兩種實現方式,程序員快拿小本子記下來!

和普通的插入 SQL 不同之處主要體現在兩個地方:

  1. 第一個是構造 PreparedStatement 時,多了一個參數,指定了需要主鍵回填。在更新操作執行完成之後,調用 getGeneratedKeys ,然後又會獲取到一個 ResultSet 對象,從這個遊標集中就可以獲取到剛剛插入數據的id。

這個是原生的寫法,在 MyBatis 中,對此需求提供了兩種不同的實現方案,下面分別來看。

MyBatis中主鍵回填的兩種實現方式,程序員快拿小本子記下來!

框架寫法

一般情況下,主鍵有兩種生成方式:

  1. 主鍵自增長自定義主鍵(一般可以使用UUID,或者類UUID)

如果是第二種,主鍵一般是在Java代碼中生成,然後傳入數據庫執行插入操作,如果是第一個主鍵自增長,此時,Java 可能需要知道數據添加成功後的主鍵。

MyBatis 的基本用法就無需多說了,這也不是本文的重點,我們還是來看看 MyBatis 中主鍵回填的兩種不同實現方式吧!

MyBatis中主鍵回填的兩種實現方式,程序員快拿小本子記下來!

方式一

第一種方式比較簡單,也是松哥推薦的一種實現方式:

MyBatis中主鍵回填的兩種實現方式,程序員快拿小本子記下來!

這種方式比較簡單,就是在插入節點上添加 useGeneratedKeys 屬性,同時設置接收回傳主鍵的屬性。配置完成後,我們執行一個插入操作,插入時傳入一個對象,插入完成後,這個對象的 id 就會被自動賦值,值就是剛剛插入成功的id。

松哥推薦大家使用這種方式,原因很簡單,這種方式實現簡便省事。

方式二

第二種方式則是利用MySQL自帶的 last_insert_id() 函數查詢剛剛插入的id,示例代碼如下:

MyBatis中主鍵回填的兩種實現方式,程序員快拿小本子記下來!

這種方式是在 insert 節點中添加 selectKey 來實現主鍵回填,實際上這種方式的功能更加豐富,因為 selectKey 節點中的 SQL 我們既可以在插入之前執行,也可以在插入之後執行(通過設置節點的 Order 屬性為 AFTER 或者 BEFORE 可以實現),具體什麼時候執行,還是要看具體的需求,如果是做主鍵回填,我們當然需要在插入 SQL 執行之後執行 selectKey 節點中的 SQL。

注意第二種方式一樣也要通過設置 keyProperty 來指定將查詢到的數據綁定到哪個屬性上。

關注小編,更多技術文章奉上,小編這裡還有很多珍貴的尚學堂編程資料,私信領取。

MyBatis中主鍵回填的兩種實現方式,程序員快拿小本子記下來!


分享到:


相關文章: