Mybatis左连接的实现方式

news2024/9/28 11:16:29

在使用 MyBatis Plus 进行数据库操作时,我们有时需要从多个表中获取数据。这篇文章将介绍如何在 MyBatis Plus 中实现左连接查询。我们将以两个表格为例,一个是部门领导表 (system_dept_leader),另一个是用户表 (system_user),并演示如何通过左连接来获取部门领导的详细信息,包括用户的昵称和工号。

数据表结构

假设我们有以下两个数据表:

部门领导表 (system_dept_leader)

字段名类型描述
idLong主键
dept_idLong部门ID
user_idLong用户ID
is_primaryInteger是否主要

 

用户表 (system_user)

字段名类型描述
idLong主键
nicknameString昵称
worker_codeString工号

实现步骤

我们将通过以下步骤实现左连接查询:

  1. 定义查询结果类
  2. 编写 SQL 提供者
  3. 在 Mapper 接口中定义查询方法

1. 定义查询结果类

首先,我们需要定义一个查询结果类,用于存储查询结果。这里我们定义一个 DeptLeaderDORespVO 类,继承自基础类 DeptLeaderDOBaseVO,并包含用户的昵称和工号字段。

@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class DeptLeaderDORespVO extends DeptLeaderDOBaseVO {

    private Long id;

    @NotNull(message = "Department不能为空")
    private Long deptId;

    @NotNull(message = "User不能为空")
    private Long userId;

    @NotNull(message = "Is Primary不能为空")
    private Integer isPrimary;

    private String nickname;
    private String workerCode;
}

2. 编写 SQL 提供者

接下来,我们编写一个 SQL 提供者类,用于动态生成 SQL 查询。这里使用 SelectProvider 注解来指定自定义 SQL。

public class DeptLeaderSqlProvider {

    public String selectDeptLeaderWithUserDetails(Map<String, Object> params) {
        Long deptId = (Long) params.get("deptId");
        Long userId = (Long) params.get("userId");
        Integer isPrimary = (Integer) params.get("isPrimary");

        StringBuilder sql = new StringBuilder();
        sql.append("SELECT dl.*, su.nickname, su.worker_code AS workerCode ");
        sql.append("FROM system_dept_leader dl ");
        sql.append("LEFT JOIN system_user su ON dl.user_id = su.id ");
        sql.append("WHERE 1=1 ");
        if (deptId != null) {
            sql.append("AND dl.dept_id = #{deptId} ");
        }
        if (userId != null) {
            sql.append("AND dl.user_id = #{userId} ");
        }
        if (isPrimary != null) {
            sql.append("AND dl.is_primary = #{isPrimary} ");
        }
        sql.append("ORDER BY dl.id DESC");
        return sql.toString();
    }
}

3. 在 Mapper 接口中定义查询方法

最后,在 Mapper 接口中定义查询方法,并使用 SelectProvider 注解指定 SQL 提供者。

@Mapper
public interface DeptLeaderMapper extends BaseMapperX<DeptLeaderDO> {

    @SelectProvider(type = DeptLeaderSqlProvider.class, method = "selectDeptLeaderWithUserDetails")
    List<DeptLeaderDORespVO> selectDeptLeaderWithUserDetails(@Param("deptId") Long deptId,
                                                             @Param("userId") Long userId,
                                                             @Param("isPrimary") Integer isPrimary);
}

4. 调用服务层方法

在服务层中调用该查询方法,并将结果返回给前端或进行进一步处理。

@Service
public class DeptLeaderService {

    @Autowired
    private DeptLeaderMapper deptLeaderMapper;

    public List<DeptLeaderDORespVO> getDeptLeaders(Long deptId, Long userId, Integer isPrimary) {
        return deptLeaderMapper.selectDeptLeaderWithUserDetails(deptId, userId, isPrimary);
    }
}

总结

通过以上步骤,我们实现了在 MyBatis Plus 中使用左连接查询部门领导详细信息的方法。该方法可以根据传入的条件动态生成 SQL 查询,获取部门领导及其关联用户的信息。这种方式在需要跨多个表格进行数据查询时非常有用,确保了数据查询的灵活性和效率。

希望这篇文章能帮助您更好地理解和使用 MyBatis Plus 进行复杂查询。如果有任何问题或进一步的需求,欢迎讨论和交流。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1919742.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

tk 对文本设置下划线

import tkinter as tkdef underline_text():# 获取当前选中的文本范围selected_text text_widget.tag_ranges(tk.SEL)if selected_text:# 如果有文本被选中tag_name "underline"# 检查选中文本是否已经有下划线if text_widget.tag_names(selected_text[0]):if &quo…

Qt | 绘制直线与 QLineF 类

点击上方"蓝字"关注我们 01、绘制直线 02、Qline和QLineF 【1】QLine 是整型版本,成员函数较少,QLineF 是精度更高的浮点型版本,本文以 QLineF 类 进行讲解。 QLineF 类提供了一个二维向量,使用 QLineF 类绘制直线可以利用该类中的成员函数方便 的对线条的属…

【EIScopus稳检索-高录用】第五届大数据与社会科学国际学术会议(ICBDSS 2024)

大会官网&#xff1a;www.icbdss.org 大会时间&#xff1a;2024年8月16-18日 大会地点&#xff1a;中国-上海 接受/拒稿通知&#xff1a;投稿后1-2周内 收录检索&#xff1a;EI,Scopus *所有参会者现场均可获取参会证明&#xff0c;会议通知&#xff08;邀请函&#xff09;&…

vscode里最好用的A股量化神器

shares vscode 插件A 股量化交易系统后台开发语言 Go/Python gmsec算法使用&#xff1a;pytorchK 线标注中意榜黄金上穿全链路量化&#xff0c;行业板块分析&#xff0c;直接贴图。欢迎体验 源码地址&#xff1a; GitHub - xxjwxc/shares: A-share quantitative system. A股量…

Python学习笔记35:进阶篇(二十四)pygame的使用之音频文件播放

前言 基础模块的知识通过这么长时间的学习已经有所了解&#xff0c;更加深入的话需要通过完成各种项目&#xff0c;在这个过程中逐渐学习&#xff0c;成长。 我们的下一步目标是完成python crash course中的外星人入侵项目&#xff0c;这是一个2D游戏项目。在这之前&#xff…

对接高德开放平台API

高德开放平台API&#xff1a; https://lbs.amap.com/ 一、天气查询 天气查询: https://lbs.amap.com/api/webservice/guide/api/weatherinfo adcode城市码表下载: https://lbs.amap.com/api/webservice/download Component public class WeatherUtil {Resourceprivate GdCon…

异步任务中传递用户信息的一种优雅写法

目录 前言基础写法测试示例 升级写法测试示例 前言 在异步任务中&#xff0c;我们通常会遇到子任务获取当前用户的场景。我们可能会采取ThreadLocal来存储主线程传递的用户信息。然后在业务开始时set&#xff0c;业务结束时remove&#xff0c;来保证不会出现OOM的场景。 基础…

vue使用 “xlsx-style“: “^0.8.13“ 报错

关于jszip not a constructor报错配置config.js文件后可能还报错的问题&#xff1a; 在node_modules处找到node_modules\xlsx-style\xlsx.js 文件。 将 if(typeof jszip undefined) jszip require(./jszip).JSZip;(应该在xlsx.js文件1339行左右) 替换成 if(typeof jszip und…

聚类分析方法(三)

目录 五、聚类的质量评价&#xff08;一&#xff09;簇的数目估计&#xff08;二&#xff09;外部质量评价&#xff08;三&#xff09;内部质量评价 六、离群点挖掘&#xff08;一&#xff09;相关问题概述&#xff08;二&#xff09;基于距离的方法&#xff08;三&#xff09;…

外贸达人的秘密武器:提升效率的插件神器

每一位外贸从业者都在寻找能够提升工作效率、优化业务流程的利器。今天&#xff0c;我要向大家介绍几款外贸工作中的实用的浏览器插件工具&#xff0c;它们将是你业务成功的得力助手。 语言翻译类&#xff1a; Acronyms&#xff1a;外贸交流中&#xff0c;缩写的快速识别至关重…

高级语言与机器级代码之间的对应

目录 一. 汇编语言的基础知识二. 常用的X86汇编指令三. AT&T格式和Intel格式四. 选择语句的机器级表示五. 循环语句机器级表示 \quad 一. 汇编语言的基础知识 \quad X86就是能被能够被以86结尾的CPU&#xff08;如8086&#xff0c;80286&#xff0c;80386&#xff09;支持的…

基于前馈神经网络 FNN 实现股票单变量时间序列预测(PyTorch版)

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对抗网络、门控循环单元、长短期记…

使用 Plotly.js 在 Vue 中创建交互式散点图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 使用 Plotly.js 在 Vue 中创建交互式散点图 应用场景介绍 Plotly.js 是一个功能强大的 JavaScript 库&#xff0c;用于创建交互式数据可视化。它支持各种图表类型&#xff0c;包括散点图、折线图和直方图。在…

分享:2024好的ai文章生成器下载资源 tzqsbic

在当今数字化的时代&#xff0c;ai技术的发展日新月异&#xff0c;为我们的生活和工作带来了诸多便利。其中&#xff0c;ai文章生成器作为一项创新的工具&#xff0c;给当代人们带来了很多好处&#xff0c;尤其是对于很多创作者&#xff0c;不仅能解决创作困难&#xff0c;而且…

【Python实战因果推断】30_双重差分1

目录 Panel Data 在讨论了干预效果异质性之后&#xff0c;是时候转换一下思路&#xff0c;回到平均干预效果上来了。在接下来的几章中&#xff0c;您将学习如何利用面板数据进行因果推断。 面板数据是一种跨时间重复观测的数据结构。在多个时间段观察同一单位&#xff0c;可以…

VMware虚拟机使用标准分区后对分区进行扩容

前言&#xff1a; 使用虚拟机创建系统后&#xff0c;/ 盘 想要扩容需要几步才能实现&#xff0c;下面将介绍具体流程 确定根分区磁盘以及分区号&#xff0c;和起始扇区和结束扇区 # 查看磁盘名称和分区 # 如下可看出根分区为 /dev/sda2 &#xff0c;磁盘为sda [root192 ~]# ls…

【C++】继承(二)

目录 5、继承与友元 6、继承与静态成员 7、复杂的菱形继承和菱形虚拟继承 8、继承的总结与反思 5、继承与友元 友元关系不能继承&#xff0c;也就是说父类的友元不能访问子类的私有或保护的成员 class Student; class Person { public:friend void Display(const Person&a…

Struts 2.0.0 至 2.1.8.1 远程命令执行漏洞(CVE-2010-1870)

前言 CVE-2010-1870 是一个存在于 Apache Struts 2 中的漏洞&#xff0c;特别是在 Struts 2 动作框架中。这个安全缺陷允许远程攻击者通过操纵动态方法调用&#xff08;DMI&#xff09;功能在服务器上执行任意代码。当 DMI 功能启用时&#xff0c;框架可以接受和处理来自用户输…

交叉熵损失函数的使用目的(很肤浅的理解)

第一种使用方法 import torch from torch import nn # Example of target with class indices loss nn.CrossEntropyLoss() input torch.randn(3, 5, requires_gradTrue) target torch.empty(3, dtypetorch.long).random_(5) output loss(input, target) output.backward(…

初识c++(类与对象——上)

一、类的定义 1、类定义格式 • class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后面分号不能省 略。类体中内容称为类的成员&#xff1a;类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或 者成员函…