Skip to content

mybatis-plus4.x踩坑

使用版本[4.0.8]

注意 以下只对 mybatis-plus4.x 有效,对主流版本3.5.7及以下无需考虑。

临时仓库

mybatis-plus 4.0 临时仓库https://gitee.com/baomidou/mybatis-plus4

简介

Mybatis Plus 4(简称 MP4)正在进行开发,并且带来了一些新的功能和特性。以下是 MP4 版本的一些主要更新:

  • 多表关联:Mybatis Plus 4 将支持多表关联,这是许多用户期待的功能。通过使用 JoinInterceptor 和 LambdaJoinQueryWrapper,可以更方便地进行多表查询。

  • 函数支持:在实体类中可以添加接收函数返回的字段,使用 @TableField 注解的 funField 属性来标记。这样可以在使用各类 wrapper 进行查询时,直接使用函数。

  • 批量插入和更新:BaseMapper 将直接支持批量插入和更新的方法,这将简化在 service 层进行批量操作的代码。

  • 前端高级查询 API:后端可以配置一个 QueryFilter,它提供了 asWrapper 方法,可以将前端的过滤条件包装为一个 QueryWrapper。这样,前端可以按照指定格式传参,实现后端不需要多余编程,前端自由控制过滤条件的效果。

mybatis-plus4

踩坑1 关联多表查询会使默认的伪删除字段在查询时不生效

java
public class user {
    /**
    * 删除标志(0代表存在 2代表删除)
    */
    @TableLogic
    private Integer delFlag;
}

在实体类里声明的@TableLogic在查询时会默认在sql添加where条件, 这在单表查询下是正常的。

sql
select * from user where delFlag = 0;

但在多表关联时拼接如下 (注: 3.x等低版本不支持多表查询)

sql
select * from user left join user_role on user.user_id = user_role.user_id and user.delFlag = 0

这显然不能筛选user里没有被删除的数据,所以需要手动在wrapper里添加条件

java
LambdaJoinQueryWrapper<User> lqw = new LambdaJoinQueryWrapper<>(User.class);
lqw.leftJoin(UserRole.class).like(UserRole::getRoleName, bo.getSearchValue()).end(User.class);
lqw.eq(User::getDelFlag, 0); // 手动添加条件

踩坑2 批量插入报错

根据4.x的文档, 需要额外在配置文件添加一个参数(也可以配置到@tablename注解里,注解优先于全局配置)

xml
mybatis-plus:
  global-config:
    db-config:
      # 数据库类型
      db-type: mysql

粤ICP备20009776号