千家信息网

Mybatis Plus关联查询怎么实现

发表于:2024-10-10 作者:千家信息网编辑
千家信息网最后更新 2024年10月10日,本篇内容介绍了"Mybatis Plus关联查询怎么实现"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成
千家信息网最后更新 2024年10月10日Mybatis Plus关联查询怎么实现

本篇内容介绍了"Mybatis Plus关联查询怎么实现"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

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 systemProjectFileSecurityIdSet = records.stream().map(SystemProjectFileSecurityGroupSetting::getSystemProjectFileSecurityId).collect(Collectors.toSet());Map systemProjectFileSecurityMap = new HashMap<>();if (!systemProjectFileSecurityIdSet.isEmpty()) {            systemProjectFileSecurityMap.putAll(systemProjectFileSecurityService.listByIds(systemProjectFileSecurityIdSet)                    .stream()                    .collect(Collectors.toMap(SystemProjectFileSecurity::getSystemProjectFileSecurityId, systemProjectFileSecurity -> systemProjectFileSecurity)));}

旧版代码太长了啦,每次关联,都需要5-7行,一张业务表少说也有3到5个表关联,这样编写的话,显得代码太过累赘,以及冗余,整体看的实在太难受啦

新版优化

Map systemProjectFileSecurityMap =     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 */@Componentpublic class LinkTableUtils {     /**     * 链接 XXX表     */    public  Map linkSystemProjectFileSecurity(List records, Function getKey) {        return this.linkTable(                TableEnum.SystemProjectFileSecurity,                records, getKey,                SystemProjectFileSecurity::getSystemProjectFileSecurityId        );    }     /**     * 链接 表(通用方法)     *     * @param tableEnum 表名枚举     * @param records   数据源列表     * @param getKey    查询的Id     * @param getRKey   map的key     * @param        数据源     * @param        结果     * @return     */    public  Map linkTable(            TableEnum tableEnum,            List records, Function getKey,            Function getRKey    ) {        if (records.isEmpty()) {            return new HashMap<>();        }         IService iService = (IService) ApplicationContextUtil.getBean(tableEnum.tClass);         // 得到对应的id        Set idSet = records.stream().map(getKey).collect(Collectors.toSet());        Map map = new HashMap<>();        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;        }    }}

"Mybatis Plus关联查询怎么实现"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

0