有时候我们业务逻辑比较复杂时,插入一条数据,并立刻需要获取插入时数据库自动生的ID,用这个ID再去执行别的逻辑。
那么在Mybatis中,就需要掌握selectKey的用法。
selectKey中可以随意生成想要的主键格式并返回
对于Oracle,需要将order设为“BEFORE”,否则会报空值。因为要先生成主键,再插入到表中
首先用pojo作为参数传入,其中属性TID为主键,将values中主键位置写好#{TID},然后在selectKey中生成主键并起别名为TID,注意keyProperty也要为TID。pojo中要有对应的setter,getter。
<insert id="test">
INSERT into T_ORDER_TRAIN
(TID) VALUES (#{TID})
<selectKey resultType="String" order="BEFORE" keyProperty="TID">
select
((select to_char(sysdate,'yyyyMMdd') from dual)||'-'||#{jianpin,jdbcType=VARCHAR}||'-'||seq_TID.nextval) as TID
from dual
</selectKey>
</insert>
以上我的主键是由日期+参数+序列组合成的。这样的话传入的pojoTID属性为空,返回却有了TID值。
public String publishTrainActivity(PublishTrainOrder train) {
orderMapper.test(train);
System.out.println("id====="+train.getTID());
return "nimei";
}
我们再来尝试传入map参数
public String publishTrainActivity() {
Map<String,String> p=new HashMap<String,String>();
p.put("TID","");
orderMapper.test(p);
System.out.println("id====="+p.get("TID"));
return "nimei";
}
<insert id="test">
INSERT into T_ORDER_TRAIN
(TID) VALUES (#{TID})
<selectKey resultType="String" order="BEFORE" keyProperty="TID">
select
seq_TID.nextval as tid //大小写无所谓
from dual
</selectKey>
</insert>
结果发现返回的p中TID有值了。
再试试传入参数为String类型
public String publishTrainActivity() {
String TID="";
orderMapper.test(TID);
System.out.println("id====="+TID);
return "nimei";
}
结果报错了,因为无法将TIDset进一个String里面。
总结,用selectKey最好使用实体类或者map作为参数传入,实体类中要有ID的属性和对应的setter,getter方法,map中要有ID的键。
对于Mysql,,如果是非自增主键,则不变
<insert id="insertUser">
insert into user (name,password)
values (#{id},#{name},#{password})
<selectKey resultType="string" keyProperty="id" order="BEFORE">
SELECT uuid() AS ID //这地方大小写无所谓
</selectKey>
</insert>
对于自增主键,可以看这个:blog.csdn.net/qq_29663071…