MyBatis-Plus 设置主键自增并获取生成 ID 的完整指南

程一诺
程一诺
发布时间:2026-10-16| 6人浏览过
原创

在使用 MyBatis-Plus 进行持久层开发时,数据库主键自增是最常见的场景。开发者常遇到的问题是:执行 insert 操作后,实体对象中的 ID 字段未能自动填充。本文将解析如何通过实体注解和全局配置启用自增,并演示三种能成功将数据库生成的 ID 回填到 Java 对象的方法。

核心解决方案:配置自增并获取 ID

要实现自增主键且能在 Java 代码中直接读取返回的 ID,关键在于正确配置 MyBatis-Plus 的主键类型策略。以下是具体的实施步骤和方法。

第1步:实体类配置主键自增策略

首先,需要在对应的 POJO 实体类中标记主键字段为自增。使用 @TableId 注解并将 type 属性设置为 IdType.AUTO。

import lombok.Data;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableField;

@Data
@TableName("users")
public class User {
    // 指定 id 为主键,且策略为自增
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    
    // 普通字段,注意处理特殊字符转义
    @TableField("`name`")
    private String name;
}

配置要点:

  • value = "id":映射数据库中的列名。
  • type = IdType.AUTO:告诉框架该字段由数据库自动生成,框架在插入时会忽略该字段值,并在插入成功后尝试回填。

第2步:全局配置(可选但推荐)

为了统一所有实体的默认行为,建议在 application.yml 中配置全局数据库策略。这可以避免在每个实体类上重复添加注解。

mybatis-plus:
  global-config:
    db-config:
      id-type: auto

此配置确保了除非显式指定其他策略,否则所有表的主键都将按自增处理。

第3步:选择获取自增 ID 的方法

配置完成后,需要确保在执行插入操作时,框架能将数据库生成的 ID 赋值给 Java 对象。以下是三种常用方法:

方法一:使用 MyBatis-Plus 内置 insert 方法(推荐)

这是最简洁的方式。MyBatis-Plus 的 BaseMapper 提供的 insert 方法已经适配了大多数关系型数据库,能够自动处理自增 ID 的回填。

// Service 层调用示例
User user = new User();
user.setName("张三");
userMapper.insert(user);
// 此时 user.getId() 即为数据库生成的自增 ID

方法二:使用自定义 XML Mapper 和 @Options 注解

如果需要通过原生 SQL 插入,可以使用 @Options 注解来开启 JDBC 3.0 标准返回键的功能。

import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Param;

public interface UserMapper extends BaseMapper<User> {
    
    @Insert("INSERT INTO users (`name`) VALUES (#{user.name})")
    @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
    int add(@Param("user") User user);
}

参数说明:

  • useGeneratedKeys = true:启用返回由数据库内部生成的主键。
  • keyProperty = "id":指定将返回的值赋给 Java 对象的哪个属性。
  • keyColumn = "id":指定数据库中对应的主键列名。

方法三:使用 Provider 动态 SQL

对于复杂的动态 SQL,可以使用 @InsertProvider 配合 @Options。

Mapper 接口定义:

import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Param;

public interface UserMapper extends BaseMapper<User> {
    
    @InsertProvider(type = UserMapperProvider.class, method = "add")
    @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
    int add(@Param("user") User user);
}

Provider 类实现:

public class UserMapperProvider {
    public String add(User user) {
        // 注意:即使传入的 entity.id 可能为 null,数据库也会处理自增
        return "INSERT INTO users (id, `name`) VALUES (#{user.id}, #{user.name})";
    }
}

验证 ID 是否回填成功

在实际开发中,建议通过日志或调试模式观察 Entity 对象的变化,以确保 ID 正确回写。

如图所示,在执行插入前的断点查看,User 对象的 ID 字段通常为 null 或默认初始值。而在插入语句执行完毕后的断点查看,ID 字段应包含数据库新生成的值。

若发现 ID 仍未回填,请检查以下几点:

  1. 确认数据库表中 id 列确实已设置为 AUTO_INCREMENT(MySQL)或等价属性。
  2. 检查实体类 @TableId 的 type 是否为 IdType.AUTO。
  3. 如果是自定义 SQL,确认 @Options 注解未被遗漏或属性名拼写错误。

此外,正确的实体配置样式参考如下:

以上就是 MyBatis-Plus 新增获取自增列 id 方式的详细内容,更多关于 MyBatis-Plus 自增主键配置的教程资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。