MyBatis-Plus插入后未返回主键ID解决方案

使用Mybatis-Plus如果需要insert后返回主键ID,只需在实体类ID属性上加以下注解

@TableId(value = "id", type = IdType.AUTO)
private Integer id;

我遇到的问题:
注解加上后ID并没有正常返回。

使用Mybatis-Plus需要注意:

当调用insert方法时,首先会去找mapper中是否已经存在insert方法,如果存在则调用,不存在则会调用BaseMapper中的insert方法。

我遇到的便是这种情况,由于mapper中我已经自定义了一个insert方法,并且xml中并没有定义

useGeneratedKeys="true" keyProperty="id"
所以实际调用的是自定义的insert方法。

解决方案:
①在自定义insert方法的xml中加上useGeneratedKeys="true" keyProperty="id"

②删除自定义的insert方法,并且在实体类的id主键上加上注解:

@TableId(value = "id", type = IdType.AUTO)

<think> 我们正在讨论MyBatis-Plus的BaseMapper.insert方法如何返回主键的问题。根据提供的引用,我们可以总结出以下关键点: 1. 引用[3]和[5]明确指出,使用BaseMapper.insert方法插入数据后,会自动将生成的主键值填充到插入对象的对应字段中。因此,我们不需要从insert方法的返回值中获取主键,而是直接从传入的实体对象中获取。 2. 引用[5]提供了具体的代码示例:在实体类中,使用`@TableId`注解标识主键字段,并指定类型为`IdType.AUTO`(表示数据库自增)。插入后,通过实体对象的getId()方法即可获得自增主键。 因此,解决方案包括两个步骤: - 在实体类中正确配置主键字段(使用`@TableId`注解,并指定自增类型)。 - 调用insert方法后,从传入的实体对象中获取主键值。 下面给出详细说明和代码示例。 </think> ### MyBatis-Plus BaseMapper.insert 方法返回主键的实现方法 在 MyBatis-Plus 中,`BaseMapper.insert()` 方法执行插入操作后,**不会直接返回主键值**(该方法返回值为 int 类型,表示受影响的行数)。但可以通过以下两种方式获取自增主键: #### ✅ 正确实现方式(推荐) 1. **实体类配置主键策略** 在实体类的主键字段添加 `@TableId` 注解并指定 `IdType.AUTO`: ```java @TableName("your_table") public class YourEntity { @TableId(value = "id", type = IdType.AUTO) // 关键配置 private Long id; // 对应数据库自增字段 // 其他字段... } ``` 2. **插入后直接获取主键** 插入操作完成后,主键值会自动回填到实体对象中: ```java YourEntity entity = new YourEntity(); entity.setName("test"); baseMapper.insert(entity); // 执行插入 // 直接从实体对象获取主键 Long generatedId = entity.getId(); // ✅ 获取自增主键 ``` #### ️ 注意要点 1. **无需设置主键值** 执行插入前**不要**手动设置主键值(如 `entity.setId(123L)`),否则会破坏自增逻辑[^3][^5]。 2. **主键类型需匹配** 数据库主键字段必须是自增类型(如 MySQL 的 `AUTO_INCREMENT`),且代码中的 `@TableId` 配置必须正确[^5]。 3. **常见错误排查** - ❌ 错误:尝试获取 `insert()` 返回值作为主键 ```java int result = baseMapper.insert(entity); Long id = (long) result; // ❌ 返回值是影响行数(通常为1),非主键 ``` - ❌ 错误:配置 `@TableId` 注解或配置错误类型 --- ### 实现原理说明 MyBatis-Plus 通过以下机制实现主键回填: 1. 执行 SQL 后捕获 `Statement.getGeneratedKeys()` 返回主键 2. 利用反射将主键值注入到实体类的 `@TableId` 标记字段 3. 整个过程在 `insert()` 方法内部自动完成[^2][^5] --- ### 多表插入场景扩展 如需插入关联表数据并获取主键,可通过事务将操作封装: ```java @Transactional public Long createEntityWithDetail(Entity entity, Detail detail) { baseMapper.insert(entity); // 插入主表 Long mainId = entity.getId(); // 获取主表ID detail.setMainId(mainId); // 设置关联ID detailMapper.insert(detail); // 插入明细表 return mainId; // 返回主表ID } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值