一、使用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