Mybatis怎么怎么获取刚insert后生成的ID(探索selectKey)

94 阅读1分钟

    有时候我们业务逻辑比较复杂时,插入一条数据,并立刻需要获取插入时数据库自动生的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…