MyBatis insert 返回主鍵的方法(oracle和mysql)

參考:java

1.http://liuqing9382.iteye.com/blog/1574864mysql

2.http://blog.csdn.net/ultrani/article/details/9351573sql

3.mybatis中文文檔數據庫

 

做者前言:mybatis

使用Mybatis時,對於不一樣數據庫好比Oracle、SQL Server、Mysql,它們的主鍵生成策略是不一樣的:oracle

1. Oracle自增主鍵必須得配一個sequence;dom

2. SQL Server和Mysql的自增使用自動自增設置的;函數

3. 對於非自增的主鍵,項目也可使用數據庫函數來產生惟一主鍵,好比uuid()。
插入操做: 
1. 對於相似mysql、SQL Server這樣自增主鍵的表,插入能夠不配置插入的主鍵列(在sql中顯式的寫出該id);ui

2. 相似Oracle這類使用sequence或者uuid()這種數據庫函數產生惟一主鍵,若是不作觸發器之類的設置的話,通常須要在sql中寫出主鍵列的。spa

獲取主鍵

mybatis針對以上的不一樣生成策略以及不一樣的sql主鍵配置類型,將插入數據返回主鍵的解決方案分爲一下幾個狀況:

1. 若是使用的數據庫支持自動生成主鍵(如:MySQL 和 SQL Server),那麼您就能夠簡單地將 useGeneratedKeys 設置爲」true」,而後使用 keyProperty 設置你但願自動生成主鍵的字段就能夠了

例如,若是 Author 表使用一個字段自動生成主鍵,那麼配置語句就能夠修改成:

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

對於useGeneratedKeys和keyProperty屬性的說明以下圖

2. MyBatis 還有另一種方式爲不支持自動生成主鍵的數據庫及 JDBC 驅動來生成鍵值,下面展現一個可以隨機生成 ID 的例子(也許你不會這麼作,這僅僅是演示 MyBatis 的功能,文檔的詞語,意思像是說至於你作不作,反正我作了):

<insert id="insertAuthor" parameterType="domain.blog.Author">
  <selectKey keyProperty="id" resultType="java.lang.integer" 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標籤,首先解釋以下圖:

正如上面的解釋咱們只要把握住order的設置,在sql語句執行前(BEFORE)或者執行後(AFTER),執行selectKey 語句來得到主鍵就能夠了,如上面例子selectKey首先執行,生成隨機的主鍵,這時候Author對象中的id首先被賦值了,而後纔會調用insert 語句。這至關於在您的數據庫中自動生成鍵值,不須要編寫複雜的 java 代碼。

固然,是否須要配置<selectKey>根據狀況,只要能保證記錄有主鍵便可,一旦配置了<selectKey>,就能夠在執行插入操做時獲取到新增記錄的主鍵。 
注意:若是沒有配置<selectKey>那麼保存後的對象的主鍵依舊爲null。

 

小結:

經過上面的方案:

1. 咱們針對uuid()函數的主鍵返回應該以下:

<insert id="insertTestRole" parameterType="hashmap" >
        <selectKey resultType="java.lang.String" order="BEFORE" keyProperty="id"> SELECT uuid() </selectKey> insert into testRole(id,name) values(#{id},#{name}) </insert>

2. oracle針對Sequence主鍵而言,隱式主鍵插入前必須指定一個主鍵值給要插入的記錄: 

<insert id="AltName.insert" parameterType="AltName">  
     <selectKey resultType="long" keyProperty="id">     SELECT SEQ_TEST.NEXTVAL FROM DUAL   </selectKey>   insert into altname(primaryName,alternateName,type)values(#{primaryName},#{alternateName},#{type}) </insert>

或者顯式主鍵:

<insert id="insertEnterprise" parameterType="hashmap">
        <selectKey resultType="integer" order="AFTER" keyProperty="ENTERPRISE_ID">
            select sq_enterprise.currval from dual </selectKey> insert into m_enterprise (ENTERPRISE_ID,ENTERPRISE_NAME,ENTERPRISE_ADDRESS,ENTERPRISE_INTRODUCTION,ENTERPRISE_ZIP,ENTERPRISE_PHONE,ENTERPRISE_NUMBER) values (sq_enterprise.nextval,#{enterprise_name},#{address},#{introduction},#{zip},#{phone},#{enterprise_number}) </insert>

3. MySql、sql server自增主鍵而言,這類表在插入時不須要主鍵,而是在插入過程自動獲取一個自增的主鍵: 

<insert id="AltName.insert" parameterType="AltName">
        <selectKey resultType="long" keyProperty="id">     SELECT LAST_INSERT_ID()   </selectKey>   insert into altname(primaryName,alternateName,type)values(#{primaryName},#{alternateName},#{type}) </insert>

根據得到自增主鍵的方法,咱們還能夠:

<insert id="AltName.insert" parameterType="AltName">
        <selectKey resultType="long" keyProperty="id">     SELECT @@IDENTITY   </selectKey>   insert into altname(primaryName,alternateName,type)values(#{primaryName},#{alternateName},#{type}) </insert>

可是參考http://blog.csdn.net/ultrani/article/details/9351573 中四種得到自增主鍵的方法利弊分析,做者推薦使用useGeneratedKeys屬性設置來利用JDBC的getGeneratedKeys方法得到自增主鍵。

相關文章
相關標籤/搜索