一. Mysql
⏹方式1: 使用属性返回新增记录的IDuseGeneratedKeys
属性: 是否使用获取新增记录的id值keyProperty
属性: 将返回的主键值设置给哪个属性
<insert id="insertUserInfo" parameterType="java.util.Map" useGeneratedKeys="true" keyProperty="id">
insert into t_user (email) values (#{email});
</insert>
⏹方式2: 属性+selectKey
标签返回新增记录的ID
-
keyProperty
属性: 将返回的主键的值设置给指定的属性 -
resultType
属性: 设置id的数据类型 -
order
属性: 设置获取的主键和insert语句的顺序
mysql和postgresql是插入语句之后,才能获取到主键的值
而oracle是采用序列sequence先获取要插入的记录的主键值,然后才执行插入语句
<insert id="insertUserInfo" parameterType="java.util.Map">
<selectKey keyProperty="id" resultType="java.lang.Integer" order="AFTER">
<!-- Mysql使用此函数获取自增后的主键 -->
SELECT LAST_INSERT_ID()
</selectKey>
insert into t_user (email) values (#{email});
</insert>
✅调用
@Service
public class Test5Service {
@Autowired
private TestMapper1 mapper;
public void insertUserInfo() {
Map<String, String> paramMap = new HashMap<>();
paramMap.put("email", "110@qq.com");
// 用来接收主键的返回值
paramMap.put("id", null);
// 当数据插入完成之后,回显的主键值就会放到map的指定的id所对应的value中
mapper.insertUserInfo(paramMap);
System.out.println(paramMap.get("id")); // 7
}
}
二. PostgreSQL
<insert id="inserKariyoyaku" parameterType="Map">
<selectKey keyProperty="kariyoyakuNo" resultType="Integer" order="AFTER">
<!-- 返回最近一次用nextval获取的指定序列的值 -->
SELECT currval('seq_kariyoyaku_no')
</selectKey>
INSERT
INTO 表名 VALUES(
<!-- 递增序列(seq_kariyoyaku_no为主键),并返回新值 -->
nextval('seq_kariyoyaku_no')
, #{updPgId}
, #{addPgId}
, NOW()
, #{deleteFlg}
, #{yoyakuYmd}
)
</insert>
二. Oracle
Oracle的序列是一种数据库对象,其主要工作是用来为表产生唯一值。
- 序列被创建后可以通过数据字典找到序列对象,因此序列可以被多个对象共享。
- 序列的一个典型的用途是创建一个主键的值,它对于每一行必须是唯一的。
- 序列由一个Oracle内部程序产生并增加或减少。
- 序列号独立于表被存储和生成,因此,相同的序列可以被多个表使用。
MySQL数据库有主键自增的功能,但是Oracle数据库没有这个功能,这个时候需要用到序列来完成主键自增的功能.
2.1 序列的创建
CREATE SEQUENCE 序列名 [相关参数]
create sequence seq_student
-- 序列可生成的最小值。(默认不限制最小值,NOMINVALUE)
minvalue 1
-- 序列可生成的最大值。(默认不限制最大值,nomaxvalue)
nomaxvalue
-- 序列的初始值 。(默认1)
start with 1
-- 序列变化的步进,负值表示递减。(默认1)
increment by 1
-- 用于定义当序列产生的值达到限制值后是否循环(NOCYCLE:不循环,CYCLE:循环)。
nocycle
-- 表示缓存序列的个数,数据库异常终止可能会导致序列中断不连续的情况,默认值为20,
-- 如果不使用缓存可设置NOCACHE
nocache ;
2.2 序列的使用
currval
: 表示序列的当前值,新序列必须使用一次nextval 才能获取到值,否则会报错nextval
: 表示序列的下一个值。新序列首次使用时获取的是该序列的初始值,从第二次使用时开始按照设置的步进递增
查询序列的值:
select 序列名称.[currval,nextval] from dual;
查看所有已创建的序列:
select * from user_sequences
SQL语句中使用:
insert into table (id) values (序列名.nextval)
2.3 主键回显
- order=“BEFORE”
<insert id="insertUserInfo" parameterType="java.util.Map">
<!--
order="BEFORE": 在数据插入前,通过序列获取主键的值
先通过序列获取自增的ID的值,然后作为参数插入表中,最后把自增的ID返回
-->
<selectKey keyProperty="id" resultType="java.lang.Integer" order="BEFORE">
SELECT seq_student.nextval as id from dual;
</selectKey>
insert into t_user (id, email) values (#{id}, #{email});
</insert>
- order=''AFTER"
需要配合触发器使用,当插入数据的时候,通过触发器触发序列查询,得到序列的值