news 2026/4/11 6:41:20

mybatis insert后返回id

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 会自动填充到传入的实体对象中,无需额外查询。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/2 7:26:20

千万不能忽视!选择口碑好的实验室净化机构有多重要

千万不能忽视&#xff01;选择口碑好的实验室净化机构有多重要前言在科研、医疗和工业领域&#xff0c;实验室的洁净度直接关系到实验结果的准确性和可靠性。因此&#xff0c;选择一家口碑好、专业性强的实验室净化机构至关重要。本文将深入探讨选择口碑好的实验室净化机构的重…

作者头像 李华
网站建设 2026/4/8 14:40:14

新手前端必看:5分钟搞懂IIFE的作用与实战妙用

新手前端必看&#xff1a;5分钟搞懂IIFE的作用与实战妙用 新手前端必看&#xff1a;5分钟搞懂IIFE的作用与实战妙用JavaScript 世界里的“一次性魔法”IIFE 到底是个啥从匿名函数到立即执行语法长什么样&#xff1f;经典写法和现代变体全解析为什么开发者离不开 IIFE隔离作用域…

作者头像 李华
网站建设 2026/4/7 22:54:06

【golang】goland使用多版本go sdk的方法

背景 由于最近手动清理了macos的缓存&#xff0c;包括go缓存&#xff0c;导致“项目X”中go1.24 sdk 环境没有了。我本地全局环境是go1.20.14。"项目X"使用的是go1.24环境。 解决方法 https://golang.google.cn/dl/ 手动下载go1.25.5压缩包, goland 偏好设置 goroo…

作者头像 李华
网站建设 2026/4/8 10:32:12

互联网大厂面试攻略:Java小白如何应对微服务与云原生技术

互联网大厂面试攻略&#xff1a;Java小白如何应对微服务与云原生技术 面试场景&#xff1a; 在某个阳光明媚的下午&#xff0c;Java小白程序员“超好吃”走进了一家互联网大厂的面试会议室。面试官是一位看似严肃但和蔼可亲的资深技术专家。以下是他们的对话&#xff1a; 第一轮…

作者头像 李华
网站建设 2026/4/9 10:59:48

中国传统国画开题报告

毕业设计开题报告申请日期&#xff1a; 年 月 日申请人宋体&#xff1b;小四指导老师申请课题名称课题类型理论课题 □实际应用课题□假设应用课题 □其它&#xff08; &#xff09;适用行业课题目标与要求一、目标本课题的核心目标是创建…

作者头像 李华
网站建设 2026/4/10 18:14:57

漫步烟台:历史的棱角,与生活的柔软弧度

晨光初现时&#xff0c;烟台的山海格局便已清晰展开。这座城市的气质&#xff0c;如同其海岸线的轮廓&#xff0c;既有历史沉淀的坚硬棱角&#xff0c;又有生活浸润的柔软弧度。烟台山是这一切的起点&#xff0c;它不仅是一座临海的小山&#xff0c;更像一处自然的观景台与历史…

作者头像 李华