有时候我们新增一条数据之后,还需要获取到这条新增数据的主键,以便在其他业务中继续使用,当然拿mysql来举个例子,你可以在执行完插入之后,再去执行一下“SELECT LAST_INSERT_ID()”来获取刚才插入后的主键id,但是这样显得既麻烦又没有效率,用mybatis可以通过selectKey标签一次性完成这种需求。
分两种情况的主键来说,一是自增主键,就是自增类型的int了,一是非自增的主键,比如使用uuid(mysql有 uuid()函数)。
一、自增类型的主键:
mapper文件的写法:
<insert id="insertAnalysis" parameterType="com.lzzjava.xfraud.beans.UserTagInfo" >
<selectKey resultType="java.lang.Long" order="AFTER" keyProperty="id">
SELECT LAST_INSERT_ID() AS id
</selectKey>
insert into anti_toanalysis(list_name,name,certi_no)
values("",#{name},#{certi_no})
</insert>
上面的写法除了多了一个selectKey之外,与我们日常的写法并没有不同。拿上边的例子来说:
selectKey的作用就是将 SELECT LAST_INSERT_ID()的结果放入到入参com.lzzjava.xfraud.beans.UserTagInfo的属性里面, keyProperty 对应的是UserTagInfo中属性名。UserTagInfo.java:
package com.lzzjava.xfraud.beans;
public class UserTagInfo {
private Long id;
private String name;
private String certi_no;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCerti_no() {
return certi_no;
}
public void setCerti_no(String certi_no) {
this.certi_no = certi_no;
}
}
order=“AFTER” 表示 SELECT LAST_INSERT_ID() 在insert执行完成之后再执行,用于自增主键, 还可以取值BEFORE, 表示 SELECT LAST_INSERT_ID() 在insert执行之前执行,这样的话就拿不到主键了,如果自增的时候取值为BEFORE,就拿不到主键了,因此这里写AFTER.
resultType :主键类型
public Map<String, Object> markTag(JSONArray array) {
UserTagInfo param = new UserTagInfo();
//赋值...省略
downFileDao.insertAnalysis(param);
System.out.println(param.getId());//这里获取的就是selectKey返回的新增数据使用的自增id
}
二、非自增类型的主键:
<insert id="insert" parameterType="com.soft.mybatis.model.Customer">
<selectKey keyProperty="id" order="BEFORE" resultType="String">
select uuid()
</selectKey>
insert into t_customer (id,c_name,c_sex,c_ceroNo,c_ceroType,c_age)
values (#{id},#{name},#{sex},#{ceroNo},#{ceroType},#{age})
</insert>
跟自增主键方式相比,这里的selectKey不同之处:
1 、 insert语句需要写id字段了,并且 values里面也不能省略 ,因为不是自增的了,需要你自己指定id的值,而id的值哪里来呢?就是通过 selectKey得到的。
2 、selectKey 的order属性需要写成BEFORE,因为这样才能将生成的uuid主键放入到入参Customer的属性id之中, 也只有放入到Customer的属性id之中了,后面的insert的values里面的#{id}才有值