在 基于XML的Mapper配置 —— resultType 和 resultMap 我们以 select 为例来学习 Mapper 配置中的大部分属性,其实我们的增删改查操作过程中,使用到的属性几乎差不多,这里就不用一一赘述了,我们主要看下 insert 操作中对于自增长主键的处理。
我们都知道我们日常工作中,我们几乎都是使用自增主键,那么我们接下来的业务需要使用该主键,那么我们获取该数据库自动生成的自增主键呢?
我们先来看看我们基本 insert 操作的用法
这时我们可以去数据库中查询一下,发现没有数据被插入,还是原来的几条
这里和我们 select 操作不同的是,我们需要进行 commit 提交一下
这里想要获取我们 MySQL 数据库自动生成的主键就需要使用如下两个属性:
| 属性 | 描述 |
|---|---|
| useGeneratedKeys | (仅对 insert 和 update 有用)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段),默认值: false。 |
| keyProperty | (仅对 insert 和 update 有用)唯一标记一个属性, MyBatis 会通过 getGeneratedKeys 的返回值或者通过 insert 语句的 selectKey 子元素设置它的键值,默认: unset。 如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。 |
上述两个属性就可以获取我们数据库自动增长的主键,我们还可以使用另一种方式 —— LAST_INSERT_ID(),如下
或者使用 @@IDENTITY 方法来获取其自动主键
LAST_INSERT_ID() 和 @@IDENTITY
LAST_INSERT_ID()
LAST_INSERT_ID()是基于 Connection 的,只要每个线程都使用独立的 Connection 对象,LAST_INSERT_ID 函数 将返回该 Connection 对 AUTO_INCREMENT 列最新的 insert or update 作生成的第一个 record 的ID。
这个值不能被其它客户端(Connection)影响,保证了你能够找回自己的 ID 而不用担心其它客户端的活动,而且不需要加锁。
使用单 INSERT 语句插入多条记录, LAST_INSERT_ID返回一个列表。如果你一次插入了多条记录,这个函数返回的是第一个记录的ID值。
@@IDENTITY
@@identity 是表示的是最近一次向具有 identity 属性(即自增列)的表插入数据时对应的自增列的值,是系统定 义的全局变量。
一般系统定义的全局变量都是以 @@ 开头,用户自定义变量以 @ 开头。比如有个表A,它的自增列是id,当向A表插入一行数据后,如果插入数据后自增列的值自动增加至101,则通过 select @@identity 得到的值就是101。使用 @@identity 的前提是在进行 insert 操作后,执行select @@identity的时候连接没有关闭,否则得到的将是NULL值。
如果你一次插入了多条记录,这个函数返回的是第一个记录的ID值,@@IDENTITY 返回最后一条。
还有一点需要注意的是,我们上述方法 useGeneratedKeys 和 keyProperty 是针对具有自动递增的关系型数据库,如 MySQL 和 SQL Server 。
如果是 Oracle 数据库呢?那么我们又该如何使用呢,我们还可以使用我们的 <SelectKey> 标签,如下
其中我们可以看一下 order 标签里的内容,我们 MySQL 里是 AFTER ,因为我们 MySQL 是把准备插入的数据插入表中后才生成的主键,而 Oracle 是先通过 Sequence 拿到了主键信息,才开始向表中插入数据。