广告
返回顶部
首页 > 资讯 > 后端开发 > Python >MybatisPlus关联查询的完美实现方案
  • 376
分享到

MybatisPlus关联查询的完美实现方案

2024-04-02 19:04:59 376人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录mybatis-Plus简介连表?LeftJoin?InnerJoin?旧版代码新版优化相关工具类总结Mybatis-Plus 简介 什么是 MyBatis-Plus?Mybat

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

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

新版优化


Map<Long, SystemProjectFileSecurity> 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;
 

@Component
public class LinkTableUtils {
 
    
    public <T> Map<Long, SystemProjectFileSecurity> linkSystemProjectFileSecurity(List<T> records, Function<T, Long> geTKEy) {
        return this.linkTable(
                TableEnum.SystemProjectFileSecurity,
                records, getKey,
                SystemProjectFileSecurity::getSystemProjectFileSecurityId
        );
    }
 
    
    public <T, R> Map<Long, R> linkTable(
            TableEnum tableEnum,
            List<T> records, Function<T, Long> getKey,
            Function<R, Long> getRKey
    ) {
        if (records.isEmpty()) {
            return new HashMap<>();
        }
 
        IService<R> iService = (IService) ApplicationContextUtil.getBean(tableEnum.tClass);
 
        // 得到对应的id
        Set<Long> idSet = records.stream().map(getKey).collect(Collectors.toSet());
        Map<Long, R> 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;
        }
    }
}

总结

到此这篇关于MybatisPlus关联查询的文章就介绍到这了,更多相关MybatisPlus关联查询内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: MybatisPlus关联查询的完美实现方案

本文链接: https://www.lsjlt.com/news/159928.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作