一. Mysql

⏹方式1: 使用属性返回新增记录的ID
useGeneratedKeys属性: 是否使用获取新增记录的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语句的顺序
    mysqlpostgresql是插入语句之后,才能获取到主键的值
    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>

mybatis设置sqlite主键 mybatis主键回显_java

二. 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"
    需要配合触发器使用,当插入数据的时候,通过触发器触发序列查询,得到序列的值