Mybatis配置useGeneratedKeys参数的方式

 更新时间:2026年01月24日 10:55:33   作者:乐之者java  
Mybatis的useGeneratedKeys参数用于控制是否允许JDBC支持自动生成主键,并在插入数据时通过keyProperty将生成的主键值返回,当数据库不支持自增主键时,可以使用selectKey来手动实现类似的效果

Mybatis配置useGeneratedKeys参数

Mybatis 配置文件 useGeneratedKeys 参数只针对 insert 语句生效,默认为 false。

当设置为 true 时,表示如果插入的表以自增列为主键,则允许 JDBC 支持自动生成主键,并可将自动生成的主键返回。

配置mybatis的配置文件

设置useGeneratedKeys属性值为true:

 <settings>   
        <setting name="useGeneratedKeys" value="true" />   
  </settings>

编写一个pojo类

/*
 * 使用示例:表对应的 POJO
 * */
public class User {
    private int id;
    private String name;
    private Integer age;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id= id;
    }
    //... 省略其它 getter 和 setter
}

此时再UserMapper中插入user表的语句可以这样写:

<insert id="addUser" parameterType="com.model.User"  keyProperty="id">
    insert into User(name, age) values(#{name}, #{age})
</insert>

keyProperty标记了一个属性

MyBatis会通过 getGeneratedKeys 设置这个属性的值,DAO 调用 addUser 后,User 对象参数中就保存了新增的 user 的 id 属性了。

这个时候你是否能够感觉到useGeneratedKeys配置与selectKey的作用是那么的类似?那么它俩又有什么关系呢?

这样的场景,当你使用的关系型数据库时Oracle 这样不支持自增主键列的数据库时,如果把useGeneratedKeys 参数配置为 true,在插入数据时则可能会出现 ORA-00933: SQL command not properly ended 这样的错误。

这时,可以将 useGeneratedKeys 配置为 false,那怎么实现获取上次生成id的功能呢?可以使用 mybatis 提供的 selectKey 手动提供类似自增序列的效果。

总结

如果数据库支持自增长主键字段(比如mysql、sql server)设置useGeneratedKeys=”true”和keyProperty,这样就可以获得插入的主键id值,并赋值给返回的pojo对象(或者单纯的id值); 

oracle则不支持自增长id,需要设置useGeneratedKey=”false”,如果设置true则会有报错信息。然后通过nextval函数,如SEQ_table.Nextval生成id,插入更新一条数据时,可以使用selectKey获取id操作。

<insert id="insert">
 <selectKey keyProperty="id" resultType="int" order="BEFORE">
  <if test="_databaseId == 'oracle'">
   select seq_users.nextval from dual  </if>
  <if test="_databaseId == 'db2'">
   select nextval for seq_users from sysibm.sysdummy1"  </if>
 </selectKey>
 insert into users values (#{id}, #{name})</insert>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java使用分布式实现数据库读写分离的示例代码

    Java使用分布式实现数据库读写分离的示例代码

    在MySQL中可以通过配置主从复制来实现数据同步,本文主要介绍了Java使用分布式实现数据库读写分离,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • Java的validation参数校验代码实例

    Java的validation参数校验代码实例

    这篇文章主要介绍了Java的validation参数校验代码实例,Validation参数校验是指在程序运行中对传进来的参数进行合法性检查,以保证程序的正确性和安全性,需要的朋友可以参考下
    2023-10-10
  • Mybatis 实现动态组装查询条件,仿SQL模式

    Mybatis 实现动态组装查询条件,仿SQL模式

    这篇文章主要介绍了Mybatis 实现动态组装查询条件,仿SQL模式的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • mybatis-plus @DS实现动态切换数据源原理

    mybatis-plus @DS实现动态切换数据源原理

    本文主要介绍了mybatis-plus @DS实现动态切换数据源原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • SpringMVC源码解读之 HandlerMapping - AbstractDetectingUrlHandlerMapping系列初始化

    SpringMVC源码解读之 HandlerMapping - AbstractDetectingUrlHandlerM

    这篇文章主要介绍了SpringMVC源码解读之 HandlerMapping - AbstractDetectingUrlHandlerMapping系列初始化的相关资料,需要的朋友可以参考下
    2016-02-02
  • springboot bean循环依赖实现以及源码分析

    springboot bean循环依赖实现以及源码分析

    最近在使用Springboot做项目的时候,遇到了一个循环依赖的 问题,所以下面这篇文章主要给大家介绍了关于springboot bean循环依赖实现以及源码分析的相关资料,需要的朋友可以参考下
    2021-06-06
  • Java三目运算符的实战案例

    Java三目运算符的实战案例

    三目运算符在java中运用可以说非常的广泛,下面这篇文章主要给大家介绍了关于Java三目运算符的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • Spring注解@Import原理解析

    Spring注解@Import原理解析

    这篇文章主要为大家介绍了Spring注解@Import原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Spring Data JPA多表联合查询的实例演示

    Spring Data JPA多表联合查询的实例演示

    本文主要介绍了Spring Data JPA多表联合查询的实例演示,包括一对一、一对多、多对一、多对多关系,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-09-09
  • mybatis-plus3.0.1枚举返回为null解决办法

    mybatis-plus3.0.1枚举返回为null解决办法

    这篇文章主要介绍了mybatis-plus3.0.1枚举返回为null解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12

最新评论