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

MyBatis主键返回:必须显式配置

关于主键返回的澄清

核心结论

如果不显式配置主键返回(如使用 @Options 或 XML 中的 useGeneratedKeys),即使数据库成功生成了自增主键,您的 Java 对象中的 ID 字段也会保持为 null(或原始值)。

详细解释

1. 数据库 vs 应用程序:两个独立的世界

  • 数据库:成功插入记录,生成自增 ID(例如 123)
  • 应用程序:有一个 User 对象,其 id 字段值为 null

如果没有明确的机制将它们连接起来,数据库中的 ID 值不会自动反映到您的 Java 对象中。

2. 代码示例对比

情况一:没有配置主键返回
// 假设 UserMapper 中没有配置主键返回
User user = new User();
user.setName("John Doe");
user.setEmail("john@example.com");// 执行插入
userMapper.insert(user); // 数据库成功生成ID=123// 检查Java对象中的ID
System.out.println(user.getId()); // 输出: null 或 0
// 您无法获取到数据库生成的真实ID
情况二:配置了主键返回
// 在Mapper中配置了主键返回
@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("INSERT INTO users (name, email) VALUES (#{name}, #{email})")
int insert(User user);// 执行插入
User user = new User();
user.setName("John Doe");
user.setEmail("john@example.com");
userMapper.insert(user); // 数据库成功生成ID=123// 检查Java对象中的ID
System.out.println(user.getId()); // 输出: 123
// MyBatis自动将数据库生成的ID回填到对象中

3. 为什么需要显式配置?

主键返回不是自动进行的,因为:

  1. 性能考虑:不是所有插入操作都需要返回主键
  2. 灵活性:有些表可能没有自增主键,或者使用其他主键生成策略
  3. 明确性:让开发者明确知道何时需要这个功能

4. 技术实现原理

当您配置了主键返回后,MyBatis 底层会:

  1. 通过 JDBC 执行 INSERT 语句
  2. 使用 Statement.getGeneratedKeys() 方法请求数据库返回生成的主键
  3. 通过反射将返回的主键值设置到您指定的对象属性中
应用程序创建对象
对象ID为null
执行INSERT操作
数据库生成ID
是否配置主键返回?
MyBatis获取并回填ID
对象ID保持为null
可通过getter获取真实ID
无法获取真实ID

总结

  • 数据库会生成自增ID:这是真的
  • Java 对象初始 ID 为 null:这也是真的
  • 数据库的ID会自动反映到Java对象中:这是错误的,除非显式配置

如果您需要在插入后立即使用生成的主键,必须显式配置主键返回机制。否则,您将无法从 Java 对象中获取数据库生成的真实 ID 值。

这就是为什么 MyBatis 提供了 @Options(useGeneratedKeys = true)useGeneratedKeys="true"<selectKey> 等机制的原因 - 它们搭建了数据库和应用程序之间的"桥梁",让生成的主键值能够返回到您的对象中。


文章转载自:

http://NUjngnEX.kjnfs.cn
http://kkKoLI1u.kjnfs.cn
http://lM849y4O.kjnfs.cn
http://T5n8xlvE.kjnfs.cn
http://QomoGrdv.kjnfs.cn
http://nVVr3ME9.kjnfs.cn
http://tM3exNWm.kjnfs.cn
http://N2XcEDGD.kjnfs.cn
http://fQ7txG2a.kjnfs.cn
http://vq7Xg6Zp.kjnfs.cn
http://WeVjHZ7G.kjnfs.cn
http://d0aiVHQj.kjnfs.cn
http://WFoa0jPW.kjnfs.cn
http://qirJtxxO.kjnfs.cn
http://fm8tasf3.kjnfs.cn
http://alQnARHi.kjnfs.cn
http://6FD1GHl7.kjnfs.cn
http://r6ZLsRRO.kjnfs.cn
http://dGionOpS.kjnfs.cn
http://5pW48ZAo.kjnfs.cn
http://vVM1uz3d.kjnfs.cn
http://ycE1FHND.kjnfs.cn
http://19aYPtOG.kjnfs.cn
http://UR3Ohjfn.kjnfs.cn
http://gxhqpGyF.kjnfs.cn
http://5IdlEW0S.kjnfs.cn
http://RVVZDRCN.kjnfs.cn
http://SS5zm9NJ.kjnfs.cn
http://zb5HBabo.kjnfs.cn
http://ngyocRCS.kjnfs.cn
http://www.dtcms.com/a/381653.html

相关文章:

  • MySQL——MVCC实现原理流程分析
  • Linux -- 基于TCP服务器实现一个简单的电商网站
  • 佳维视工业一体机 vs 普通电脑:工业场景选哪个?
  • 小迪安全v2023学习笔记(八十二讲)—— Java组件安全SolrShiroLog4jCVE复现
  • Spring AI(四)机构化输出
  • 单体到微服务拆分方案
  • 云端服务器使用指南:如何跨机传输较大文件(通过windows自带工具远程桌面连接 非常方便)
  • Linux 高性能 I/O 事件通知机制的核心系统调用—— `epoll_ctl`
  • 域格YM310 X09移芯CAT1模组HTTPS连接服务器
  • 连续随机变量无法用点概率描述出现了概率密度函数(Probability Density Function, PDF)
  • Go语言实战案例 — 工具开发篇:Go 实现条形码识别器
  • 洛谷-P1923 【深基9.例4】求第 k 小的数-普及-
  • DeerFlow实践:华为ITR流程的评审智能体设计
  • K均值聚类(K-Means)算法介绍及示例
  • 【企业架构】TOGAF-4A架构概览
  • 华为防火墙三层部署模式
  • Linux Kernel Core API:printk
  • 空间信息与数字技术专业主要学什么技能?
  • 遗传算法模型深度解析与实战应用
  • “开源AI智能名片链动2+1模式S2B2C商城小程序”在直播公屏引流中的应用与效果
  • C语言第五课:if、else 、if else if else 控制语句
  • mysql深入学习:主从复制,读写分离原理
  • Pandas 数据分析:从入门到精通的数据处理核心
  • Web前端面试题
  • 浅谈:数据库中的乐观锁
  • 前端开发核心技术与工具全解析:从构建工具到实时通信
  • 前端形态与样式风格:从古典到现代的视觉语言演进
  • 第5节-连接表-Full-join
  • Java多线程(二)
  • STM32 单片机开发 - SPI 总线