在Mybatis中,有三個位置可以設置 參數“useGeneratedKeys”:
1、在setting元素中設置 useGeneratedKeys參數,對於支持自動生成主鍵的數據庫,如 mysql,sql server,此時設置useGeneratedKeys爲 true,在執行插入記錄之後,可以讀取到數據庫自動生成的主鍵ID。
在setting元素中設置的useGeneratedKeys是一個全局的參數,但是隻是對接口接口映射器產生影響,對xml映射器無效
<settings>
<!--
允許JDBC支持自動生成主鍵,需要驅動兼容。 如果設置爲true則這個設置強制使用自動生成主鍵,儘管一些驅動不能兼容但仍可正常工作(比如 Derby)。
-->
<setting name="useGeneratedKeys" value="true" />
</settings>
此時,在接口映射中添加記錄之後將返回主鍵ID。
public interface TestMapper {
// 受全局useGeneratedKeys參數控制,添加記錄之後將返回主鍵id
@Insert("insert into test(name,descr,url,create_time,update_time) values(#{name},#{descr},#{url},now(),now())")
Integer insertOneTest(Test test);
}
此時,如果在接口映射器中設置 useGeneratedKeys = false,那麼添加記錄將不再返回記錄ID,該設置優先級高
// 在接口映射器中設置的useGeneratedKeys參數值將會覆蓋在settings元素中設置全局useGeneratedKeys參數值
@Options(useGeneratedKeys = false, keyProperty = "id", keyColumn = "id")
@Insert("insert into test(name,descr,url,create_time,update_time) values(#{name},#{descr},#{url},now(),now())")
Integer insertOneTest(Test test);
2、在XML映射器中配置useGeneratedKeys參數
<!-- 插入數據:返回記錄的id值 -->
<insert id="insertOneTest" parameterType="org.chench.test.mybatis.model.Test" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into test(name,descr,url,create_time,update_time) values(#{name},#{descr},#{url},now(),now())
</insert>
xml映射器中配置的useGeneratedKeys參數只會對xml映射器產生影響,且在settings元素中設置的全局useGeneratedKeys參數值對於xml映射器不產生任何作用。
3、在接口映射器中設置useGeneratedKeys參數
// 設置useGeneratedKeys爲true,返回數據庫自動生成的記錄主鍵id
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
@Insert("insert into test(name,descr,url,create_time,update_time) values(#{name},#{descr},#{url},now(),now())")
Integer insertOneTest(Test test);
附:oracle數據庫不支持AUTO_INCREMENT列,她是使用序列生成自增主鍵的;
oracle在插入記錄時,如果也想返回當前記錄的id,可以這樣寫:
<insert id="insertStudent" parameterType="Student">
<selectKey keyProperty="studId" resultType="int" order="BEFORE">
SELECT my_seq.nextval FROM DUAL
</selectKey>
INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL, PHONE)
VALUES(#{studId},#{name},#{email},#{phone})
</insert>
這裏我們使用了 selectKey 子元素來生成主鍵值,並將值保存到Student對象的studId 屬性上。屬性order=“before”表示MyBatis將取得序列的下一個值作爲主鍵值,並且在執行INSERT語句之前將值設置到studId屬性上。
注:SelectKey需要注意order屬性,像MySQL、SQLServer等一類支持自動增長類型的數據庫中,order需要設置爲after纔會取到正確的值。
像Oracle這樣取序列的情況,需要設置爲before,否則會報錯。