mybatis执行insert返回id实现详解

 更新时间:2025年07月09日 11:08:59   作者:悟能不能悟  
MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自增或序列且属性名匹配,下面就来具体介绍一下

在 MyBatis 中,执行 INSERT 操作后​​默认返回的是影响的行数(通常是 1)​​,而不是插入的主键 ID。但可以通过以下配置获取新插入记录的 ID:

🛠 两种方式获取自增 ID:

1. ​​useGeneratedKeys+keyProperty(推荐)​​

适用于支持自增主键的数据库(如 MySQL、SQL Server 等)。在 Mapper XML 中配置:

<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
    INSERT INTO user (name, email)
    VALUES (#{name}, #{email})
</insert>
  • ​​useGeneratedKeys="true"​​:启用数据库自动生成的 ID。
  • ​​keyProperty="id"​​:将生成的 ID 赋值给参数对象的 id 属性。

调用示例:

User user = new User();
user.setName("John");
user.setEmail("john@example.com");
int rows = userMapper.insertUser(user); // rows 是受影响行数
Long generatedId = user.getId(); // 获取插入的 ID ✅

2. ​​<selectKey>(适用于 Oracle 或复杂场景)​​

对于 Oracle 或需要自定义查询 ID 的情况:

<insert id="insertUser">
    <selectKey keyProperty="id" resultType="long" order="AFTER">
        SELECT LAST_INSERT_ID() <!-- MySQL 获取最新 ID -->
        <!-- Oracle: SELECT your_sequence.CURRVAL FROM dual -->
    </selectKey>
    INSERT INTO user (name, email)
    VALUES (#{name}, #{email})
</insert>
  • order="AFTER":执行 INSERT 后再获取 ID(Oracle 可能需要 BEFORE)。

📝 关键点总结:

​​特性​​​​说明​​
​​默认返回值​​受影响行数(Integer),不是 ID!
​​获取 ID 的方式​​通过 keyProperty 将 ID 注入到参数对象中(如 user.getId())
​​支持数据库​​MySQL、SQL Server 等(useGeneratedKeys) / Oracle(<selectKey>)
​​注解配置​​使用 @Options(useGeneratedKeys=true, keyProperty="id")

💡 示例(注解方式):

@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("INSERT INTO user(name, email) VALUES (#{name}, #{email})")
int insertUser(User user); // 执行后 user.id 即为新生成的 ID

⚠️ 注意:

  • 确保数据库表的主键是​​自增(AUTO_INCREMENT)​​ 或配置了序列。
  • keyProperty 的值必须与实体类中的属性名严格匹配(如 id 对应 user.id)。

通过正确配置,MyBatis 可以无缝地将新生成的 ID 注入到您的实体对象中,无需额外查询!

到此这篇关于mybatis执行insert如何返回id的实现的文章就介绍到这了,更多相关mybatis insert返回id内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring事件监听器之@EventListener原理分析

    Spring事件监听器之@EventListener原理分析

    这篇文章主要介绍了Spring事件监听器之@EventListener原理分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Mybatis的Mapper代理对象生成及调用过程示例详解

    Mybatis的Mapper代理对象生成及调用过程示例详解

    这篇文章主要为大家介绍了Mybatis的Mapper代理对象生成及调用过程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Java中的Optional类用法详细讲解

    Java中的Optional类用法详细讲解

    这篇文章详细介绍了Java中Optional类的使用,包括创建Optional对象,Optional对象的常用方法,如get、orElse、orElseGet、orElseThrow等,以及Optional类结合Lambda表达式和StreamAPI的使用,需要的朋友可以参考下
    2024-10-10
  • java注解的类型知识点总结

    java注解的类型知识点总结

    在本篇文章里小编给大家整理了一篇关于java注解的类型知识点总结内容,有兴趣的朋友们可以学习下。
    2021-03-03
  • SpringBoot RESTful 应用中的异常处理梳理小结

    SpringBoot RESTful 应用中的异常处理梳理小结

    这篇文章主要介绍了SpringBoot RESTful 应用中的异常处理梳理小结,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Druid监控分布式实现过程解析

    Druid监控分布式实现过程解析

    这篇文章主要介绍了Druid监控分布式实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • java 字符串内存分配的分析与总结(推荐)

    java 字符串内存分配的分析与总结(推荐)

    下面小编就为大家带来一篇java 字符串内存分配的分析与总结(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • 2020最新IDEA SpringBoot整合Dubbo的实现(zookeeper版)

    2020最新IDEA SpringBoot整合Dubbo的实现(zookeeper版)

    这篇文章主要介绍了2020最新IDEA SpringBoot整合Dubbo(zookeeper版),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java反射之通过反射获取一个对象的方法信息(实例代码)

    Java反射之通过反射获取一个对象的方法信息(实例代码)

    下面小编就为大家带来一篇Java反射之通过反射获取一个对象的方法信息(实例代码)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • SpringBoot实现自动配置的示例代码

    SpringBoot实现自动配置的示例代码

    本文主要介绍了SpringBoot实现自动配置的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-01-01

最新评论