MyBatis中主鍵回填的兩種實現方式

江南一點雨發表於2019-04-24

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

原生寫法

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

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

public int insert(Person person) {
    Connection con = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    con = DBUtils.getConnection();
    ps = con.prepareStatement("INSERT INTO person(username,password,money) VALUES(?,?,?)", PreparedStatement.RETURN_GENERATED_KEYS);
    ps.setObject(1, person.getUsername());
    ps.setObject(2, person.getPassword());
    ps.setObject(3, person.getMoney());
    int i = ps.executeUpdate();
    rs = ps.getGeneratedKeys();
    int id = -1;
    if (rs.next()) {
        id = rs.getInt(1);
    }
    return id;
}
複製程式碼

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

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

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

框架寫法

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

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

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

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

方式一

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

<insert id="insertBook" useGeneratedKeys="true" keyProperty="id">
    insert into t_book (b_name,author) values (#{name},#{author});
</insert>
複製程式碼

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

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

方式二

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

<insert id="insertBook">
    <selectKey keyProperty="id" resultType="java.lang.Integer">
        SELECT LAST_INSERT_ID()
    </selectKey>
    insert into t_book (b_name,author) values (#{name},#{author});
</insert>
複製程式碼

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

注意第二種方式一樣也要通過設定 keyProperty 來指定將查詢到的資料繫結到哪個屬性上。

總結

好了,本文向大家介紹了 MyBatis 中主鍵回填的兩種方式,大家有沒有 get 到呢?有問題歡迎留言討論。

關注公眾號牧碼小子,專注於 Spring Boot+微服務,定期視訊教程分享,關注後回覆 Java ,領取鬆哥為你精心準備的 Java 乾貨!

MyBatis中主鍵回填的兩種實現方式

相關文章