Mybatis Plus 4更新预告 支持多表关联

Mybatis Plus4 已经开始进行开发中了,MP4版本有哪些新特性呢,我来预告一波。

1 多表关联

      Mybatis Plus 没有多表支持是很多用户的遗憾,在issue中很多人都希望可以有多表关联的支持,于是MP4版本给大家安排了。MP4的多表关联是如何使用的呢,我们一起来看下。

  1.1 准备2个po

@Data
@TableName(value="user")
public class User {

   @TableId("user_id")
   private Integer userId;

   @TableField("name")
   private String name;

   @TableField("age")
   private Integer age;

   @TableField("sex")
   private String sex;

   //指定这个字段和School 的id字段关联,如果不是和id字段关联可以使用targetFields属性进行关联
   @TableField(value="school_id",target = School.class)
   private Integer schoolId;

   //指定关联关系,和目标类  如果是  onetoone 则不需要指定target
   @TableField(relation = Relation.ONE_TO_MANY,target = School.class)
   List<School> schools;
}

@Data
@TableName(value="school",autoResultMap = true) //这里设置自动生成resultMap 不需要别的操作
public class School {
    @TableId
    private Integer id;

    @TableField("school_name")
    private String schoolName;

    @TableField("remark")
    private String remark;
}

  1.2 启用JOIN插件 

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new JoinInterceptor());
        return interceptor;
    }

1.3 使用LambdaJoinQueryWrapper 进行多表查询

 LambdaJoinQueryWrapper<User> wrapper = new LambdaJoinQueryWrapper<>(User.class);
        wrapper.eq(User::getSchoolId,1);
        wrapper.innerJoin(School.class).like(School::getSchoolName,"一");
        mapper.selectList(wrapper);

2 函数支持

 2.1 po上添加接收函数返回的字段

@TableField(exist = false,funField = true) //标记数据库不存在,并且是个函数字段
private Long schoolCount;

  2.2 使用各类wrapper进行查询

  

// QueryWrapper
new QueryWrapper<User>().eq("school_id",2).select("school_id").selectFun(DefaultFuncEnum.COUNT,
                "schoolCount").groupBy("school_id")

// LambdaQueryWrapper
new LambdaQueryWrapper<User>().eq(User::getSchoolId,2)
                .select(User::getSchoolId).selectFun(DefaultFuncEnum.COUNT,User::getSchoolCount).groupBy(User::getSchoolId)

// QueryChainWrapper
QueryChainWrapper<User> wrapper = new QueryChainWrapper<User>(mapper);
wrapper.eq("school_id",2).select("school_id").selectFun(DefaultFuncEnum.COUNT,
                "schoolCount").groupBy("school_id").one()
// LambdaQueryChainWrapper
LambdaQueryChainWrapper<User> wrapper = new LambdaQueryChainWrapper<User>(mapper);
wrapper.eq(User::getSchoolId,2)              .select(User::getSchoolId).selectFun(DefaultFuncEnum.COUNT,User::getSchoolCount).groupBy(User::getSchoolId).one()

// BasicJoinQueryWrapper
 BasicJoinQueryWrapper<User> wrapper = new BasicJoinQueryWrapper<>(User.class);
wrapper.eq(new BasicJoinQueryWrapper.ModelProperty(User.class,"schoolId"),2);
wrapper.select(new BasicJoinQueryWrapper.ModelProperty(User.class,"schoolId"));
wrapper.selectFun(DefaultFuncEnum.COUNT,new BasicJoinQueryWrapper.ModelProperty(User.class,"schoolCount"));
wrapper.groupBy(new BasicJoinQueryWrapper.ModelProperty(User.class,"schoolId"));

// LambdaJoinQueryWrapper
LambdaJoinQueryWrapper<User> wrapper = new LambdaJoinQueryWrapper<>(User.class);
wrapper.eq(User::getSchoolId,2);
wrapper.select(User::getSchoolId);
wrapper.selectFun(DefaultFuncEnum.COUNT,User::getSchoolCount);
wrapper.groupBy(User::getSchoolId);

 3 mapper中直接支持的批量插入和批量更新

      原来的批量插入和更新是在service层的,现在BaseMapper提供了批量更新和插入的方法。

   

/**
     * 批量插入
     *
     * @param collection 实体对象集合
     */
    int insertBatch(@Param(Constants.COLLECTION) Collection<T> collection);


/**
     * 批量更新
     *
     * @param collection 实体对象集合
     * @return 受影响行数
     */
    int updateBatch(@Param(Constants.COLLECTION) Collection<T> collection);

4 前端高级查询API

   后端在参数中配置一个QueryFilter,QueryFilter 提供一个asWrapper方法可以把前端的过滤条件包装为一个QueryWrapper

  

 @PostMapping("list")
    public List<User> filter(@RequestBody QueryFilter<User> filter){
		//注意sex和age是安全字段,就算前端传了也不会拼接这2个字段的过滤条件。
        return mapper.selectList(filter.asWrapper(User.class,"sex","age"));
    }

 前端按照指定格式传参,即可实现后端不做多余编程前端自由控制过滤条件的效果。

{
   "sorter":[{//排序支持ASC和DESC
       "property":"userId",
       "direction":"DESC"
   }],
   "querys":[{//过滤条件 where sex=男 and (name=张三 or name=李四 )
         "property":"name", // po字段名
         "operator":"=",//操作符 
         "value":"张三",//操作值
         "relation":"OR",//关联关系AND OR
         "group":"nameGroup"//相同的group 外层会加括号
   },
   {
         "property":"name",
         "operator":"=",
         "value":"李四",
         "relation":"OR",
         "group":"nameGroup"
   },{
         "property":"sex", //使用了默认的关联关系AND 以及默认操作符 =
         "value":"男"
   }]
}

操作符支持:支持 = > >= < <= like like_l like_r not_like is_null not_null in not_in between not_between 等常见操作 如果是in 等操作 value支持数组传参 

Mybatis Plus4 临时仓库地址:mybatis-plus4: mybatis-plus 4.0 临时仓库 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值