1. 程式人生 > >MyBatis中主鍵回填的兩種實現方式

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

tis 容易 配置 resultset upd object values 兩種 什麽

主鍵回填其實是一個非常常見的需求,特別是在數據添加的過程中,我們經常需要添加完數據之後,需要獲取剛剛添加的數據 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中主鍵回填的兩種實現方式