MyBatis-Plus-Join (MPJ) 框架介绍

news/2025/2/12 11:20:12/

MyBatis-Plus-Join (MPJ) 框架介绍

MyBatis-Plus-Join (MPJ) 是一个基于 MyBatis-Plus 的多表关联查询框架,它提供了一种优雅的方式来处理复杂的表关联查询。

主要特性

  1. Lambda 式查询

    wrapper.selectAs(Teacher::getId, TeacherLeaveVO::getTeacherId).leftJoin(Course.class, Course::getTeacherId, Teacher::getId)
    
  2. 自动字段映射

    // 自动映射所有字段
    wrapper.selectAll(Teacher.class).selectAll(Course.class)
    
  3. 灵活的关联方式

    // 支持左连接、右连接、内连接
    .leftJoin()  // 左连接
    .rightJoin() // 右连接
    .innerJoin() // 内连接
    
  4. 分页查询支持

    mapper.selectJoinPage(new Page<>(current, size), VO.class, wrapper)
    

使用步骤

  1. 添加依赖

    <dependency><groupId>com.github.yulichang</groupId><artifactId>mybatis-plus-join</artifactId><version>1.4.6</version>
    </dependency>
    
  2. Mapper 继承

    @Mapper
    public interface TeacherMapper extends MPJBaseMapper<Teacher> {
    }
    
  3. 构建查询

    MPJLambdaWrapper<Teacher> wrapper = new MPJLambdaWrapper<>(Teacher.class).selectAll(Teacher.class).leftJoin(Course.class, Course::getTeacherId, Teacher::getId);
    

查询方式对比

传统 MyBatis

<select id="getTeacherLeaves">SELECT t.id, t.name,c.id, c.name,sl.student_id, sl.leave_dateFROM teacher tLEFT JOIN course c ON c.teacher_id = t.idLEFT JOIN student_leave sl ON sl.course_id = c.idWHERE t.id = #{teacherId}
</select>

MPJ 方式

wrapper.selectAll(Teacher.class).selectAll(Course.class).selectAll(StudentLeave.class).leftJoin(Course.class, Course::getTeacherId, Teacher::getId).leftJoin(StudentLeave.class, StudentLeave::getCourseId, Course::getId)

优势

  1. 类型安全

    • 使用 Lambda 表达式,避免字段名拼写错误
    • 重构时自动更新关联字段
  2. 代码简洁

    • 无需编写 XML
    • 链式调用更直观
  3. 维护方便

    • 统一的查询方式
    • 复用查询条件
  4. 功能完整

    • 支持分页
    • 支持多表关联
    • 支持字段别名
    • 支持条件构建

最佳实践

  1. 抽取公共查询条件

    private MPJLambdaWrapper<Teacher> baseWrapper() {return new MPJLambdaWrapper<>(Teacher.class).selectAll(Teacher.class).selectAll(Course.class);
    }
    
  2. 使用 VO 对象映射

    @Data
    public class TeacherLeaveVO {private Long teacherId;private String teacherName;// ...
    }
    
  3. 合理使用字段选择

    // 选择特定字段而不是全部
    .select(Teacher::getId, Teacher::getName)
    // 需要所有字段时使用 selectAll
    .selectAll(Teacher.class)
    

注意事项

  1. 字段命名要符合规范,建议使用驼峰命名
  2. 合理使用表别名避免字段冲突
  3. 关注查询性能,避免不必要的关联
  4. 适当使用索引优化查询性能

MPJ 极大地简化了多表关联查询的编写,提高了开发效率,是一个值得使用的 MyBatis-Plus 扩展工具。


http://www.ppmy.cn/news/1571405.html

相关文章

4.python+flask+SQLAlchemy+达梦数据库

前提 1.liunx Centos7上通过docker部署了达梦数据库。从达梦官网下载的docker镜像。(可以参考前面的博文) 2.windows上通过下载x86,win64位的达梦数据库,只安装客户端,不安装服务端。从达梦官网下载达梦数据库windows版。(可以参考前面的博文) 这样就可以用windows的达…

cuda学习资料汇总

一 gemm 1.1 ampere 1.2 hopper 1.2.1 github中的使用cutlass和wgmma cutlass/examples/cute/tutorial/wgmma_sm90.cu at main NVIDIA/cutlass GitHub 1.2.2 TMA (1)TMA cutlass

二、Golang Channel通信和控制题目

要求 采用Golang语言中channel实现协程间的通讯&#xff0c;并通过控制channel控制起输入与输出格式。其中一个协程sender负责发送字符串"ABC"的字符&#xff0c;另一个协程reciever负责接收这些字符并打印。 要求接收方reciever协程能够按照顺序&#xff0c;按照行…

解决 idea 无法创建java8 模版

解决 idea 无法创建java8 模版 由于 Spring 官方不再维护 旧的版本了导致的 https://start.spring.io 解决方式很简单 切换到 阿里源就可以了 https://start.aliyun.com/ 项目生成 成功 总结 &#xff1a;IDEA 内置的 Spring Initializr 创建 Spring Boot 项目实际上是依赖官…

【CubeMX-HAL库】STM32F407—无刷电机学习笔记

目录 简介&#xff1a; 学习资料&#xff1a; 跳转目录&#xff1a; 一、工程创建 二、板载LED 三、用户按键 四、蜂鸣器 1.完整IO控制代码 五、TFT彩屏驱动 六、ADC多通道 1.通道确认 2.CubeMX配置 ①开启对应的ADC通道 ②选择规则组通道 ③开启DMA ④开启ADC…

从零构建高可用MySQL集群:Percona XtraDB Cluster 实战部署

实战指南&#xff1a;基于Percona XtraDB Cluster 构建高可用 MySQL 集群架构 引言&#xff1a;为什么选择PXC&#xff1f; Percona XtraDB Cluster&#xff08;PXC&#xff09;是基于Galera协议的MySQL高可用解决方案&#xff0c;提供同步多主复制、数据强一致性等关键特性&…

【用Deepseek搭建免费的个人知识库--综合教程(完整版)】第二篇:Ollama服务器

用Deepseek搭建免费的个人知识库–综合教程&#xff08;完整版&#xff09;&#xff1a;第二篇&#xff1a;Ollama服务器部署 OLLAMA服务器的配置在很多网上都已经介绍的非常清楚了&#xff0c;我们的重点不在于那些简单的步骤&#xff0c;而是在需要为下一步做准备的地方更加…

iOS AES/CBC/CTR加解密以及AES-CMAC

感觉iOS自带的CryptoKit不好用&#xff0c;有个第三方库CryptoSwift还不错&#xff0c;好巧不巧&#xff0c;清理过Xcode缓存后死活下载不下来&#xff0c;当然也可以自己编译个Framework&#xff0c;但是偏偏不想用第三方库了&#xff0c;于是研究了一下&#xff0c;自带的Com…