方法共有2种:
1. 使用JDBC方式返回主键自增的值
在配置insert时使用useGeneratedKeys属性,这种方法只适用于支持自增主键的数据库,如mysql,对于不支持自增主键的数据库不适用,如oracle。useGeneratedKeys设为true后,Mybatis会使用JDBC的getGeneratedKeys方法来取得由数据库内部生成的主键。获得主键的值后赋给keyProperty配置的"id"属性,当需要设置多个属性时使用逗号隔开,多个主键的还需要设置keyColumn属性,按顺序指定数据库的列,这里列的值会与keyProperty配置的属性一一对应。配置如下:
<!-- 新增用户信息(返回主键,使用useGeneratedKeys方式) -->
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
insert into sys_user(user_name, user_password, user_email, user_info, head_img, create_time)
values (#{userName}, #{userPassword}, #{userEmail}, #{userInfo}, #{headImg, jdbcType=BLOB}, SYSDATE())
</insert>
- 使用selectKey返回主键的值
该方式支持所有数据库,无论是自增主键还是序列主键的。配置如下:
<!-- 新增用户信息(返回主键,使用selectKey方式) -->
<insert id="insert">
insert into sys_user(user_name, user_password, user_email, user_info, head_img, create_time)
values (#{userName}, #{userPassword}, #{userEmail}, #{userInfo}, #{headImg, jdbcType=BLOB}, SYSDATE())
<!-- 返回主键 mysql的配置形式,order属性不同的数据库不同 -->
<selectKey keyColumn="id" resultType="long" keyProperty="id" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
</insert>
selectKey标签的keyColumn、keyProperty和上面的useGeneratedKeys的用法含义相同,这里的resultType用于设置返回值的类型。order属性的设置和使用的数据库有关。在Mysql数据库中,order属性设置为AFTER,因为当前记录的主键值在insert语句执行成功后才能获取到。而在oracle数据库中,order属性设置为BEFORE,领导为oracle需要先从序列获取值再把值插入数据库中。oracle的insert语句主键列必须写上,不然会报主键不能为空的错。
以下是其它支持自增主键的数据库配置selectKey中返回主键的SQL
数据库 | 主键SQL |
---|---|
DB2 | VALUES IDENTITY_VAL_LOCAL() |
MYSQL | SELECT LAST_INSERT_ID() |
SQLSERVER | SELECT SCOPE_IDENTITY() |
CLOUDSCAPE | VALUES IDENTITY_VAL_LOCAL() |
DERBY | VALUES IDENTITY_VAL_LOCAL() |
HSQLDB | CALL IDENTITY() |
SYBASE | SELECT @@IDENTITY |
DB2_MF | SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1 |
INFORMIX | select dbinfo(‘sqlca.sqlerrd1’) from systables where tabid=1 |
来自《Mybatis从入门到精通》刘增辉 著