当前位置: 首页 > 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.gsyq.cn/news/159122.html

相关文章:

  • Java面试:为何必须在循环中检查等待条件?避坑指南!
  • Android 12 RK3588平台电源菜单深度定制指南
  • 千万不能忽视!选择口碑好的实验室净化机构有多重要
  • 实验室净化?选这家供应商就对了
  • 2025年12月江苏徐州变压器系列、智能变电站、新能源配套、高低压配电柜、智慧电力系统推荐榜单:顶尖企业综合评估 - 2025年品牌推荐榜
  • comsol悬浮绝缘子电场计算模型,可以得到绝缘子各个部位电势及电场分布,提供comsol详细...
  • !AI领域火爆!求职人数激增33.4%,AI工程师月薪高达3.5万元,你还在等什么?
  • 2025年封切收缩机厂家实力推荐:套袋机/包装机/码垛机源头厂家精选 - 品牌推荐官
  • 凌晨兩點的覺悟:當AttributeError成為我擁抱Type Hints的轉折點
  • 2025年12月金属熔剂/合金金属熔剂/金属添加剂/厂家综合评测 - 2025年品牌推荐榜
  • ModelEngine的Nexent智能体【娱乐生涯 AI 助手】落地实施测试——看看你35岁能否成为天王巨星
  • 2025年12月成都米粉/米线/绵阳米粉加工厂口碑榜单 - 2025年品牌推荐榜
  • 基于Spring Boot和Vue.js的视频点播管理系统设计与实现
  • 运用 Python 将 Markdown 转换为 Word、HTML、PDF、PNG 和 JPG
  • CF1295F Good Contest/[APIO2016] 划艇
  • 2025最新!自考党必看9个AI论文平台测评与推荐
  • 2025年图书档案标签厂家实力推荐:超高频抗金属标签/耐高温电子标签/rfid标签定制厂家精选 - 品牌推荐官
  • 上海策划品牌全案公司推荐:4事业部+长期陪跑(案例集) - 品牌排行榜
  • 告别传统低效!AgentRun 如何用 Serverless + Agent 打造现代化的舆情分析系统?
  • 2025年蠕变持久试验机生产厂家推荐:哪家公司靠谱/国内哪家性价比高/哪个厂家品质好/哪家售后好 - 品牌推荐大师1
  • 学长亲荐9个AI论文工具,研究生轻松搞定开题报告!
  • 西门子模拟量处理程序块:滤波峰值,便捷调用报警功能,适用于博图V15及以上版本
  • 模型没挂,是我自己把系统搞死的
  • c# 递归算法
  • 12.24模拟赛
  • 【golang】goland使用多版本go sdk的方法
  • 2025年12月三圣乡团建/宴席/婚宴/团建聚会/寿宴场地推荐排行榜单 - 2025年品牌推荐榜
  • 2025年市面上头部仓库货架生产商排行榜,中型货架/仓库货架/层板货架/重型货架/自动化立体库货架,仓库货架供货厂家排名 - 品牌推荐师
  • 超时宏定义
  • D365 CE Power Platform 编程系列 (8):JS编程之客户端实体