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

mybatis insert后返回id

在 MyBatis 中插入数据后返回自增 ID 有以下几种常用方法:

1.使用useGeneratedKeyskeyProperty(推荐)

XML 映射文件方式

<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user(name, age) VALUES(#{name}, #{age}) </insert>

注解方式

@Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})") @Options(useGeneratedKeys = true, keyProperty = "id") int insertUser(User user);

2.使用<selectKey>元素(支持更多数据库)

MySQL

<insert id="insertUser" parameterType="User"> <selectKey keyProperty="id" resultType="int" order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO user(name, age) VALUES(#{name}, #{age}) </insert>

Oracle

<insert id="insertUser" parameterType="User"> <selectKey keyProperty="id" resultType="int" order="BEFORE"> SELECT SEQ_USER.NEXTVAL FROM DUAL </selectKey> INSERT INTO user(id, name, age) VALUES(#{id}, #{name}, #{age}) </insert>

PostgreSQL

<insert id="insertUser" parameterType="User"> <selectKey keyProperty="id" resultType="int" order="AFTER"> SELECT currval('user_id_seq') </selectKey> INSERT INTO user(name, age) VALUES(#{name}, #{age}) </insert>

3.Java 代码中使用

// 实体类 public class User { private Integer id; // 主键属性 private String name; private Integer age; // getter/setter... } // 使用示例 User user = new User(); user.setName("张三"); user.setAge(25); // 执行插入 int result = userMapper.insertUser(user); // 插入后,id 会自动设置到 user 对象中 System.out.println("生成的ID:" + user.getId()); // 直接获取

4.批量插入返回 ID

MySQL

<insert id="batchInsert" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user(name, age) VALUES <foreach collection="list" item="item" separator=","> (#{item.name}, #{item.age}) </foreach> </insert>
List<User> userList = new ArrayList<>(); // 添加多个 user userMapper.batchInsert(userList); // 每个 user 对象的 id 都会被自动设置

5.注意事项

  1. 数据库支持:需要数据库支持自增主键

  2. keyProperty 配置:必须与实体类的主键属性名一致

  3. 事务管理:在事务中,ID 会在事务提交后才真正确定

  4. 连接池:使用连接池时,确保useGeneratedKeys能正常工作

6.返回多个自增 ID(批量)

<insert id="batchInsertUsers" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user(name, age) VALUES <foreach collection="list" item="user" separator=","> (#{user.name}, #{user.age}) </foreach> </insert>

7.返回非自增的 ID(如 UUID)

// 在插入前生成 ID String uuid = UUID.randomUUID().toString(); user.setId(uuid); userMapper.insert(user); // 或者通过 selectKey 生成

推荐使用方式

  • MySQL/PostgreSQL:使用useGeneratedKeys

  • Oracle:使用<selectKey>BEFORE模式

  • 批量插入:确保连接池配置支持返回多个 ID

这样插入后,ID 会自动填充到传入的实体对象中,无需额外查询。

http://www.jsqmd.com/news/144708/

相关文章:

  • IRC协议:穿越时光的互联网实时聊天奠基者
  • 专科生必看!9个高效降aigc工具推荐,轻松过审不踩坑
  • Java面试:为何必须在循环中检查等待条件?避坑指南!
  • LuatOS下载不求人:完整流程与高频问题应对策略
  • 课后作业2
  • 2025年12月绵阳米粉/米线加工厂综合比较 - 2025年品牌推荐榜
  • 2025年12月江苏徐州别墅庭院设计、屋顶花园设计、公园绿地设计、市政广场设计、生态园区设计服务商排行榜 - 2025年品牌推荐榜
  • 运用 Python 将 Markdown 转换为 Word、HTML、PDF、PNG 和 JPG
  • 基于Spring Boot和Vue.js的视频点播管理系统设计与实现
  • pg_waldump 和 pg_xlogdump
  • 一个简单想法的实验随笔-胜任能力
  • 高精度光学动作捕捉如何为无人机提供飞行姿态与轨迹真值?——以IROS 2025多篇无人机学习与控制研究为例
  • 让回忆“动”起来:手把手教你制作老照片动态视频
  • 2025最新!自考党必看9个AI论文平台测评与推荐
  • CF1295F Good Contest/[APIO2016] 划艇
  • 郑州家装公司五大推荐:优质装修/别墅装修/老房翻新精选,华埔装饰砸无赦承诺引领行业新风尚 - 深度智识库
  • 基于Spring Boot和Vue.js的房屋出租管理系统设计与实现
  • 2025年12月江苏徐州变压器系列,智能变电站,新能源配套,高低压配电柜,智慧电力系统厂家选择指南 - 2025年品牌推荐榜
  • 2025年门式冲洗装置直销厂家权威推荐榜单:液压水力冲洗门/水力冲洗门/智能控制拍门源头厂家精选 - 品牌推荐官
  • 2025年蠕变持久试验机生产厂家推荐:哪家公司靠谱/国内哪家性价比高/哪个厂家品质好/哪家售后好 - 品牌推荐大师1
  • 上海策划品牌全案公司推荐:4事业部+长期陪跑(案例集) - 品牌排行榜
  • ModelEngine的Aido智能体【娱乐生涯 AI 助手】升级计划——工作流编排精确制导AI应用
  • 哪家上海装修公司口碑最好?21年零投诉实力验证 - 品牌排行榜
  • 告别传统低效!AgentRun 如何用 Serverless + Agent 打造现代化的舆情分析系统?
  • 2025年图书档案标签厂家实力推荐:超高频抗金属标签/耐高温电子标签/rfid标签定制厂家精选 - 品牌推荐官
  • 学长亲荐9个AI论文工具,研究生轻松搞定开题报告!
  • 西门子模拟量处理程序块:滤波峰值,便捷调用报警功能,适用于博图V15及以上版本
  • c# 递归算法
  • 模型没挂,是我自己把系统搞死的
  • 2025升降机厂家TOP10推荐 国内靠谱品牌榜单出炉,苏州卓高9.99分登顶 - 品牌智鉴榜