Mybatis 之 useGeneratedKeys 参数的用法

在Mybatis中,有三个位置可以设置 参数“useGeneratedKeys”:

1、在setting元素中设置 useGeneratedKeys参数,对于支持自动生成主键的数据库,如 mysql,sql server,此时设置useGeneratedKeys为 true,在执行插入记录之后,可以读取到数据库自动生成的主键ID。
在setting元素中设置的useGeneratedKeys是一个全局的参数,但是只是对接口接口映射器产生影响,对xml映射器无效

<settings> 
    <!-- 
        允许JDBC支持自动生成主键,需要驱动兼容。 如果设置为true则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby)。 
    --> 
    <setting name="useGeneratedKeys" value="true" /> 
</settings>

此时,在接口映射中添加记录之后将返回主键ID。

public interface TestMapper { 
    // 受全局useGeneratedKeys参数控制,添加记录之后将返回主键id 
    @Insert("insert into test(name,descr,url,create_time,update_time) values(#{name},#{descr},#{url},now(),now())") 
    Integer insertOneTest(Test test);
}

此时,如果在接口映射器中设置 useGeneratedKeys = false,那么添加记录将不再返回记录ID,该设置优先级高

    // 在接口映射器中设置的useGeneratedKeys参数值将会覆盖在settings元素中设置全局useGeneratedKeys参数值 
    @Options(useGeneratedKeys = false, keyProperty = "id", keyColumn = "id") 
    @Insert("insert into test(name,descr,url,create_time,update_time) values(#{name},#{descr},#{url},now(),now())") 
    Integer insertOneTest(Test test);

2、在XML映射器中配置useGeneratedKeys参数

<!-- 插入数据:返回记录的id值 --> 
<insert id="insertOneTest" parameterType="org.chench.test.mybatis.model.Test" useGeneratedKeys="true" keyProperty="id" keyColumn="id"> 
    insert into test(name,descr,url,create_time,update_time) values(#{name},#{descr},#{url},now(),now()) 
</insert>

xml映射器中配置的useGeneratedKeys参数只会对xml映射器产生影响,且在settings元素中设置的全局useGeneratedKeys参数值对于xml映射器不产生任何作用。

3、在接口映射器中设置useGeneratedKeys参数

// 设置useGeneratedKeys为true,返回数据库自动生成的记录主键id 
    @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
    @Insert("insert into test(name,descr,url,create_time,update_time) values(#{name},#{descr},#{url},now(),now())") 
    Integer insertOneTest(Test test);

附:oracle数据库不支持AUTO_INCREMENT列,她是使用序列生成自增主键的;
oracle在插入记录时,如果也想返回当前记录的id,可以这样写:

        <insert id="insertStudent" parameterType="Student">  
            <selectKey keyProperty="studId" resultType="int" order="BEFORE">  
                SELECT my_seq.nextval FROM DUAL  
            </selectKey>  
            INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL, PHONE)  
                VALUES(#{studId},#{name},#{email},#{phone})  
        </insert>    

这里我们使用了 selectKey 子元素来生成主键值,并将值保存到Student对象的studId 属性上。属性order=“before”表示MyBatis将取得序列的下一个值作为主键值,并且在执行INSERT语句之前将值设置到studId属性上。
注:SelectKey需要注意order属性,像MySQL、SQLServer等一类支持自动增长类型的数据库中,order需要设置为after才会取到正确的值。
像Oracle这样取序列的情况,需要设置为before,否则会报错。

参考:深入浅出mybatis之useGeneratedKeys参数用法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值