MyBatis 獲取自增主鍵

LZC發表於2020-02-18

實體類屬性如下

public class User {
    private Integer id;
    private String username;
    private String userEmail;
    private String userCity;
    private Integer age;
    // 省略get、set方法
}

如果資料庫支援自動生成主鍵的欄位(比如 MySQL 和 SQL Server),那麼可以設定 useGeneratedKeys=”true”,然後再把 keyProperty 設定到目標屬性上就 OK 了,keyProperty設定的是需要對映到實體類中的屬性。

插入單條記錄

介面定義如下

public int addUser(User user);

介面對應的 Mapper.xml 定義如下所示

<insert id="addUser"
        parameterType="com.example.mybatis.entity.User"
        useGeneratedKeys="true"
        keyProperty="id">
    insert into user
    (username, user_email, user_city, age)
    values (#{username}, #{userEmail}, #{userCity}, #{age})
</insert>

Mybatis會將獲取到的自增主鍵設定到User類中的id屬性

插入多條記錄

介面定義如下

public int addUserList(List<User> userList); 

介面對應的 Mapper.xml 定義如下所示

<insert id="addUserList"
        parameterType="com.example.mybatis.entity.User"
        useGeneratedKeys="true"
        keyProperty="id">
    insert into user
    (username, user_email, user_city, age)
    values
    <foreach item="item" collection="list" separator=",">
        (#{item.username}, #{item.userEmail}, #{item.userCity}, #{item.age})
    </foreach>
</insert>

特殊情況

對於不支援自動生成型別的資料庫或可能不支援自動生成主鍵的 JDBC 驅動,MyBatis 有另外一種方法來生成主鍵。這裡有一個簡單的示例,透過select unix_timestamp(now())可以獲取當前時間戳

<insert id="addUser">
    <selectKey keyProperty="id" resultType="int" order="BEFORE">
        select unix_timestamp(now())
    </selectKey>
    insert into user
    (id, username, user_email, user_city, age)
    values (#{id}, #{username}, #{userEmail}, #{userCity}, #{age})
</insert>

在上面的示例中,selectKey元素中的語句將會首先執行,User的 id 會被設定,然後插入語句會被呼叫。這可以提供給你一個與資料庫中自動生成主鍵類似的行為,同時保持了 Java 程式碼的簡潔。

selectKey 元素描述如下:

<selectKey
  keyProperty="id"
  resultType="int"
  order="BEFORE"
  statementType="PREPARED">
屬性 描述
keyProperty selectKey 語句結果應該被設定的目標屬性。如果希望得到多個生成的列,也可以是逗號分隔的屬性名稱列表。
keyColumn 匹配屬性的返回結果集中的列名稱。如果希望得到多個生成的列,也可以是逗號分隔的屬性名稱列表。
resultType 結果的型別。MyBatis 通常可以推斷出來,但是為了更加精確,寫上也不會有什麼問題。MyBatis 允許將任何簡單型別用作主鍵的型別,包括字串。如果希望作用於多個生成的列,則可以使用一個包含期望屬性的 Object 或一個 Map。
order 這可以被設定為 BEFORE 或 AFTER。如果設定為 BEFORE,那麼它會首先生成主鍵,設定 keyProperty 然後執行插入語句。如果設定為 AFTER,那麼先執行插入語句,然後是 selectKey 中的語句 - 這和 Oracle 資料庫的行為相似,在插入語句內部可能有嵌入索引呼叫。
statementType 與前面相同,MyBatis 支援 STATEMENT,PREPARED 和 CALLABLE 語句的對映型別,分別代表 PreparedStatement 和 CallableStatement 型別。
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章