Mybatis 自動生成主鍵

介紹

像MySql、Sql Server有自動生成主鍵(遞增),Oracle只能用序列生成,或者UUID 那麼在MyBatis怎麼處理呢,有兩個處理方式,那麼咱們接下來看看怎麼處理數據庫


編碼

useGeneratedKeys編碼

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

如前所述,插入語句的配置規則更加豐富,在插入語句裏面有一些額外的屬性和子元素用來處理主鍵的生成,並且有多種生成方式。code

首先,若是你的數據庫支持自動生成主鍵的字段(好比 MySQLSQL Server),那麼你能夠設置 useGeneratedKeys=」true」,而後再把 keyProperty 設置到目標屬性上就OK了。例如,若是上面的 Author 表已經對 id 使用了自動生成的列類型,那麼語句能夠修改成:xml

<insert id="insertAuthor" useGeneratedKeys="true"
    keyProperty="id">
  insert into Author (username, password, email, bio) values
  <foreach item="item" collection="list" separator=",">
    (#{item.username}, #{item.password}, #{item.email}, #{item.bio})
  </foreach>
</insert>

固然上述只能經過哪些有自動生成功能的數據庫,那麼在Oracle怎麼處理這個事情呢?或者有其餘方式生成隨機數等等嗎?索引


selectKey字符串

對於不支持自動生成類型的數據庫或可能不支持自動生成主鍵 JDBC 驅動來講,MyBatis 有另一種方法來生成主鍵。it

這裏有一個簡單(甚至很傻)的示例,它能夠生成一個隨機 ID(你最好不要這麼作,但這裏展現了 MyBatis 處理問題的靈活性及其所關心的廣度):io

<insert id="insertAuthor">
  <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>

selectKey 元素描述以下:table

<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 類型。
相關文章
相關標籤/搜索