zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    QOMO Linux 4.0 正式版发布
    LinkChecker 8.1 发布,网页链接检查
    pgBadger 2.1 发布,PG 日志分析
    Aletheia 0.1.1 发布,HTTP 调试工具
    Teiid 8.2 Beta1 发布,数据虚拟化系统
    zLogFabric 2.2 发布,集中式日志存储系统
    开源电子工作套件 Arduino Start Kit 登场
    Piwik 1.9 发布,网站访问统计系统
    Ruby 1.9.3p286 发布,安全修复版本
    toBraille 1.1.2 发布,Java 盲文库
  • 原文地址:https://www.cnblogs.com/mozq/p/11479529.html
Copyright © 2011-2022 走看看