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

自增主键为何需要返回?

为什么主键自增还需要返回主键?

这是一个非常好的问题,很多初学者都会疑惑:既然数据库已经自动生成了主键,为什么我们还需要在代码中获取并返回它呢?

核心原因:业务逻辑需要

虽然数据库会自动生成自增主键,但应用程序的业务逻辑需要知道这个生成的值。以下是几个关键原因:


1. 后续操作依赖主键

插入数据后,我们通常需要立即使用这个新生成的主键进行其他操作:

示例场景:用户注册后创建个人资料

// 插入用户主表
User user = new User();
user.setUsername("john");
user.setPassword("encrypted_pwd");
userMapper.insertUser(user); // 插入后user.getId()会被填充// 使用刚生成的主键创建用户资料
UserProfile profile = new UserProfile();
profile.setUserId(user.getId()); // 这里需要刚生成的主键!
profile.setNickname("John Doe");
profileMapper.insertProfile(profile);

如果不知道新生成的用户ID,就无法在user_profile表中建立正确的关联。


2. 前端需要完整数据

当前端提交数据给后端创建新资源时,通常期望在响应中获取完整的对象信息,包括数据库生成的主键:

RESTful API 示例

@PostMapping("/users")
public User createUser(@RequestBody User user) {userService.insert(user);return user; // 返回包含生成ID的完整对象
}

前端调用后可以得到:

{"id": 12345,  // 数据库生成的主键"username": "john","email": "john@example.com"
}

这样前端就可以立即使用这个ID进行后续操作(如跳转到详情页:/users/12345)。


3. 数据一致性和完整性

在分布式系统或复杂业务逻辑中,需要确保数据的一致性:

@Transactional
public void createOrder(Order order, List<OrderItem> items) {// 插入订单主表orderMapper.insert(order);Long orderId = order.getId();// 为每个订单项设置订单IDfor (OrderItem item : items) {item.setOrderId(orderId);orderItemMapper.insert(item);}
}

如果没有获取到主键,就无法正确建立主表和子表之间的关联。


4. 日志记录和审计

许多系统需要记录详细的操作日志:

public void addProduct(Product product, User operator) {productMapper.insert(product);// 记录操作日志AuditLog log = new AuditLog();log.setAction("CREATE_PRODUCT");log.setTargetId(product.getId()); // 需要新生成的产品IDlog.setOperatorId(operator.getId());auditService.logAction(log);
}

5. 缓存更新

插入新数据后,可能需要更新缓存:

public void addToCache(User user) {userMapper.insert(user);// 将新用户添加到缓存,使用ID作为键redisTemplate.opsForValue().set("user:" + user.getId(), user);
}

技术实现对比

没有返回主键(需要额外查询)

// 插入用户
userMapper.insert(user);// 需要额外查询获取最新ID(不可靠且低效)
Long latestId = userMapper.getLastInsertId();
user.setId(latestId);

返回主键(推荐方式)

// 插入用户并自动填充主键
userMapper.insert(user);
// 此时user.getId()已经有值了,无需额外查询

总结

场景为什么需要主键
数据关联建立表之间的关联关系(外键)
API响应向前端返回完整资源信息
业务逻辑后续操作依赖新生成的ID
日志审计准确记录操作对象
缓存管理使用正确键值更新缓存

即使主键是自增的,应用程序仍然需要获取这个值,因为:

  1. 数据库负责生成值,但不知道应用程序要用它做什么
  2. 业务逻辑和数据关联需要这个值
  3. 获取主键比不获取更有用,而且几乎没有任何额外开销

MyBatis的主键返回机制正是为了解决这个问题而设计的,它让开发者能够高效、便捷地获取数据库生成的主键值。


文章转载自:

http://V2DQjLSj.zjqwr.cn
http://vsTSlJtH.zjqwr.cn
http://mJGyvJSs.zjqwr.cn
http://G4znyedL.zjqwr.cn
http://7c3Ir8il.zjqwr.cn
http://b2492MWI.zjqwr.cn
http://5utDuWgH.zjqwr.cn
http://V6KLXqqu.zjqwr.cn
http://7FEHShkE.zjqwr.cn
http://khe5fcEP.zjqwr.cn
http://ddPzZNyx.zjqwr.cn
http://jRMwPyNf.zjqwr.cn
http://8BLg3WwX.zjqwr.cn
http://PBZlhBWo.zjqwr.cn
http://3LmAzNCM.zjqwr.cn
http://mADiLkF6.zjqwr.cn
http://cygb0MNB.zjqwr.cn
http://2R7JbpjS.zjqwr.cn
http://m0GbQaqZ.zjqwr.cn
http://IyQQPDvx.zjqwr.cn
http://iwFHr7Lb.zjqwr.cn
http://qdIHnYDi.zjqwr.cn
http://7gasR1KL.zjqwr.cn
http://ZmeYx6aJ.zjqwr.cn
http://9iciKFaz.zjqwr.cn
http://jhncBIBA.zjqwr.cn
http://bksH3KdU.zjqwr.cn
http://nTzNf3D0.zjqwr.cn
http://gAXInwzY.zjqwr.cn
http://0kHf4M9i.zjqwr.cn
http://www.dtcms.com/a/382063.html

相关文章:

  • JDBC从入门到面试:全面掌握Java数据库连接技术
  • java本机电脑跳过2层网络连到客户内网远程调试方案
  • 基于多元线性回归、随机森林与神经网络的农作物元素含量预测及SHAP贡献量分析
  • MySQL数据库 -- 6.事务
  • CSS :has() 选择器详解:为什么它是“父选择器”?如何实现真正的容器查询?
  • 6-1ASPNETCoreWeb入门
  • 【文献笔记】PointWeb
  • Rupert Baines加入CSA Catapult董事会
  • 解密进程管理:从创建到回收全解析(基于Liunx操作系统)
  • 深度神经网络2——优化器选择、学习率消毒、正则化选择
  • 核心利润获现率
  • Nginx 502 网关错误:upstream 超时配置的踩坑与优化
  • (综述)视觉任务的视觉语言模型
  • 【C语言选择排序算法详解】+ 算法性能优化 + 动态演示实现
  • 基于Matlab硬币圆形检测的实现
  • go使用反射获取http.Request参数到结构体
  • vscode使用tmux技巧
  • 【Block总结】ConverseNet:神经网络中的反向卷积算子
  • C++学习记录(8)list
  • 【C++】STL·List
  • 网络安全与iptables防火墙配置
  • Django + Vue3 前后端分离技术实现自动化测试平台从零到有系列 <第一章> 之 注册登录实现
  • Flink面试题及详细答案100道(41-60)- 状态管理与容错
  • 从基础到高级:一文快速认识MySQL UPDATE 语句
  • 基于KAZE算法的织物图像拼接matlab仿真,对比SIFT和SURF
  • 知识输出零散没有体系怎么办
  • 【LeetCode】37. 解数独
  • Redis常见性能问题
  • 数据帮助我们理解未知世界
  • 泛型通配符 T、E、K、V、?