在这里插入图片描述

MyBatis获取自动生成的主键id详解

在MyBatis中,当向数据库插入数据时(特别是使用自增主键的表),获取自动生成的主键id有两种常用方法:


🛠️ 方法一:useGeneratedKeys + keyProperty(推荐)

适用场景:数据库支持自动生成主键(如MySQL的AUTO_INCREMENT,SQL Server的IDENTITY

<insert id="insertUser" parameterType="User" 
        useGeneratedKeys="true" 
        keyProperty="id"> <!-- id是Java对象的属性名 -->
    INSERT INTO user(name, age) 
    VALUES(#{name}, #{age})
</insert>

原理

  1. useGeneratedKeys="true":告诉MyBatis使用JDBC的getGeneratedKeys()方法获取数据库生成的主键。
  2. keyProperty="id":将获取到的主键值自动注入到参数对象的id属性中。

代码示例

User user = new User("张三", 25);
userMapper.insertUser(user); // 执行插入
System.out.println("生成的主键ID:" + user.getId()); // 直接获取

故事举例

小明的快递公司新入职一位员工"张三"。HR系统在插入员工记录时(数据库自增ID),就像给员工发工牌(主键ID)。
MyBatis的useGeneratedKeys像快递扫描枪——插入数据后立即扫描生成的工牌号(主键ID),
并自动贴到"张三"的员工档案(Java对象)上。后续直接用user.getId()就能查看工牌号。


🛠️ 方法二:<selectKey>标签(通用方案)

适用场景:所有数据库(如Oracle的序列,PostgreSQL的SERIAL

<insert id="insertUser" parameterType="User">
    <!-- 插入前获取序列值(Oracle) -->
    <selectKey keyProperty="id" resultType="long" order="BEFORE">
        SELECT user_seq.nextval FROM dual
    </selectKey>
    INSERT INTO user(id, name, age) 
    VALUES(#{id}, #{name}, #{age})
</insert>

或(MySQL插入后获取):

<selectKey keyProperty="id" resultType="long" order="AFTER">
    SELECT LAST_INSERT_ID()
</selectKey>

关键参数

  • order="BEFORE/AFTER":主键获取在插入SQL之前/之后执行
  • keyProperty:主键值注入的Java对象属性
  • resultType:主键数据类型

✅ 总结对比

方法 优点 缺点 适用场景
useGeneratedKeys 简洁(一行配置) 依赖数据库驱动支持 MySQL, SQL Server
<selectKey> 数据库通用 需写额外SQL Oracle, PostgreSQL等

📌 核心逻辑
MyBatis通过JDBC底层获取生成的主键,并自动填充到传入的Java对象属性中,因此插入后直接访问该属性即可。

在这里插入图片描述

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐