Mybatis 主键插入回显

一. 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>

在这里插入图片描述

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

参考资料

  1. Oracle序列创建和使用
  2. Oracle和MySQL插入数据后返回主键ID
  3. ORACLE-序列
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你在使用MyBatis查询DATE类型的数据时,回显成了时间戳,可以尝试在MyBatis配置文件中修改对应的类型处理器。 在MyBatis中,类型处理器(TypeHandler)是用来处理Java类型和JDBC类型之间的转换的。对于DATE类型的数据,默认情况下,MyBatis会使用Java的java.util.Date类型来映射,而JDBC中的Date类型对应的是SQL的DATE类型,这两者之间的转换需要使用类型处理器来实现。 如果你想要将DATE类型的数据回显成Java的Date类型,可以在MyBatis配置文件中添加如下的配置: ``` <typeHandlers> <typeHandler handler="org.apache.ibatis.type.DateTypeHandler" jdbcType="DATE" /> </typeHandlers> ``` 这样,MyBatis就会使用org.apache.ibatis.type.DateTypeHandler类型处理器来处理Java的Date类型和JDBC的DATE类型之间的转换。 如果你想要将DATE类型的数据回显成Java的字符串类型,可以在MyBatis配置文件中添加如下的配置: ``` <typeHandlers> <typeHandler handler="org.apache.ibatis.type.DateTypeHandler" jdbcType="DATE"> <property name="javaType" value="java.lang.String" /> <property name="jdbcType" value="DATE" /> </typeHandler> </typeHandlers> ``` 这样,MyBatis就会使用org.apache.ibatis.type.DateTypeHandler类型处理器将DATE类型的数据转换成Java的字符串类型。需要注意的是,这里的javaType属性和jdbcType属性都需要设置,否则可能会出现类型转换异常的问题。 希望这些信息对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值