有时候我们业务逻辑比较复杂时,插入一条数据,并立刻需要获取插入时数据库自动生的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,需要将order设为“AFTER”
<insert id="insertUser"> insert into user (name,password) values (#{id},#{name},#{password}) <selectKey resultType="string" keyProperty="id" order="AFTER"> SELECT LAST_INSERT_ID() AS ID //这地方大小写无所谓 </selectKey> </insert>