像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
首先,若是你的數據庫支持自動生成主鍵的字段(好比
MySQL
和SQL 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 類型。 |