MyBatis 插入记录同时获取主键

MyBatis 插入记录同时获取主键

MyBatis 插入记录同时获取主键的系统界面

useGeneratedKeys 属性

keyProperty 属性

keyColumn 属性

selectKey 元素

注意点: 获取的主键的主键被设置到对象的属性中,而不是当作返回值。
  1. useGeneratedKeys属性实现,指定值为 true,则 MyBatis 会自动插入记录生成的主键放入对象中。

useGeneratedKeys属性,这种方法只适用于支持自增主键的数据库。如 MySQL,不适用于序列主键的 Oracle 。Mybatis 会使用 JDBC 的 getGeneratedKeys 方法来取得由数据库内部生成的主键。获得主键的值后赋给 keyProperty 配置的属性,当需要设置多个属性时使用逗号隔开,多个主键的还需要设置 keyColumn 属性,按顺序指定数据库的列,这里列的值会与 keyProperty 配置的属性一一对应。

<insert id="insert" parameterType="com.pinyougou.pojo.TbSpecification" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
    insert into tb_specification (id, spec_name)
    values (#{id,jdbcType=BIGINT}, #{specName,jdbcType=VARCHAR})
</insert>
  1. selectKey元素实现。

该方式支持所有数据库,无论是自增主键还是序列主键的。

在 MySQL 数据库中,order 属性设置为 AFTER ,因为当前记录的主键值在 insert 语句执行成功后才能获取到。而在 oracle 数据库中,order 属性设置为 BEFORE , Oracle 需要先从序列获取值再把值插入数据库中。

<!-- 演示 -->
<selectKey resultType="Integer" order="AFTER" keyProperty="user.userId">
    SELECT LAST_INSERT_ID() AS userId
</selectKey>

<!-- 实例 -->
<insert id="insert" parameterType="com.pinyougou.pojo.TbGoods" >
    <selectKey resultType="Long" keyProperty="id" keyColumn="goodsId" order="AFTER">
        SELECT LAST_INSERT_ID() AS goodsId
    </selectKey>
    insert into tb_goods (
        id, 
        seller_id, 
        goods_name, 
        default_item_id, 
        audit_status, 
        is_marketable, 
        brand_id, 
        caption, 
        category1_id, 
        category2_id, 
        category3_id, 
        small_pic, 
        price, 
        type_template_id, 
        is_enable_spec, 
        is_delete
    )
    values (
        #{id,jdbcType=BIGINT}, 
        #{sellerId,jdbcType=VARCHAR}, 
        #{goodsName,jdbcType=VARCHAR}, 
        #{defaultItemId,jdbcType=BIGINT}, 
        #{auditStatus,jdbcType=VARCHAR}, 
        #{isMarketable,jdbcType=VARCHAR}, 
        #{brandId,jdbcType=BIGINT}, 
        #{caption,jdbcType=VARCHAR}, 
        #{category1Id,jdbcType=BIGINT}, 
        #{category2Id,jdbcType=BIGINT}, 
        #{category3Id,jdbcType=BIGINT}, 
        #{smallPic,jdbcType=VARCHAR}, 
        #{price,jdbcType=DECIMAL}, 
        #{typeTemplateId,jdbcType=BIGINT}, 
        #{isEnableSpec,jdbcType=VARCHAR}, 
        #{isDelete,jdbcType=VARCHAR}
    )
</insert>

MySQL 数据库中测试

SELECT LAST_INSERT_ID() AS userId;

insert into tb_brand values(null, '1', '2');

LAST_INSERT_ID() 可以获取插入记录的 id ,但是应该开启事务吧。因为执行了2条语句。

以下是其它支持自增主键的数据库配置 selectKey 中返回主键的 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

上一篇:MySQL_bigint(20) 是什么意思?


下一篇:快学Scala 第一章课后练习