• 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

  • 相关阅读:
    [LeetCode#91]Decode Ways
    [LeetCode#130]Surrounded Regions
    [LeetCode#84]Largest Rectangle in Histogram
    [LeetCode#179]Largest Number
    [LeetCode#187]Repeated DNA Sequences
    [LeetCode#200]Number of Islands
    [LeetCode#268]Missing Number
    [LeetCode#44]Wildcard Matching
    [LeetCode#128]Longest Consecutive Sequence
    1如何给devexpress的gridview控件绘制全选按钮
  • 原文地址:https://www.cnblogs.com/mozq/p/11479529.html
Copyright © 2020-2023  润新知