一、使用JDBC的方式返回主鍵自增的值
<insert id="insertSysUser" parameterType="SysUser" useGeneratedKeys="true" keyProperty="id" > insert into sys_user(user_name,password,user_info,head_img,create_time) values( #{userName},#{password},#{userInfo},#{headImg},#{createTime}); </insert>
<!--這里僅做主鍵的演示功能,沒有做非空判斷-->
useGeneratedKeys :默認值為 false 如果設置為 true, MyBatis 使用 JDBgetGeneratedKeys 方法來取出由數據庫內部生成的主鍵;
keyProperty: MyBatis 通過 getGeneratedKeys 獲取鍵值后將要賦值的屬性;
二、使用SelectKey返回主鍵的值
使用JDBC返回主鍵的方法只適用於支持主鍵自增的數據庫。有些數據庫(如 Oracle )不提供主鍵自增的功能,而是使用序列得到 個值,然后將這個值賦給 id ,再將數據插入數據庫對於這種情況,可以采用另外 種方式:使用< selectKey>標簽來獲取主鍵的值,這種方式不僅適用於不提供主鍵自增功能的數據庫,也適用於提供主鍵自增功能的數據庫;
<!--這里使用mysql數據庫-->
<insert id="insertSysUser" parameterType="SysUser" > insert into sys_user(user_name,password,user_info,head_img,create_time) values( #{userName},#{password},#{userInfo},#{headImg},#{createTime}); <selectKey keyColumn="id" keyProperty="id" resultType="long" order="AFTER"> SELECT LAST_INSERT_ID () </selectKey> </insert>
Oracle使用selectKey返回自增主鍵
注:Oracle 方式的insert 語句中明確寫出了 id列 和#{id}值,因為執行 selectKey 中的語句后 id 就有值了,我們需要把這個序列值作為主鍵值插入到數據庫中,所以必須指定 id列,如果不指定這一列,數據庫就會因為主鍵不能為空而拋出異常
<selectKey keyColumn="id" keyProperty="id" resultType="long" order="BEFORE" >
SELECT IDSEQUENCE.NEXTVAL FROM DUAL
</selectKey>
selectKey標簽 keyColumn keyProperty和上面useGeneratedKeys的用法含義相同,這esultType用於設置返回值類型rder屬性的設置和使用的數據庫有關MySQL 數據庫中, order 屬性設置的值是 AFTER,因為當前記錄的主鍵值在 insert 語句執行成功后才能獲取 而在 Oracle 數據庫中, order 的值要設置為 BEFORE ,這是因為 Oracl中需要先從序列獲取值,然后將值作為主鍵插入到數據庫中;
其他數據庫使用selectKey返回主鍵如下:
DB2 使用 VALUES IDENTITY VAL LOCAL ()
SQLSERVER 使用 SELECT SCOPE IDENTITY ()。
CLOUDSCAPE 使用 VALUES IDENTITY VAL LOCAL ()
DERBY 使用 VALUES IDENTITY VAL LOCAL ()
HSQLDB 使用 CALL IDENTITY ()
SYBASE 使用 SELE CT @@IDENTITY
DB2_MF 使用 SELECT IDENTITY VAL LOCAL(} FROM SYSIBM SYSDUMMYl
FORMIX 使用 select dbinfo ('sq lea sqlerrdl ’ ) from systables where
tabid=l