Mybatis 之 useGeneratedKeys 参数的用法

本文详细解析Mybatis中useGeneratedKeys参数的三种设置方式及其影响范围,包括全局设置、接口映射器设置及XML映射器配置。并介绍了如何在不同数据库环境下正确配置以实现主键自动获取。

在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参数用法

<think>根据用户提供的引用内容,用户询问的是MyBatisuseGeneratedKeys="true"的详细使用说明。我需要整合引用中的信息,并结合MyBatis官方知识进行解释。 引用[1][3][4]提到:useGeneratedKeys设置为true时,MyBatis会使用JDBC的getGeneratedKeys方法来获取数据库内部生成的主键(如自ID),并将该值赋给keyProperty指定的属性。 引用[2][3]说明:keyProperty属性用于指定主键值应该设置到参数对象的哪个属性上。例如keyProperty="id"表示将生成的主键值赋给参数对象的id属性。 此外,引用[4]补充:默认情况下useGeneratedKeys的值为false,即不使用此功能。 我需要详细说明以下几点: 1. 作用:用于获取数据库自动生成的主键(适用于支持自动生成主键的数据库,如MySQL、PostgreSQL等)。 2. 使用位置:在<insert>标签中设置。 3. 参数解释: - useGeneratedKeys="true":开启使用自动生成的主键功能。 - keyProperty:指定主键值赋给参数对象的哪个属性。如果参数对象有多个层级,可以使用点号分隔(如keyProperty="user.id")。 4. 注意事项:仅对支持自动生成主键的数据库有效,且要求数据库驱动支持getGeneratedKeys方法。 5. 示例:参考引用[2]的代码片段。 同时,根据引用[3],我们还需要说明:在插入操作后,可以通过传入的参数对象直接获取生成的主键值,而不需要再执行一次查询。 最后,我会生成相关问题,帮助用户深入了解或解决潜在问题。 </think>### MyBatis `useGeneratedKeys="true"` 详细使用说明 在 MyBatis 中,`useGeneratedKeys="true"` 是 `<insert>` 标签的关键配置,用于处理数据库自动生成的主键值。以下是详细解释: #### 1. **核心功能** - **作用**:自动获取数据库生成的主键值(如 MySQL 的 `AUTO_INCREMENT` 或 PostgreSQL 的 `SERIAL`)并映射到 Java 对象的属性中[^3][^4]。 - **原理**:底层调用 JDBC 的 `getGeneratedKeys()` 方法获取数据库生成的主键[^4]。 #### 2. **配置方式** ```xml <insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user(name, email) VALUES(#{name}, #{email}) </insert> ``` - `useGeneratedKeys="true"`:启用自动获取主键功能[^1][^3]。 - `keyProperty="id"`:指定主键值注入到参数对象(`User`)的哪个属性(此处为 `id` 属性)[^2][^3]。 #### 3. **使用场景** - **插入后获取主键**:执行插入操作后,可直接通过参数对象获取数据库生成的主键: ```java User user = new User("张三", "zhangsan@example.com"); userMapper.insertUser(user); // 执行插入 System.out.println(user.getId()); // 直接输出自ID ``` - **支持多主键**(需数据库驱动支持):若表有复合主键,可配置多个 `keyProperty`(如 `keyProperty="id1,id2"`)。 #### 4. **注意事项** - **数据库支持**:仅适用于支持自动生成主键的数据库(MySQL/Oracle/PostgreSQL 等)[^4]。 - **驱动要求**:数据库驱动需实现 `getGeneratedKeys()` 方法(MySQL JDBC 驱动已支持)[^4]。 - **默认值**:`useGeneratedKeys` 默认为 `false`,需显式开启[^4]。 - **冲突场景**:若 SQL 中已包含主键值(如手动指定 ID),该配置**不会覆盖**已有值。 #### 5. **对比其他方案** | 方法 | 优点 | 缺点 | |--------------------------|-------------------------------|---------------------------| | `useGeneratedKeys="true"` | 无需额外查询,性能最优[^3] | 依赖数据库和驱动支持 | | `<selectKey>` 子标签 | 兼容性强(支持非自主键) | 需额外执行查询,效率较低 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值