1. 程式人生 > >MyBatis 在insert插入操作時返回主鍵ID的配置

MyBatis 在insert插入操作時返回主鍵ID的配置

很多時候,在向資料庫插入資料時,需要保留插入資料的id,以便進行後續的update操作或者將id存入其他表作為外來鍵。 但是,在預設情況下,insert操作返回的是一個int值,並且不是表示主鍵id,而是表示當前SQL語句影響的行數。 接下來,我們看看MyBatis如何在使用MySQL和Oracle做insert插入操作時將返回的id繫結到物件中。 對於 MySQL 資料庫只需要設定 keyProperty、keyColumn、useGeneratedKeys 屬性
<!--
     keyProperty: 把主鍵值賦給 bean 的哪一個屬性
     keyColumn: 使用哪一列的值來進行賦值
     useGeneratedKeys="true": 使用自增的方式來生成主鍵值
-->
<insert id="testDatabaseId" databaseId="mysql"
     keyProperty="id" keyColumn="id" useGeneratedKeys="true">
     INSERT INTO students(last_name, birth)
     VALUES(#{lastName}, #{birth})
</insert>
對於 Oracle 資料庫. 使用 selectKey
<insert id="testDatabaseId" databaseId="oracle">
     <!--
          對於 Oracle 而言, 需要使用 selectKey 來生成主鍵值,
          order="BEFORE": 先於 INSERT 執行
          selectKey 的標籤體: 指定生成主鍵的查詢語句. SELECT 序列名.nextval FROM dual
          keyColumn: 使用哪一列的值來進行賦值 ,在oracle中可以省略不寫
          keyProperty: 把標籤體的查詢結果賦給 bean 的哪一個屬性.
          resultType: 執行標籤體查詢的結果型別.
          注意: 下面編寫 SQL 時, 主鍵不能再次使用序列生成. 而要使用 #{keyProperty}
     -->
     <selectKey order="BEFORE"
          keyColumn="id"  keyProperty="id" resultType="int">
          SELECT my_seq.nextval FROM dual
     </selectKey>

     INSERT INTO students(id, last_name, birth)
     VALUES(#{id}, #{lastName}, #{birth})
</insert>
    注意:Oracle用法中,需要注意的是:由於Oracle沒有自增長一說法,只有序列這種模仿自增的形式,所以不能再使用“useGeneratedKeys”屬性。 而是使用<selectKey>將ID獲取並賦值到物件的屬性中,insert插入操作時正常插入id。