[翻译]Mybatis useGeneratedKeys参数的使用和自增主键的获取方式

简介: 对于支持自动生成记录主键的数据库,如 MySQL 和 SQL Server,将 useGeneratedKeys 参数的值设置为 true,就可以在记录insert成功后获得数据库自动生成的主键 ID

theme: cyanosis

我是石页兄,朋友不因远而疏,高山不隔友谊情;偶遇美羊羊,我们互相鼓励

欢迎关注微信公众号「架构染色」交流和学习

一、useGeneratedKeys 是什么 ?

关于useGeneratedKeys,官方的说法是,这个参数的作用是:"允许 JDBC 支持自动生成主键,需要驱动兼容",如何理解这句话的含义?

其原意是。对于支持自动生成记录主键的数据库,如 MySQL 和 SQL Server,此时将 useGeneratedKeys 参数值设置为 true ,则进行 INSERT 操作后,数据库自动生成的主键会填充到 Java 实体属性中。


二、如何使用?

配置useGeneratedKeys,可以通过以下方式实现:

  • 配置全局配置文件
  • 在 xml 映射器中配置 useGeneratedKeys 参数
  • 在接口映射器中设置 useGeneratedKeys 参数

2.1 在 mybatis 的全局配置文件中配置

  1. application.yml 配置文件

    • 通过 configLocation 指定 mybatis 的配置文件 mybatis-config.xml
    # MyBatis configuration
    mybatis:
        # Search for the specified package alias
        typeAliasesPackage: com.ruoyi.**.domain
        # Configure mapper scan to find all mapper.xml mapping files
        mapperLocations: classpath*:mapper/**/*Mapper.xml
        # Load the global configuration file
        configLocation: classpath:mybatis/mybatis-config.xml
  2. mybatis-config.xml

    • 通过<setting name="useGeneratedKeys" value="true" />激活useGeneratedKeys.
    <?xml version="1.0" encoding="UTF-8" ?>
    <! DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
    
            <settings>
                    <setting name="cacheEnabled" value="true" /> <!-- global mapper enables caching -->
                    <setting name="useGeneratedKeys" value="true" /> <!-- Allow JDBC to support automatic generation of primary keys -->
                    <setting name="defaultExecutorType" value="REUSE" /> <!-- configure the default executor -->
                    <setting name="logImpl" value="SLF4J" /> <!-- Specify the specific implementation of the log used by MyBatis -->
    <!-- <setting name="mapUnderscoreToCamelCase" value="true"/> <!– CamelCase naming–>-->
            </settings>
    
    </configuration>

注意:在settings元素中设置的全局 useGeneratedKeys 参数对 xml 后缀的 mapper 无效。如果你想在 xml 后缀的 mapper 中添加记录后返回主键 ID,你必须在 xml 后缀的 mapper 中明确设置useGeneratedKeys参数的值为 true。

2.2 在 xml mapper 中配置 useGeneratedKeys 参数。

  1. Mapper.xml
<insert id="addBigdataGroup" parameterType="BigdataGroup" useGeneratedKeys="true" keyProperty="groupId" keyColumn="group_id">
        insert into bigdata_group (
        group_id, group_name, comment, business_line, create_by, remark, create_time)
        values(#{groupId}, #{groupName}, #{comment}, #{businessLine}, #{createBy}, #{remark}, sysdate() );
</insert>
  • parameterType  传入参数类型
  • keyProperty JAVA 对象中的属性名称
  • keyColumn  数据库字段名称

image.png

keyProperty与keyColumn的关系图示(来自网络).png

再次说明:在 xml mapper 中配置的 useGeneratedKeys 参数只影响 xml mapper,设置元素中设置的全局 useGeneratedKeys 参数值对 xml mapper 没有影响。

2.3 在 interface mapper 中设置 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);

注意:在 interface mapper 中设置的 useGeneratedKeys参数将覆盖 mybatis 配置文件中 setting 元素内所配置的useGeneratedKeys的值。

另外笔者的实践中,keyProperty = "id"并未生效,需要设置为keyProperty = "test.id";即参数的名称 + . + 主键属性名。
读者老师需结合自己的环境试一试。

三、遇到的问题

在配置了获得主键 ID 后,但返回的结果并没有像预期的那样返回新插入数据库行的主键的真实数据。但返回的居然1

代码示例如下:

  1. Mybatis layer
import java.util.List;

public interface BigdataMapper {

    List<BigdataGroup> getBigdataGroup();

    int addBigdataGroup(BigdataGroup bigdataGroup);
}
  1. service layer
public int addBigdataGroup(BigdataGroup bigdataGroup) {
    bigdataGroup.setCreateBy(SecurityUtils.getUsername());

    int update = bigdataMapper. addBigdataGroup(bigdataGroup);
    log.info("update: {}", update);
    return update;
}
  1. xml file
<insert id="addBigdataGroup" parameterType="BigdataGroup" useGeneratedKeys="true" keyProperty="groupId" keyColumn="group_id">
    insert into bigdata_group (
    group_id, group_name, comment, business_line, create_by, remark, create_time)
    values(#{groupId}, #{groupName}, #{comment}, #{businessLine}, #{createBy}, #{remark}, sysdate() );
</insert>
  1. 打印结果

按理说,返回的结果应该是插入后主键中的真实数据,但返回结果是1

注意:真实的 id 已经被注入到参数传递对象的主键的相应属性中,方法的返回值表示的是插入的行数,因为插入了 1 条记录,所以返回值是 1;如果在这里获得新添加数据的主键值,那么只需要获得对象主键对应的主键值即可。

修改获取主键值的方式:

public int addBigdataGroup(BigdataGroup bigdataGroup) {
        bigdataGroup.setCreateBy(SecurityUtils.getUsername());

        int update = bigdataMapper. addBigdataGroup(bigdataGroup);
        log.info("update: {}", update);
        // Add the following code
        int group_id = bigdataGroup. getGroupId();
        log.info("group_id: {}", group_id);
        // stop here
        return update;
    }

四、最后说一句

我是石页兄,如果这篇文章对您有帮助,或者有所启发的话,欢迎关注笔者的微信公众号【 架构染色 】进行交流和学习。您的支持是我坚持写作最大的动力。

欢迎点击链接扫马儿关注、交流。


英文原文:https://zditect.com/code/mybatis-usegeneratedkeys-parameter-usage-and-problems-encountered.html

相关文章
|
1月前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
30 10
|
2月前
|
SQL XML Java
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
文章介绍了MyBatis的简单增删改查操作,包括创建数据表、实体类、配置文件、Mapper接口及其XML文件,并解释了`#{}`预编译参数和`@Param`注解的使用。同时,还涵盖了resultType与resultMap的区别,并提供了完整的代码实例和测试用例。
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
|
4月前
|
Java 数据库连接 测试技术
mybatis plus 获取新增实体的主键
mybatis plus 获取新增实体的主键
143 8
|
4月前
|
算法 Java 数据库连接
mybatis plus 主键策略
mybatis plus 主键策略
54 2
|
4月前
|
Java 数据库连接 mybatis
Mybatis查询传递单个参数和传递多个参数用法
Mybatis查询传递单个参数和传递多个参数用法
64 11
|
4月前
|
Oracle 关系型数据库 Java
mybatis使用statement.getGenreatedKeys(); useGeneratedKeys=”true”;使用自增主键获取主键值策略和Oracle不支持自增,Oracle使用序列
mybatis使用statement.getGenreatedKeys(); useGeneratedKeys=”true”;使用自增主键获取主键值策略和Oracle不支持自增,Oracle使用序列
|
4月前
|
SQL
自定义SQL,可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,如何自定义SQL呢?利用MyBatisPlus的Wrapper来构建Wh,在mapper方法参数中用Param注
自定义SQL,可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,如何自定义SQL呢?利用MyBatisPlus的Wrapper来构建Wh,在mapper方法参数中用Param注
|
5月前
|
Java 数据库连接 mybatis
mybatis参数报错Parameter ‘docId‘ not found. Available parameters are [arg1, arg0, param1, param2]
mybatis参数报错Parameter ‘docId‘ not found. Available parameters are [arg1, arg0, param1, param2]
|
5月前
|
SQL Java 数据库连接
2万字实操案例之在Springboot框架下基于注解用Mybatis开发实现基础操作MySQL之预编译SQL主键返回增删改查
2万字实操案例之在Springboot框架下基于注解用Mybatis开发实现基础操作MySQL之预编译SQL主键返回增删改查
72 2
|
6月前
|
SQL 存储 算法
Mybatis-Plus- CRUD接口-主键策略-自动填充和乐观锁-分页-逻辑删除-条件构造器和常用接口
Mybatis-Plus- CRUD接口-主键策略-自动填充和乐观锁-分页-逻辑删除-条件构造器和常用接口