• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

奋斗的软件工程师

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

MyBatis 自增主键回填详解:轻松获取数据库生成的主键值

MyBatis 自增主键回填详解:轻松获取数据库生成的主键值


在实际开发中,我们经常会遇到需要插入一条记录并获取数据库自动生成的主键值的场景。例如,在使用 MySQL 数据库时,通常会使用 AUTO_INCREMENT 来实现自增主键。那么,如何在 MyBatis 中实现自增主键的回填呢?本文将详细介绍如何使用 SELECT LAST_INSERT_ID() 以及 MyBatis 提供的其他方式来实现这一功能。


1. 什么是自增主键回填?

自增主键回填是指在插入一条记录后,自动将数据库生成的主键值回填到 Java 对象中。例如,当我们向 tb_user 表中插入一条用户记录时,数据库会自动生成一个主键值(如 id),我们希望将这个值赋值给 Java 对象的 id 属性。


2. 实现方式

MyBatis 提供了两种方式来实现自增主键回填:

方式 1:使用 SELECT LAST_INSERT_ID()

在 SQL 映射文件中,可以通过 SELECT LAST_INSERT_ID() 获取自增主键的值,并将其赋值给实体对象的属性。

示例代码:

<insert id="insertUser" parameterType="User">
    INSERT INTO tb_user (user_name, pass_word)
    VALUES (#{userName}, #{passWord});

    <!-- 获取自增主键的值并赋值给 id 属性 -->
    <selectKey resultType="int" keyProperty="id" order="AFTER">
        SELECT LAST_INSERT_ID()
    </selectKey>
</insert>

参数说明:

  • resultType:主键的数据类型(例如 int)。
  • keyProperty:实体对象中对应的属性名(例如 id)。
  • order:指定执行 SELECT LAST_INSERT_ID() 的时机,AFTER 表示在插入语句之后执行。

Java 代码:

User user = new User();
user.setUserName("testUser");
user.setPassWord("123456");

userMapper.insertUser(user);

// 插入后,user 对象的 id 属性会被回填
System.out.println("Generated ID: " + user.getId());

方式 2:使用 useGeneratedKeys 和 keyProperty

MyBatis 提供了更简洁的方式来实现自增主键回填,无需手动编写 SELECT LAST_INSERT_ID()。

示例代码:

<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
    INSERT INTO tb_user (user_name, pass_word)
    VALUES (#{userName}, #{passWord});
</insert>

参数说明:

  • useGeneratedKeys:设置为 true,表示使用数据库生成的主键。
  • keyProperty:实体对象中对应的属性名(例如 id)。

Java 代码:

User user = new User();
user.setUserName("testUser");
user.setPassWord("123456");

userMapper.insertUser(user);

// 插入后,user 对象的 id 属性会被回填
System.out.println("Generated ID: " + user.getId());

3. 两种方式的对比

特性 方式 1:SELECT LAST_INSERT_ID() 方式 2:useGeneratedKeys
代码复杂度 需要手动编写 SQL 语句 更简洁,无需额外 SQL
适用数据库 仅适用于 MySQL 支持多种数据库
灵活性 更灵活,可以自定义 SQL 依赖于 MyBatis 的实现
推荐场景 需要兼容多种数据库时 仅使用 MySQL 时

4. 注意事项

  1. 数据库支持:

    • SELECT LAST_INSERT_ID() 是 MySQL 特有的函数,其他数据库(如 PostgreSQL、Oracle)需要使用对应的函数或语法。
  2. 多插入操作:

    • 如果一次插入多条记录,SELECT LAST_INSERT_ID() 只会返回最后一条记录的主键值。
  3. 事务一致性:

    • 确保插入操作和主键回填在同一个事务中,避免主键值不一致。

5. 其他数据库的主键回填

PostgreSQL

使用 RETURNING 子句:

<insert id="insertUser" parameterType="User">
    INSERT INTO tb_user (user_name, pass_word)
    VALUES (#{userName}, #{passWord})
    RETURNING id;
</insert>

Oracle

使用序列和 RETURNING 子句:

<insert id="insertUser" parameterType="User">
    <selectKey resultType="int" keyProperty="id" order="BEFORE">
        SELECT user_seq.NEXTVAL FROM dual
    </selectKey>
    INSERT INTO tb_user (id, user_name, pass_word)
    VALUES (#{id}, #{userName}, #{passWord});
</insert>

6. 总结

在 MyBatis 中,实现自增主键回填有两种主要方式:

  1. 使用 SELECT LAST_INSERT_ID():适用于 MySQL,灵活性高,但代码稍显复杂。
  2. 使用 useGeneratedKeys 和 keyProperty:代码简洁,推荐在 MySQL 中使用。

根据项目需求和数据库类型,选择合适的方式即可。无论哪种方式,都能轻松实现自增主键的回填功能,提升开发效率。


希望本文对你理解和使用 MyBatis 自增主键回填有所帮助!如果你有任何问题或建议,欢迎在评论区留言讨论。

posted on 2025-01-04 04:39  周政然  阅读(404)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3