记一个mybatis-plus返回主键值的小坑

虽然是小坑,但坑起来要人命

主键返回配置

参考教程

在插入语句里面有一些额外的属性和子元素用来处理主键的生成,并且提供了多种生成方式。首先,如果你的数据库支持自动生成主键的字段(比如 MySQL 和 SQL Server),那么你可以设置 useGeneratedKeys=”true”,然后再把 keyProperty 设置为目标属性就 OK 了。例如,如果上面的 Author 表已经在 id 列上使用了自动生成,那么语句可以修改为:

<insert id="insertAuthor" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
  insert into Author (username,password,email,bio)
  values (#{username},#{password},#{email},#{bio})
</insert>

如果你的数据库还支持多行插入, 你也可以传入一个 Author 数组或集合,并返回自动生成的主键。

<insert id="insertAuthor" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
  insert into Author (username, password, email, bio) values
  <foreach item="item" collection="list" separator=",">
    (#{item.username}, #{item.password}, #{item.email}, #{item.bio})
  </foreach>
</insert>

坑来了

本人用的PostgreSQL,是支持自增主键的,但无论如何,返回的都是1,我的操作如下:

// XxxMapper.java
public interface XxxMapper extends BaseMapper<Xxx> {

    int insertXxx(Xxx xxx);
}
// XxxServiceImpl.java
@Service
public class XxxServiceImpl extends ServiceImpl<XxxMapper, Xxx> implements IXxxService {

    @Resource
    private XxxMapper xxxMapper;

    @Override
    public void insertXxx(Xxx xxx) {
        int xxxId = xxxMapper.insertXxx(xxx);
    }
}

就这,我在网上找了半天。。老司机们可能都看笑了,这不。。错得很明显嘛

然而本菜鸟被下了降头,就是找不到原因。

百度出来的全是跟上一节一样,基本配置CV了一遍又一遍,一群¥%#*&E…%,这个要你教?教程抄起来就那么有意思?

After two hours…

破案了:

没错,对,配置没错,insert没错,返回没错,主键也没错。。

主键已经在Entity对象里了,也就是说,上述代码中的xxxId取的不是它返回的id,还是那个影响行数,返回的主键ID它已经给你放到你的入参对象里了。。

xxxMapper.insertXxx(xxx);
int xxxId = xxx.getId();

瞧,简单直白。。还得夸它干得不错,很人性化。。

我第一次也是这么认为的。。

第一次?

嗯。。这是第二次

第一次没中降头,自己想明白了,还颇为赞叹得告知同事。。

中间半个月去干其它事了,就没想起来

还是请教同事后他给我破的案,你之前不是还告诉我XXXXXXX嘛?(o´・ェ・`o)

总结

自己找不到错时可以多方查找,与同行交流

自己躺过的坑也要牢记。。

你可能感兴趣的:(Mybatis-Plus,mybatis)