MyBatis获取 insert 返回的主键

方法一:使用JDBC方式返回主键自增的值

在使用主键自增(如MySQL、SQL Server数据库)时,插入数据库后可能需要得到
自增的主键值,然后使用这个值进行一些其他的操作。

可以使用useGeneratedKeys方式
<insert id="add" 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},#{createTime,jdbcType=TIMESTAMP}
    )
</insert>

以上加上具体的jdbcType的值,是为了防止类型错误,对一些特殊的数据类型(DATE、BLOB、TIMESTAMP等等)进行处理

useGeneratedKeys设置为true后,Mybatis会使用JDBC的 getGeneratedKeys方法来取出由数据库内部生成的主键。获得主键值后将其赋值给 keyProperty配置的id属性。当需要设置多个属性时,使用逗号隔开,这种情况下还需要设置 keyColumn属性,按照顺序指定数据库的列,这里列的值会和keyProperty配置的属性一一对应。

方法二:使用selectKey返回主键的值

上面这种写返回主键的方法只适用于支持主键自增的数据库。有些数据库(Oracle)不供主键自增的功能,而是使用序列得到一个值,然后将这个值赋给id,再将数据插入数据库。可以采用标签来获取主键的值。

优点:不仅适用于不提供主键自增功能的数据库,还适用于提供主键自增功能的数据库。

mysql

<insert id="add" >
    insert into sys_user (id, user_name, user_password, 
      user_email, create_time, user_info, 
      head_img)
    values (#{id,jdbcType=INTEGER}, #{userName,jdbcType=VARCHAR}, #{userPassword,jdbcType=VARCHAR}, 
      #{userEmail,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{userInfo,jdbcType=LONGVARCHAR}, 
      #{headImg,jdbcType=LONGVARBINARY})
      <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.Integer">
      SELECT LAST_INSERT_ID()
    </selectKey>
</insert>

oracle

<insert id="add" >
    <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.Integer">
      SELECT SEQ_ID.nextval from dual
    </selectKey>
    insert into sys_user (id, user_name, user_password, 
      user_email, create_time, user_info, 
      head_img)
    values (#{id,jdbcType=INTEGER}, #{userName,jdbcType=VARCHAR}, #{userPassword,jdbcType=VARCHAR}, 
      #{userEmail,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{userInfo,jdbcType=LONGVARCHAR}, 
      #{headImg,jdbcType=LONGVARBINARY})
</insert>

可以发现,selectKey 元素放置的位置和之前MySQL 例子中的不同,其实这个元素防止的位置不会影响 selectKey中的方法在insert 前面或者后面执行的顺序,影响执行顺序的是order 属性。

注意:
Oracle 方式的insert 语句中明确写出了id 列和值#{id},因为执行selectKey
中的语句后 id 就有值了,我们需要把这个序列值作为主键值插入到数据库中,所
以必须指定id列,如果不指定这一列,数据库就会因为主键不能为空而抛出异常。

以下是其他一些支持主键自增的数据库配置 selectKey 中回写主键的SQL。

  • DB2 使用 VALUES IDENTITY_VAL_LOCAL() 。
  • MySql 使用 SELECT LAST_INSERT_ID() 。
  • SQL Server 使用 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.SYSDUMMYl 。
  • IFORMIX 使用 select dbinfo (‘sqlea.sqlerrdl’) from systables where
    tabid=l 。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值