app开发者平台在数字化时代的重要性与发展趋势解析
1716
2022-11-15
MybatisPlus关联查询的完美实现方案
目录Mybatis-Plus 简介连表?Left Join?Inner Join?旧版代码新版优化相关工具类总结
Mybatis-Plus 简介
什么是 MyBatis-Plus?Mybatis-Plus:为简化开发而生
MyBatis-Plus(简称 MP)是一个基于 MyBatis 的增强工具,它对 Mybatis 的基础功能进行了增强,但未做任何改变。使得我们可以可以在 Mybatis 开发的项目上直接进行升级为 Mybatis-plus,正如它对自己的定位,它能够帮助我们进一步简化开发过程,提高开发效率。
Mybatis-Plus 其实可以看作是对 Mybatis 的再一次封装,升级之后,对于单表的 CRUD 操作,调用 Mybatis-Plus 所提供的 API 就能够轻松实现,此外还提供了各种查询方式、分页等行为。最最重要的,开发人员还不用去编写 XML,这就大大降低了开发难度
官网:https://mp.baomidou.com
连表?Left Join?Inner Join?
MybtaisPlus 极大简便了单表的操作,但对应连表查询更多的还是在xml中实现,本人是一个单表主义者(能单表,尽量不连表),阿里的相关规范中也提到:尽量使用单表,连表尽量不要超过3张,于是更多的时候,是把主表查询处理,然后使用流处理把关联的表Id集合起来,再通过listByIds转toMap,得到Id对应的对象,再进行get相对应赋值,最初也没啥,当写的越来越多了之后,问题就开始暴露了,没错,代码实在是太长,太臭啦!!!
旧版代码
Set
Map
if (!systemProjectFileSecurityIdSet.isEmpty()) {
systemProjectFileSecurityMap.putAll(systemProjectFileSecurityService.listByIds(systemProjectFileSecurityIdSet)
.stream()
.collect(Collectors.toMap(SystemProjectFileSecurity::getSystemProjectFileSecurityId, systemProjectFileSecurity -> systemProjectFileSecurity)));
}
旧版代码太长了啦,每次关联,都需要5-7行,一张业务表少说也有3到5个表关联,这cMFfTFomt样编写的话,显得代码太过累赘,以及冗余,整体看的实在太难受啦
新版优化
Map
linkTableUtils.linkSystemProjectFileSecurity(records, SystemProjectFileSecurityGroupSetting::getSystemProjectFileSecurityId);
我们对冗余的代码进行的抽取,目前1-2行就可以实现5-7行的功能,就算关联查询更多的表,代码看起来也更整洁,嗯,真香
相关工具类
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 链接其他表的工具类
*
* @author zengqinghua
*/
@Component
public class LinkTableUtils {
/**
* 链接 XXX表
*/
public
return this.linkTable(
TableEnum.SystemProjectFileSecurity,
records, getKey,
SystemProjectFileSecurity::getSystemProjectFileSecurityId
);
}
/**
* 链接 表(通用方法)
*
* @param tableEnum 表名枚举
* @param records 数据源列表
* @param getKey 查询的Id
* @param getRKey map的key
* @param
* @param
* @return
*/
public
TableEnum tableEnum,
List
Function
) {
if (records.isEmpty()) {
return new HashMap<>();
}
IService
// 得到对应的id
Set
Map
if (!idSet.isEmpty()) {
map.putAll(iService.listByIds(idSet)
.stream()
.collect(Collectors.toMap(getRKey, data -> data)));
}
return map;
}
public enum TableEnum {
SystemProjectFileSecurity("xxxx", ISystemProjectFileSecurityService.class);
private final String tableRemark;
private final Class tClass;
TableEnum(String tableRemark, Class tClass) {
this.tableRemark = tableRemark;
this.tClass = tClass;
}
}
}
总结
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~