优点

mybatis是一种持久层框架,也属于ORM映射。前身是ibatis。相比于hibernatehibernate为全自动化,配置文件书写之后不需要书写sql语句,但是欠缺灵活,很多时候需要优化;mybatis为半自动化,需要自己书写sql语句,需要自己定义映射。增加了程序员的一些操作,但是带来了设计上的灵活,并且也是支持hibernate的一些特性,如延迟加载,缓存和映射等;对数据库的兼容性比hibernate差。移植性不好,但是可编写灵活和高性能的sql语句。简单易学灵活

提醒:本文主要讲述一下使用MyBatis对MySQL数据库添加记录后获取主键ID的方法,不涉及MS Server或者Oracle,敬请注意。

MyBatis添加记录后获取主键ID,这是一个很常见的需求。这个需求有分为两种情况:(1)添加单条记录时获取主键值;(2)获取批量添加记录时各记录的主键值。

备注:MyBatis从3.3.1版本开始支持批量添加记录并返回各记录主键字段值。

1、添加单一记录时返回主键ID(方法一)

此种方法主要思路是:使用标签或者@Insert注解的属性:useGeneratedKeys、keyProperty、keyColumn。下面分别以xml映射器和注解映射器分别详细阐述一下。

1.1、xml映射器

在定义xml映射器时设置属性useGeneratedKeys值为true,并分别指定属性keyProperty和keyColumn为对应的数据库记录主键字段与Java对象的主键属性。

        insert into t_person(name,sex,age,create_time,update_time)         values(#{name},#{sex},#{age},now(),now())    

1.2 接口映射器

在接口映射器中通过注解@Options分别设置参数useGeneratedKeys,keyProperty,keyColumn值

// 返回主键字段id值@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")@Insert("insert into t_person(name,sex,age,create_time,update_time) values(#{name},#{sex},#{age},now(),now())")Integer insertPerson(Person person);

需要注意的是,在MyBatis中添加操作返回的是记录数并非记录主键id。因此,如果需要获取新添加记录的主键值,需要在执行添加操作之后,直接读取Java对象的主键属性。

Integer rows = sqlSession.getMapper(PersonMapper.class).insertPerson(person);System.out.println("rows = " + rows); // 添加操作返回记录数System.out.println("id = " + person.getId()); // 执行添加操作之后通过Java对象获取主键属性值

添加单一记录时返回主键ID(方法二)

在上面方法一中,如何获取自增的id呢,估计很多人还有点疑惑,其实原理很简单:当插入数据之后,mybatis再次查询mysql数据库,获得了注解id,然后填充到person对象的id属性的。

这个获取主键的过程,可以通过selectKey看得更清楚:

      SELECT LAST_INSERT_ID()        insert into t_person(name,sex,age,create_time,update_time)     values(#{name},#{sex},#{age},now(),now())  

代码说明:

(1)SELECT LAST_INSERT_ID(): 获取刚刚插入的主键;(2)keyProperty:表示将返回的值设置到某一列,此处为id;(3)order:表明此代码相对于insert语句的执行顺序,BEFORE(适用于Oralce等取序列的数据库)/ARTER(适用于MySQL等支持自增长的数据库);(4)resultType:返回的类型;

备注:参考MyBatis @SelectKey注解用法介绍

批量增加记录时返回主键ID

与单条记录插入类似,只不过要注意:parameterType="java.util.List",原理类似,只不过批量插入是针对每个插入对象Person

        insert into t_person(name,sex,age,create_time,update_time)         values                    (            #{item.name},            #{item.sex},            #{item.age},            now(),            now()                )        

最后

小编码字不易,各位大佬转发+关注一手再走好吗。

新增一个主键自增长_使用技巧之——MyBatis如何返回插入主键相关推荐

  1. 通用mapper自增id mysql_mybatis 通用mapper返回插入主键

    查看地址:http://git.oschina.net/free/Mapper/blob/master/wiki/mapper3/3.Use.md 3.主键策略(仅用于insert方法) 通用Mapp ...

  2. 新增一个主键自增长_为什么InnoDB宜用自增主键

    前言 领导:既然自增数字主键会导致主备同步时主键冲突,自增主键能不能砍掉? 答:自增主键主要是技术上提升效率,键冲突可以考虑备库插入时不指定主键值,或者binlog改成row模式,而且, 公司规范:如 ...

  3. EntityFramework Core并发导致显式插入主键问题

    .NET Core 1.1单元测试问题 我们循序渐进,首先从单元测试开始说起,可能其中就有你在.NET Core上进行单元测试会遇到的问题,别着急,不妨一看.我们需要创建.NET Core类库,,如下 ...

  4. mysql主键自增长_全面的MySQL优化面试解析

    本文概要 文章内图片有损,需要高清可以在公众号内回复"大图" 概述 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理 ...

  5. mysql外键约束脚本_使用SQL脚本创建数据库,操作主键、外键与各种约束(MS SQL Server)...

    在实际开发中,可能很少人会手写sql脚本来操作数据库的种种.特别是微软的MS SQL Server数据库,它的SQL Server Management Studio对数据库的图形化操作极致简便,从而 ...

  6. 新增一个主键自增长_第17期:索引设计(主键设计)

    表的主键指的针对一张表中的一列或者多列,其结果必须能标识表中每行记录的唯一性.InnoDB 表是索引组织表,主键既是数据也是索引.主键的设计原则1. 对空间占用要小上一篇我们介绍过 InnoDB 主键 ...

  7. 新增一个主键自增长_MyBatis 示例-主键回填

    测试类:com.yjw.demo.PrimaryKeyTest 自增长列 数据库表的主键为自增长列,在写业务代码的时候,经常需要在表中新增一条数据后,能获得这条数据的主键 ID,MyBatis 提供了 ...

  8. 电脑键盘上每个键的作用_眼看着淡出大众视野 键盘上Esc键的隐秘往事

    众所周知,苹果一些新的Macbook产品线不仅取消了Esc键,而且还对通常用于多数计算机键盘的功能键布局进行了变更. 它们有的被转移到了TouchBar,有的则被永久取消掉了. 那个常标配于每个键盘的 ...

  9. 兀键和6键怎么判断_如何判断分子或离子中的大π键

    它们连贯重叠在一起构成一个整体, p 电子在多个原 子间运动形成 π 型化学键,这种不局限在两个原子之间的 π 键称为离域 π 键或共轭大 π 键. 2. 形成大 π 键的条件是什么? 1 .这些原子 ...

最新文章

  1. 综述 | 森林微生物组:多样性,复杂性和动态变化(IF:11.3)
  2. Java集合框架的知识总结(1)
  3. python cgi nginx_nginx uwsgi和cgi python脚本
  4. python语言入门z-python中a z
  5. 每天一点C++(之四)
  6. html重复标题,在HTML中重复表标题
  7. SharedPreferences基础
  8. 绑定dictionary 给定关键字不再字典中_VBA数组与字典解决方案第51讲:字典嵌套及二级下拉菜单的制作...
  9. java替换html样式_Java Jsoup替换标签的CSS样式
  10. 【BZOJ3566】—概率充电器(树形+概率dp)
  11. css3特效-传送带示例
  12. lync登录时一直停留在登录界面
  13. IMX6DL4.1.15支持EIM总线(上)——实际操作,修改内容。
  14. 重写QLabel实现图片显示框选截取保存
  15. 面积二次矩second moment of area 极惯性矩polar moment of area 转动惯量moment of inertia面积一次矩first moment of area
  16. 双线macd指标参数最佳设置_经典实用的双线MACD指标
  17. python结巴分词 能分英文吗_NLTK(一):英文分词分句
  18. python怎么创建文件夹视频_怎么用python创建文件夹
  19. 100个球两个人轮流拿,每次最多拿n个,谁拿到最后一个球获胜
  20. matlab伽玛函数,[MATLAB数学相关] 求助!类似伽玛函数 带参变量广义积分 积分结果是求极限...

热门文章

  1. android 滚动条 相关属性
  2. vs2015professional过期后登录微软账户仍然不能使用的解决方法
  3. WebAPI Get
  4. MVVM框架从WPF移植到UWP遇到的问题和解决方法
  5. 解决方法:SQL Server 检测到基于一致性的逻辑 I/O 错误 校验和不正
  6. 更换mysql-connector-java-6.0.5jar包后程序出现的两个异常及解决方法
  7. 关于Hive中case when不准使用子查询的解决方法
  8. 【免费下载】2021年7月热门报告盘点(附热门报告列表及下载链接)
  9. sklearn报错DeprecationWarning: the imp module is deprecated in favour of importlib
  10. 对于Neural ODE的小研究