当前位置: 首页 > news >正文

mybatis执行insert如何返回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 注入到您的实体对象中,无需额外查询!🚀

http://www.dtcms.com/a/238191.html

相关文章:

  • 星耀8上市品鉴暨北京中和吉晟吉利银河用户中心开业媒体见面会
  • 基于多维视角的大模型提升认知医疗过程层次激励编程分析
  • 关于IE浏览器被绑定安装,还卸载不掉
  • RabbitMQ work模型
  • 云原生监控体系建设:Prometheus+Grafana的企业级实践
  • 【11408学习记录】考研写作双核引擎:感谢信+建议信复合结构高分模板(附16年真题精讲)
  • LeetCode - 148. 排序链表
  • 自动驾驶科普(百度Apollo)学习笔记
  • vue.js not detected解决方法
  • LinuxSamba服务器配置篇
  • 三级流水线是什么?
  • 12-OPENCV ROCKX项目 人脸拍照
  • 抖音怎么下载没有水印的视频?
  • 【计算机网络】三报文握手建立TCP连接
  • 【iOS】JSONModel源码学习
  • 台湾TEMI协会竞赛——0、竞赛介绍及开发板介绍
  • 数据类型 -- 转义字符
  • AI架构师如何创建自己的知识库
  • Vue项目PDF目录功能集成【一】——方案深度思考
  • 20-Oracle 23 ai free Database Sharding-特性验证
  • C语言内存管理和编译优化实战
  • 调试快捷键 pycharm vscode
  • 小数据,大智慧:如何用有限数据玩转机器学习训练?
  • .net 可以调试的Windows服务框架Topshelf
  • Vue3指令别名使用指南
  • 自动化监控方案设计:从 Prometheus 到 APM 工具的集成实践
  • NVIC (嵌套向量中断控制器)是什么?
  • 计算机网络基础总结:TCP/IP 模型、TCP vs UDP、DNS 查询过程
  • 【C++】25. 哈希表封装unordered_map和unordered_set
  • 大型语言模型(LLM)面试问题集