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

mybatis的insert(pojo),会返回pojo吗

在 MyBatis 中,执行 insert 操作时,​Mapper 接口的 insert 方法本身不会直接返回一个包含数据库生成字段的 POJO 对象。其默认返回值是受影响的数据库行数(通常是 intInteger)。以下是具体分析和解决方案:


1. ​默认行为

  • 返回值类型​:insert 方法返回的是受影响的行数(整数),​不是插入后的 POJO 对象
  • POJO 状态​:执行插入后,如果数据库生成了自增 ID 或其他字段(如创建时间),​POJO 对象中对应的属性值不会自动更新​(除非显式配置)。

2. ​如何获取数据库生成的字段值?​

通过配置 ​**useGeneratedKeys​ 和 ​keyProperty**,可以让 MyBatis 将数据库生成的值(如自增 ID)回填到 POJO 对象的属性中:

配置示例(XML 方式):
<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">INSERT INTO user(name, email) VALUES(#{name}, #{email})
</insert>
配置说明:
  • ​**useGeneratedKeys="true"**​:启用数据库自动生成主键功能。
  • ​**keyProperty="id"**​:将生成的值回填到 POJO 的 id 属性中。
  • 支持同时回填多个字段(如 Oracle 序列),需结合 <selectKey> 子标签。

3. ​执行后的效果

  • 返回值​:仍然是整数(如 1,表示成功插入一行)。
  • POJO 对象更新​:数据库生成的值(如 id)会自动注入到 ​传入的 POJO 对象​ 中,可通过原对象访问:
    User user = new User("Alice", "alice@example.com");
    int rows = userMapper.insertUser(user); // 返回行数
    System.out.println("生成的主键ID: " + user.getId()); // 直接访问更新后的属性

4. ​注解配置方式

使用 @Options 注解实现相同效果:

@Insert("INSERT INTO user(name, email) VALUES(#{name}, #{email})")
@Options(useGeneratedKeys = true, keyProperty = "id")
int insertUser(User user); // 执行后 user.getId() 获取主键

5. ​特殊场景:非自增主键(如 Oracle)​

使用 <selectKey> 提前查询序列值:

<insert id="insertUser" parameterType="User"><selectKey order="BEFORE" keyProperty="id" resultType="long">SELECT user_seq.nextval FROM dual</selectKey>INSERT INTO user(id, name, email) VALUES(#{id}, #{name}, #{email})
</insert>

总结

行为是否支持说明
insert 方法直接返回 POJO❌ 否返回值类型是整数(受影响行数)。
获取数据库生成的主键✅ 是通过 useGeneratedKeys + keyProperty 将值注入到 ​传入的 POJO 对象属性​ 中。
获取其他生成字段(如时间戳)✅ 是通过 <selectKey> 或数据库触发器实现回填(需结合触发器逻辑)。

结论​:插入后需访问 ​原 POJO 对象​ 的属性获取生成值,而非通过方法返回值。

http://www.xdnf.cn/news/16423.html

相关文章:

  • Petalinux生成文件的关系
  • 力扣面试150题--二进制求和
  • mmap机制
  • 2.qt调试日志输出
  • 《C++》STL--string详解(上)
  • vue3报错:this.$refs.** undefined
  • 在Podman/Docker容器中为Luckfox Lyra Zero W编译SDK:终极排错指南
  • Linux实战:从零搭建基于LNMP+NFS+DNS的WordPress博客系统
  • yolo11分类一键训练工具免安装环境windows版使用教程
  • 小白成长之路-Ansible自动化(一)
  • 20250707-2-Kubernetes 网络-Ingress暴露应用(http与https)_笔记
  • LeetCode 60:排列序列
  • 10.模块与包:站在巨人的肩膀上
  • MySQL ROUTER安装部署
  • 网络配置实验报告:主机间通信配置
  • python---eval函数
  • Day44 Java数组08 冒泡排序
  • 51核和ARM核单片机OTA实战解析(二)
  • day062-监控告警方式与Grafana优雅展示
  • 【通识】设计模式
  • Ashampoo Background Remover(照片去背景工具) v2.0.2 免费版
  • MyBatis-Plus IService 接口全量方法实现与测试(续)
  • 【Python系列】从内存分析到性能剖析
  • 【c++】从 “勉强能用” 到 “真正好用”:中文问答系统的 200 行关键优化——关于我用AI编写了一个聊天机器人……(16)
  • HBuilder X打包发布微信小程序
  • 详解力扣高频SQL50题之180. 连续出现的数字【困难】
  • Product Hunt 每日热榜 | 2025-07-27
  • 如何思考一个动态规划问题需要几个状态?
  • J2EE模式---服务层模式
  • springboot基于Java与MySQL库的健身俱乐部管理系统设计与实现