MyBatis insert操作插入,返回主鍵from官方

xusir發表於2013-10-21

下面就是 insert,update 和 delete 語句的示例:

<insert id="insertAuthor" parameterType="domain.blog.Author">
  insert into Author (id,username,password,email,bio)
  values (#{id},#{username},#{password},#{email},#{bio})
</insert>

  

如前所述,插入語句有一點多,它有一些屬性和子元素用來處理主鍵的生成。

首先,如果你的資料庫支援自動生成主鍵的欄位(比如 MySQL 和 SQL Server) ,那麼 你可以設定 useGeneratedKeys=”true”,而且設定 keyProperty 到你已經做好的目標屬性上。 例如,如果上面的 Author 表已經對 id 使用了自動生成的列型別,那麼語句可以修改為:

<insert id="insertAuthor" parameterType="domain.blog.Author" useGeneratedKeys="true"
    keyProperty="id">
  insert into Author (username,password,email,bio)
  values (#{username},#{password},#{email},#{bio})
</insert>

  

MyBatis 有另外一種方法來處理資料庫不支援自動生成型別,或者可能 JDBC 驅動不支 持自動生成主鍵時的主鍵生成問題。

這裡有一個簡單(甚至很傻)的示例,它可以生成一個隨機 ID(可能你不會這麼做, 但是這展示了 MyBatis 處理問題的靈活性,因為它並不真的關心 ID 的生成):

<insert id="insertAuthor" parameterType="domain.blog.Author">
  <selectKey keyProperty="id" resultType="int" order="BEFORE">
    select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1
  </selectKey>
  insert into Author
    (id, username, password, email,bio, favourite_section)
  values
    (#{id}, #{username}, #{password}, #{email}, #{bio}, #{favouriteSection,jdbcType=VARCHAR})
</insert>

PS:以上selectKey裡你可以修改為其它的主鍵生成方式如

SELECT user_info$seq.NEXTVAL FROM DUAL

在上面的示例中,selectKey 元素將會首先執行,Author 的 id 會被設定,然後插入語句 會被呼叫。 這給你了一個簡單的行為在你的資料庫中來處理自動生成的主鍵, 而不需要使你 的 Java 程式碼變得複雜。

selectKey 元素描述如下:

<selectKey
  keyProperty="id"
  resultType="int"
  order="BEFORE"
  statementType="PREPARED">
屬性描述
keyProperty selectKey 語句結果應該被設定的目標屬性。
resultType 結果的型別。MyBatis 通常可以算出來,但是寫上也沒有問題。 MyBatis 允許任何簡單型別用作主鍵的型別,包括字串。
order 這可以被設定為 BEFORE 或 AFTER。如果設定為 BEFORE,那 麼它會首先選擇主鍵, 設定 keyProperty 然後執行插入語句。 如果 設定為 AFTER,那麼先執行插入語句,然後是 selectKey 元素- 這和如 Oracle 資料庫相似,可以在插入語句中嵌入序列呼叫。
statementType 和前面的相 同,MyBatis 支援 STA TEMENT ,PREPARED 和 CALLABLE 語句的對映型別,分別代表 PreparedStatement 和 CallableStatement 型別。

 

   

相關文章