详谈Mybatis中插入数据时注入主键值的几种方法

Mybatis添加数据时给实体类中的主键属性赋值

在我们使用mybatis的过程中,在表中插入某条数据时,通常会传入一个实体类

例如:

@Insert("insert into emp (empno,ename,job) values (#{empno},#{ename},#{job})")
int insert(Emp emp);

​ 但这个实体类的主键字段(这里为empno)在mysql中通常都是设定为自动增长的,通常我们会在插入时给emp对象的主键属性赋值为null,让数据库自动生成empno。但这样做有个问题,当我们插入数据后,要直接从emp对象中获取插入数据的主键值,它依然为null,影响某些特定的功能需求。

哪么如何在插入数据的同时,直接把主键值赋值给emp对象呢

MySql等有自动增长主键列的数据库中有以下做法:

注解版
	@Options(useGeneratedKeys=true,keyProperty="empno",keyColumn="empno")
	@Insert("insert into emp (empno,ename,job) values (#{empno},#{ename},#{job})")
	int insert(Emp emp);

useGeneratedKeys=true:是否使用自增主键

keyColumn:表中主键列名

keyProperty:实体类中主键属性名

xml版
	<insert id="insert1" keyColumn="empno" keyProperty="empno" useGeneratedKeys="true" >
		insert into emp (empno,ename,job) values (#{empno},#{ename},#{job})
	</insert>

通过以上方式就可以获取到empno的属性了

insert(emp);
System.out.println(emp.getEmpno())//11243

然而在oracle数据库中是没有自增列的,这里就要用到另一个标签:

selectKey
	<insert id="insert1">
      <!-- 添加之前查询出主键的值再把值赋给实体类之后再添加 如 oracle 中的 seq_emp.nextval-->
		<selectKey keyColumn="empno" keyProperty="empno"
			order="BEFORE" resultType="int">
			select 8000
<!-- 			orcle中写select sq.nextval from dual -->
		</selectKey>
		insert into emp (empno,ename,job) values (#{empno},#{ename},#{job})
	</insert>

selectKey中写你要执行的查询,可以查询序列值也可以自定义主键值

它前两个属性和上述是一样的,最后一个属性指定了主键的数据类型,比较特别的是order这个属性

order:这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素-这和如 Oracle 数据库相似,可以在插入语句中嵌入序列调用。

也就是说,有自动增长列的数据库可以执行插入前获取要插入数据的主键值,其的数据库要插入后再执行selectKey获取主键值并注入实体类,所以一般在mysql中用BEFORE,oracle中用AFTER

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值