新增之后返回对象的自增id值 Mybatis

本文介绍了在MySQL和Oracle数据库中如何使用MyBatis处理自增主键和序列。在MySQL中,通过设置useGeneratedKeys和keyProperty属性,可以获取自增主键值。而在Oracle中,由于没有自增主键,通常利用序列实现类似功能,可以通过BEFORE或AFTER方式的selectKey标签来获取序列值。示例代码详细展示了这两种数据库的实现策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、Mysql当中解决方案

mysql支持自增主键,自增主键值的获取,mybatis也是利用statement.getGenreatedKeys();
useGeneratedKeys=“true”;使用自增主键获取主键值策略
keyProperty;指定对应的主键属性,也就是mybatis获取到主键值以后,将这个值封装给javaBean的哪个属性
 

<insert id="addEmp" parameterType="com.gzl.mybatis.bean.Employee"
	useGeneratedKeys="true" keyProperty="id" databaseId="mysql">
	insert into tbl_employee(last_name,email,gender) 
	values(#{lastName},#{email},#{gender})
</insert>

添加完以上配置之后,接口返回Long也行

public Long addEmp(Employee employee);

在执行完添加之后可以直接用添加的对象

//执行添加方法
xxxMapper.addEmp(employee);
//新增之后的id
employee.getId;

2、Oracle当中解决方案

oracle当中没有主键自增,一般我们都是使用oracle当中的序列来实现主键自增,所以他和mysql当中的解决方案就不一样了。
针对于oracle我们需要使用到selectKey这个标签
selectKey标签当中的属性有:

keyProperty:查出的主键值封装给javaBean的哪个属性
order=“BEFORE”:当前sql在插入sql之前运行
             AFTER:当前sql在插入sql之后运行
resultType:查出的数据的返回值类型‘

BEFORE的用法
EMPLOYEES_SEQ.nextval 代表取EMPLOYEES_SEQ序列的下一个值

<insert id="addEmp" parameterType="com.gzl.mybatis.bean.Employee" databaseId="oracle">
	<selectKey keyProperty="id" order="BEFORE" resultType="Integer">
		<!-- 编写查询主键的sql语句 -->
		select EMPLOYEES_SEQ.nextval from dual 
	</selectKey>
	
	<!-- 插入时的主键是从序列中拿到的 -->
	insert into employees(EMPLOYEE_ID,LAST_NAME,EMAIL) 
	values(#{id},#{lastName},#{email}) 
</insert>

AFTER的用法,这种不建议使用。并发的时候有时候可能会出现返回id不准确的问题。

<insert id="addEmp" parameterType="com.gzl.mybatis.bean.Employee" databaseId="oracle">

	<!-- 插入时的主键是从序列中拿到的 -->
	insert into employees(EMPLOYEE_ID,LAST_NAME,EMAIL) 
	values(employees_seq.nextval,#{lastName},#{email})
	
	<selectKey keyProperty="id" order="AFTER" resultType="Integer">
		 select EMPLOYEES_SEQ.currval from dual
	</selectKey>
</insert>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值