MyBatis 在insert插入操作時返回主鍵ID的配置
阿新 • • 發佈:2019-01-07
很多時候,在向資料庫插入資料時,需要保留插入資料的id,以便進行後續的update操作或者將id存入其他表作為外來鍵。
但是,在預設情況下,insert操作返回的是一個int值,並且不是表示主鍵id,而是表示當前SQL語句影響的行數。
接下來,我們看看MyBatis如何在使用MySQL和Oracle做insert插入操作時將返回的id繫結到物件中。
對於 MySQL 資料庫只需要設定 keyProperty、keyColumn、useGeneratedKeys 屬性
對於 Oracle 資料庫. 使用 selectKey<!-- 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用法中,需要注意的是:由於Oracle沒有自增長一說法,只有序列這種模仿自增的形式,所以不能再使用“useGeneratedKeys”屬性。 而是使用<selectKey>將ID獲取並賦值到物件的屬性中,insert插入操作時正常插入id。<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>