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

MyBatis 插入记录同时获取主键的更多相关文章

  1. mybatis插入数据并获取主键值

    有时候我们的主键是自增的,但是我们想要在插入一条数据以后获取这条数据的主键值,而我们知道,mybatis执行完插入操作以后返回的是生效的记录数.那如何才能获取这个主键值呢. 1.在配置文件mapper ...

  2. MyBatis插入记录时返回主键id的方法

    有时候插入记录之后需要使用到插入记录的主键,通常是再查询一次来获取主键,但是MyBatis插入记录时可以设置成返回主键id,简化操作,方法大致有两种. 对应实体类: public class User ...

  3. mybatis插入的同时获取主键id

    <insert id="insertAndReturnId" parameterType="com.qianlong.cms.entity.AppCmsRole&q ...

  4. Mybatis 插入操作时获取主键 (Oracle 触发器与SEQ)

    1.通过Oracle序列 -- Create sequence create sequence SEQ_DW_EWSYSTEM minvalue 1 maxvalue 9999999999999999 ...

  5. mybatis添加记录时返回主键id

    参考:mybatis添加记录时返回主键id 场景 有些时候我们在添加记录成功后希望能直接获取到该记录的主键id值,而不需要再执行一次查询操作.在使用mybatis作为ORM组件时,可以很方便地达到这个 ...

  6. SpringBoot整合MyBatis获得插入数据后获取主键,返回值总是1

    xml里的写法 <insert id="insertLogin" parameterType="com.xyt.p2p.pojo.LoginInfo" k ...

  7. mybatis 插入数据时返回主键

    在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数:显然,假如主键是你生成后插入的,自然你已经有主键了,显然不需要我们再去获得,所以我们这里处理的是当主键 ...

  8. mybatis插入数据并返回主键(oracle)

    通常我们执行一个inser语句,即使有返回,也只是会返回影响了多少条数据 @insert("insert into t_user (id,name) values (suser.nextva ...

  9. mybatis 插入数据并返回主键值

    <insert id="insert" parameterType="com.pojo.TSubject" useGeneratedKeys=" ...

随机推荐

  1. 解决 cannot find reference 'LSHForest' in '__init__.py'

    from sklearn.neighbors import LSHForest cannot find reference 'LSHForest' in '__init__.py'报错 pip3 li ...

  2. 使用selenium爬虫抓取数据

    写在前面 本来这篇文章该几个月前写的,后来忙着忙着就给忘记了.ps:事多有时候反倒会耽误事.几个月前,记得群里一朋友说想用selenium去爬数据,关于爬数据,一般是模拟访问某些固定网站,将自己关注的 ...

  3. YY工具隐私政策

    YY工具(以下简称“我们”)深知个人信息对您的重要性,并会尽全力保护您的个人信息安全可靠.我们致力于维持您对我们的信任,恪守以下原则,保护您的个人信息:权责一致原则.目的明确原则.选择同意原则.最少够 ...

  4. 我的周记12——"站在现在看前人对未来的预测,很有意思"

    万里风云三尺剑,一庭花草半床书 聊聊最近很火的5G B站有个up主  老师好我叫何同学  优秀啊,点赞. 他做了一个5G测速的视频火啦 视频链接:https://www.bilibili.com/vi ...

  5. decodeURIComponent 解码函数

    想象一个场景,你朋友发一个链接让你打开,但链接是下面其中之一,你会不会想锤死他 1. \u0068\u0074\u0074\u0070\u003a\u002f\u002f\u0062\u0069\u0 ...

  6. 如何给gridControl动态的添加合计

    for (int i = 0; i < this.dsHz.Tables[0].Columns.Count; i++) { if (dsHz.Tables[0].Columns[i].DataT ...

  7. webapi 导入excel处理数据

    参考资料     https://blog.csdn.net/pan_junbiao/article/details/82935992 https://www.cnblogs.com/dansedia ...

  8. Xamarin移动开发备忘

    vs2017下: 1.debug用于本地生成和调试,release用于发布.区别主要在于: 安卓项目的生成选项属性中,开发者模式release是不勾的,而且高级里的cpu不同(debug是x86,re ...

  9. vue3.0和2.0的区别,Vue-cli3.0于 8月11日正式发布,更快、更小、更易维护、更易于原生、让开发者更轻松

    vue3.0和2.0的区别Vue-cli3.0于 8月11日正式发布,看了下评论,兼容性不是很好,命令有不少变化,不是特别的乐观vue3.0 的发布与 vue2.0 相比,优势主要体现在:更快.更小. ...

  10. 图解Java数据结构之单链表

    本篇文章介绍数据结构中的单链表. 链表(Linked List)介绍 链表可分为三类: 单链表 双向链表 循环列表 下面具体分析三个链表的应用. 单链表 链表是有序的列表,它在内存中存储方式如下: 虽 ...