在使用MyBatis Plus (MP) 进行数据库操作时,有时可能会遇到插入数据后无法获取自增主键的问题。本文将深入解析这个问题,并提供解决方案。
MyBatis Plus 是 MyBatis 的一个扩展,它提供了许多便捷的 CRUD 操作,减少了开发人员编写 SQL 的工作量。在使用 MP 的 `insert` 方法时,对于设有自增主键的表,通常情况下,MP 会自动将生成的主键值回填到实体类的相应属性中。然而,在实际应用中,可能遇到插入数据后主键未返回的情况。
我们来看一下问题的实体类配置。这里有一个名为 `UserInfo` 的实体类,其中 `userId` 字段被标记为自增主键:
```java
@TableName(value = "USERINFO")
public class UserInfo {
@TableId(value = "user_id", type = IdType.AUTO)
private Long userId;
private String gender;
private Date birthday;
private String phone;
// 省略其他属性和 getter/setter
}
```
这里使用了 `@TableId` 注解指定了主键字段 `user_id` 和其自增类型 `IdType.AUTO`,这意味着在插入数据时,MP 应该自动处理自增主键的生成和回填。
接着,我们看 DAO 层的配置,这里继承了 `BaseMapper`:
```java
@Repository
@Mapper
public interface UserInfoDao extends BaseMapper<UserInfo> {
// int insert(UserInfo record);
// int insertSelective(UserInfo record);
// UserInfo selectByPrimaryKey(Long logId);
// int updateByPrimaryKeySelective(UserInfo record);
}
```
DAO 类中的 `BaseMapper` 提供了通用的 CRUD 方法,包括 `insert`,它应该能够处理自增主键的返回。
然而,问题出现在当项目之前使用过 MyBatis Generator 生成了对应的 XML 映射文件。在 XML 文件中可能存在一个与 MP 通用方法名冲突的 `insert` 方法,如:
```xml
<insert id="insert">
<!-- SQL 语句 -->
</insert>
```
由于这个手工生成的 `insert` 方法的存在,可能会覆盖掉 MP 自带的通用 `insert` 方法,导致主键无法自动回填。解决办法是删除这个手工创建的 `insert` 方法,避免与 MP 的通用方法冲突。
在删除 XML 文件中的 `insert` 方法后,再次执行 MP 的 `insert` 方法,此时应该可以正常获取到自增主键值。
总结一下,MyBatis Plus 在插入数据时无法返回主键可能是由于以下原因:
1. 实体类中的主键字段没有正确使用 `@TableId` 注解进行标识。
2. 数据库配置中自增主键设置不正确。
3. MyBatis Generator 生成的 XML 映射文件中的 `insert` 方法与 MP 的通用方法冲突。
解决这个问题的关键在于检查实体类的注解配置、数据库设置以及确保 MP 的通用方法不受其他自定义 SQL 方法的影响。通过正确配置和调整,可以确保在插入数据时顺利获取到自增主键。在日常开发中,了解这些细节可以帮助我们更好地利用 MyBatis Plus 提高开发效率。