【MPJBaseMapper】更优雅写SQL的开源工具

MyBatisPlus笔记 MyBatisPlus环境搭建的步骤?BaseMapper通过入门案例制作,MyBatisPlus的优点有哪些?MyBatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提高效率https有什么简单的办法可以自动生成实体类的GET、SET方法?Lombok,一个Java类库,提供了一组注解,简化POJO实体类开发。 阅读详情
AI摘要

MPJBaseMapper是MyBatis-Plus-Join库的一部分,它在MyBatis-Plus基础上增强了连表查询能力,支持DTO投影、别名、分页等。通过链式语法简化了多表查询的编写,同时保持了与MyBatis-Plus生态的兼容性。

利用lambda表达式规范表字段 避免拼写错误,优雅的写sql。
1.带分页的查多条数据 selectList
    startPage();
    List<App> list = appBusinesslogMapper.
           selectList(Wrappers.lambdaQuery(App.class)
                 .select(App::getBusinessContent, App::getBusinessType, App::getBusinessStatus, App::getBusinessDate, App::getCertId)
                 .eq(App::getUserId, getUserId())
            .orderByDesc(App::getBusinessId));
    return getDataTable(list);
2.查单条数据 selectOne
App association = appAssociationMapper.selectOne(Wrappers.lambdaQuery(App.class)
       .eq(App::getUserId, userId)
       .eq(App::getEnterpriseId, enterpriseId));
	   
3.修改操作
    appSealMapper.update(Wrappers.lambdaUpdate(App.class)
    .set(App::getStatus, 0)
    .eq(App::getEnterpriseId, enterprise.getEnterpriseId())
    .eq(App::getStatus, 1));

1. MPJBaseMapper 是什么?能做什么?

MPJBaseMapper 来自第三方开源库 MyBatis-Plus-Join(简称 MPJ)。它在 MyBatis-Plus 的基础上增强了“连表查询”能力,让你用类似 QueryWrapper 的链式语法完成 LEFT/INNER/RIGHT JOIN,还支持 DTO 投影、别名、分页、逻辑删除、一对一/一对多映射 等常见需求。其核心就是配合 MPJLambdaWrapper / MPJQueryWrapper 构建 join 条件,然后通过 selectJoinList / selectJoinPage / selectJoinOne … 等方法执行。GitHubMyBatis-Plus-Join

一句话:不改你的 CRUD,用更优雅的方式写多表查询(“只做增强不做改变”是官方定位)。MyBatis-Plus-Join


2. 安装与版本要求

(我项目中使用的mybatis-plus 3.58和yulichang 1.51)

Maven 最新依赖:

<dependency> <groupId>com.github.yulichang</groupId> <artifactId>mybatis-plus-join-boot-starter</artifactId> <version>1.5.4</version> </dependency> 

截至 2025-08-14,最新稳定版为 1.5.4,要求 MyBatis-Plus ≥ 3.1.2。MyBatis-Plus-Join

分页插件(用于 selectJoinPage):跟 MyBatis-Plus 一样配置分页拦截器即可。


3. 快速上手(照抄就能跑)

3.1 定义实体(示例)

@Data @TableName("user") public class User { @TableId private Long id; private String name; private Integer status; } @Data @TableName("user_address") public class UserAddress { @TableId private Long id; private Long userId; private String tel; private Long areaId; } @Data @TableName("area") public class Area { @TableId private Long id; private String province; private String city; } 

3.2 定义返回 DTO(只装你要的字段)

@Data public class UserDTO { private Long id; private String name; private String tel; private String userAddress; // 通过 selectAs 映射别名 private String province; private String city; } 

3.3 定义 Mapper:继承 MPJBaseMapper

@Mapper public interface UserMapper extends MPJBaseMapper<User> {} 

继承 MPJBaseMapper 后即可获得 selectJoinList / selectJoinPage / selectJoinOne … 等连表方法。JavaDoc

3.4 写第一条连表查询(Lambda 版,最常用)

@Resource private UserMapper userMapper; public List<UserDTO> demo() { MPJLambdaWrapper<User> wrapper = JoinWrappers.lambda(User.class) .selectAll(User.class) // 主表全选 .select(UserAddress::getTel) // 选取从表字段 .selectAs(UserAddress::getAddress, UserDTO::getUserAddress) // 别名映射到 DTO .select(Area::getProvince, Area::getCity) .leftJoin(UserAddress.class, UserAddress::getUserId, User::getId) .leftJoin(Area.class, Area::getId, UserAddress::getAreaId) .eq(User::getStatus, 1) .like(UserAddress::getTel, "138"); // 多条记录 return userMapper.selectJoinList(UserDTO.class, wrapper); } 

分页查询:

IPage<UserDTO> page = userMapper.selectJoinPage(new Page<>(1, 10), UserDTO.class, wrapper); 

上面这套写法与官方 README 中的“Lambda 形式用法”一致,leftJoin / selectAs / selectJoinList / selectJoinPage 等是最常用的 API。GitHub


4. 常用 API 速查

  • 查询类方法(在 MPJBaseMapper 上)
    selectJoinList、selectJoinPage、selectJoinOne、selectJoinMap、selectJoinMaps、selectJoinMapsPage、selectJoinCount(不同版本命名略有差异,但 1.5.x 仍保持兼容与延续)。JavaDoc

  • 构造条件(Wrapper)

    • MPJLambdaWrapper<T>:最常用,类型安全(SFunction)。

    • MPJQueryWrapper<T>:字符串方式,更灵活(复杂 SQL/函数等)。

    • 链式:leftJoin / innerJoin / rightJoin / on / eq / ne / gt / like / in / groupBy / orderBy / having …。GitHub

  • 投影与别名

    • selectAll(clazz)、select(FromTable::getField)、selectAs(FromTable::getField, Dto::setField)。GitHub


5. 进阶功能与亮点

  1. 子查询 / 自定义 FROM/JOIN 数据集:1.5.x 起增强明显,支持在 selectFunc 传参/子查询、join/from 使用自定义数据集(如子查询或临时表),便于应对复杂报表。GitHub

  2. 一对一 / 一对多映射(Deep):MPJBaseMapper 继承了 MPJDeepMapper,可将连表结果映射为更复杂的对象结构(例如嵌套)。适合“主对象 + 集合/子对象”场景。JavaDoc

  3. 逻辑删除、TypeHandler、别名:与 MP 配合良好,常见企业规范(逻辑删、类型转换、列枚举/别名)能无缝使用。MyBatis-Plus-Join

  4. 与 MP 生态一致:拦截器、分页、自动填充等依旧按 MP 的用法来,几乎零迁移成本。MyBatis-Plus-Join


6. 实战模板:常见查询场景

6.1 条件可选 + 只选所需字段(性能友好)

public IPage<UserDTO> queryUsers(String telLike, List<Long> areaIds, int pn, int size) {
  MPJLambdaWrapper<User> w = JoinWrappers.lambda(User.class)
      .select(User::getId, User::getName)                 // 主表只选必要列
      .selectAs(UserAddress::getAddress, UserDTO::getUserAddress)
      .select(Area::getProvince, Area::getCity)
      .leftJoin(UserAddress.class, UserAddress::getUserId, User::getId)
      .leftJoin(Area.class, Area::getId, UserAddress::getAreaId)
      .eq(User::getStatus, 1)
      .like(telLike != null, UserAddress::getTel, telLike)   // 条件可选
      .in(areaIds != null && !areaIds.isEmpty(), Area::getId, areaIds)
      .orderByDesc(User::getId);

  return userMapper.selectJoinPage(new Page<>(pn, size), UserDTO.class, w);
}
 

6.2 仅在有条件时才 JOIN(动态 JOIN)

MPJLambdaWrapper<User> w = JoinWrappers.lambda(User.class).selectAll(User.class);
if (needAddress) {
  w.leftJoin(UserAddress.class, UserAddress::getUserId, User::getId)
   .select(UserAddress::getTel);
}
List<UserDTO> list = userMapper.selectJoinList(UserDTO.class, w);

6.3 使用字符串 Wrapper 处理函数/复杂表达式

MPJQueryWrapper<User> w = new MPJQueryWrapper<User>()
  .select("t.id, t.name, addr.tel, CONCAT(area.province,'-',area.city) AS region")
  .leftJoin("user_address addr ON addr.user_id = t.id")
  .leftJoin("area ON area.id = addr.area_id")
  .like("addr.tel", "138");
List<Map<String, Object>> rows = userMapper.selectJoinMaps(w);

7. 与“写 XML 连表”相比的优势

  • 类型安全 + 更少模板代码:Lambda 指定列与实体属性强绑定,避免手写列名出错。

  • DTO 投影天然支持:selectAs 直达目标字段,减少二次拷贝。

  • 统一风格:依旧是 MP 的链式风格,团队学习成本低。

  • 功能覆盖常见企业场景:分页、逻辑删除、复杂 where/group/having、子查询等。GitHubMyBatis-Plus-Join


8. 踩坑与排雷

  1. 列名歧义(Column … is ambiguous)

    • 连表后 id/name 这类公共列易歧义。解决:

      • 用 selectAll(主表) + 明确选择从表列;

      • 为从表列用 selectAs 指定别名并映射到 DTO。GitHub

  2. 分页性能

    • selectJoinPage 会执行统计总数,复杂 JOIN 统计可能较慢。建议:只选必要字段、加好连接键索引、必要时改造为“先查主键分页,再二次查询详情”的模式(通用 SQL 优化思路)。

  3. 与自定义 SQL 注入器冲突

    • 如果你项目里自定义了 SqlInjector,再引入 MPJ 也会注入一个,可能出现 Bean 冲突。解决:给你自己的注入器 Bean 加 @Primary 或合并配置,避免二选一报错。优快云博客

  4. 依赖版本

    • 牢记 MPJ 与 MyBatis-Plus 的版本匹配(MPJ 1.5.4 需 MP 3.1.2+),升级注意查看 Release Notes。MyBatis-Plus-JoinGitHub


9. 常用方法清单(速记)

  • 多条:selectJoinList(ResultType.class, wrapper)

  • 单条:selectJoinOne(ResultType.class, wrapper)

  • 分页:selectJoinPage(page, ResultType.class, wrapper)

  • Map 结果:selectJoinMap(wrapper) / selectJoinMaps(wrapper) / selectJoinMapsPage(page, wrapper)

  • 计数:selectJoinCount(wrapper)

  • Wrapper 入口:JoinWrappers.lambda(Entity.class)、new MPJLambdaWrapper<>()、new MPJQueryWrapper<>()

  • JOIN:leftJoin / innerJoin / rightJoin

  • 选择列:selectAll / select / selectAs
    (方法命名与用法以官方文档/JavaDoc 为准,1.5.x 与 1.2.x 的核心方法名保持一致。)GitHubJavaDoc


10. 什么时候该用 MPJ,什么时候别用?

  • 该用:业务表设计规范、连表键有索引、查询列有限、需要快速开发且维护成本低。

  • 慎用:超复杂报表(几十列+多层嵌套聚合)——此类往往配专门 SQL/物化视图更稳。

  • 折中:常规查询走 MPJ;极少数“怪 SQL”保留 XML/自定义 @Select,二者并存。


11. 一页总结

  • 引入依赖 → Mapper 继承 MPJBaseMapper<T> → 用 MPJLambdaWrapper 写 leftJoin/innerJoin → selectJoinList/One/Page 输出到 DTO(用 selectAs 起别名)。

  • 优势:少写 XML、类型安全、对 MP 友好、功能覆盖够用。

  • 注意:列名歧义要用别名;分页尽量少选列;自定义 SqlInjector 记得处理 Bean 冲突;版本匹配看文档。

mybatis-plus-join:支持连表查询的mybatis-plus,mybatis-plus风格的连表操作提供wrapper.leftJoin(),wrapper.rightJoin()等操作 mybatis加联接 支持连表查询的 使用方法 通用连表包装 安装 在项目中添加依赖 < dependency> < groupId>com.github.yulichang</ groupId> < artifactId>mybatis-plus-join</ artifactId> < version>1.1.1</ version> </ dependency> 或者克隆代码到本地,执行mvn install,再重新以上依赖 添加配置文件 @Configuration public class MybatisPlusConfig { /** * 启用连表拦截器 */ @Bean public MybatisPlusInterceptor paginationInterceptor () { 立即下载

相关推荐

Mybatis-Plus BaseMapper的用法详解

主要介绍了Mybatis-Plus BaseMapper的用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

MyBatisPlus的join联表查询(MPJBaseMapper)

MyBatisPlus的join联表查询(MPJBaseMapper)

weixin_60265082的博客 7259

光伏5G多合一融合终端|光伏多合一融合终端|光伏多合一群调群控网关|分布式光伏群控群调|光伏AGC/AVC系统这几者之间什么技术关系,多少钱一套预算?

RCL-0923光伏电站电压\功率自动控制装置(光伏AVC/AGC),能够接收调度DMS下发的调节目标(电压或无功),按既定策略的调节目标计算光伏电站无功功率出力需求,支持总有、无功,最大可调范围、逆变器个数等数据的上送,通过选择控制设备并进行无功功率出力分配,并将最终控制指令自动下达给被控制设备,最终实现光伏电站无功功率控制,实现无功功率、并网点电压的监测和控制,跟踪调度中心下发的电压或无功调节目标值,实现分布式电源的可观可测,可调可控。光伏5G多合一融合终端的功能:群调群控/AGC/AVC功能。

分布式DTU物联网DTU 2604

BaseMapper 接口介绍

这是最灵活的一点,在BaseMapper中直接复制了FnMapper/*** 根据主键更新实体中不为空的字段,强制字段不区分是否 null,都更新* * 当前方法来自 {@link io.mybatis.mapper.fn.FnMapper},该接口中的其他方法用 {@link ExampleMapper} 也能实现* @param entity 实体类。

八戒的博客 3296

COMSOL 6.4安装全攻略:安装包获取、许可证配置与避坑指南

多物理场仿真是现代工程与科研中不可或缺的技术手段,其核心原理在于将电磁、结构、流体、传热等不同物理过程的耦合效应置于统一环境中求解,从而真实模拟复杂系统行为。这类仿真平台能大幅提升产品研发与设计验证效率,广泛应用于电子散热、声学分析、电力设备等领域。在部署最新版本仿真软件时,安装与许可证配置往往成为影响工作效率的关键环节。本文系统梳理COMSOL 6.4在Windows平台的安装全流程,涵盖安装包获取、系统依赖准备、许可证配置、常见报错排查等实用经验,帮助工程师与科研人员一次性完成环境搭建,把更多时间投入真

weixin_30000735的博客 1306

深入剖析:功率放大电路设计精髓——从理论到实践

输入信号首先被调制(通常是PWM脉宽调制)成高频开关信号,驱动功率开关管(MOSFET),再通过LC低通滤波器滤除高频分量,还原出放大的音频信号。在靠近功放板电源引脚处放置足够容量的电解电容(如100uF - 1000uF)和高频瓷片电容(如0.1uF)并联进行电源去耦,抑制低频和高频干扰,防止低频振荡(Motorboating)和高频自激。,堪称电子世界里的“能量转换器”。当输入信号在零附近(即两个器件切换导通的区域)时,由于器件的开启电压(Vbe或Vgs)不为零,输出波形会出现明显的衔接不流畅的失真。

Zihan2558的博客 1691

MybatisPlus联合查询

目录1、什么是Mybatis-plus-join?2、下载Mybatis-plus-join3、离线版请使用Maven将其打包成jar包3.1、使用idea打包4.项目中引用Mybatis-plus-join的pom.xml配置5、在业务中使用mybatis-plus-join的准备使用核心类 MPJLambdaWrapper和MPJQueryWrapperMPJLambdaWrapper用法MPJLambdaWrapper示例简单的3表查询分页查询MPJQueryWrapper简单的3表查询分页查询还可以

赵广陆 3万+

三甲医院网络架构与安全建设实战

华为OceanStor] [华为OceanStor][PACS存储双活] [HIS数据库同步]患者隐私 数据脱敏 天清Web防火墙动态脱敏策略。主数据中心 --[OTV专线]-- 备数据中心。实现医疗业务网/卫生专网/互联网三网隔离。核心业务配置(华为CE6865)自动备份配置(每天02:00)安全事件响应(30分钟SLA)漏洞扫描(每周日00:00)实现医疗物联网统一接入管控。五、等保2.0合规关键配置。堡垒机登录(双因素认证)四、医疗物联网安全方案。

有小小的远大抱负 1909

Mybatis-plus实现联表查询

Mybatis-plus实现联表查询

zcs18338992657的博客 2890

Tessent IJTAG ICL:从规范到实践的硬件描述语言指南

本文深入解析Tessent IJTAG ICL语言在硬件测试中的应用,从规范到实践提供全面指南。通过模块化设计、网络提取与编辑等实战技巧,帮助工程师高效构建标准化测试网络,显著提升芯片测试效率与覆盖率。特别分享TDR/SIB/TAP的ICL实现方法及调试策略,适用于SoC、车载芯片等复杂场景。

weixin_33606346的博客 299

YOLO26优化:注意力魔改 | 用于微小目标检测的上下文增强和特征细化网络ContextAggregation,助力小目标检测,暴力涨点

用于微小目标检测的上下文增强和特征细化网络ContextAggregation,助力小目标检测

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 484

使用MybatisPlus进行分页

3.Service层。

springxing的博客 758

基于 Qt C++ 的 2D 动画制作工具

你可以修改它的中心坐标 (X, Y)、宽度 (W)、高度 (H),或点击 "选择颜色" 按钮改变其填充色。* **图形视图 (`QGraphicsView` 和 `QGraphicsScene`)**: 用于显示和编辑当前帧的内容。

寒寒豆豆软件公司的博客 111

论mybatisPlus 连表插件(MPJBaseMapper) 与自定义SQL注入器冲突

mybatisplus 的好处就不用多说了,带给我们最大的好处就是不用再重复编写那些简单的sql语句。但是多表查询的时候却还是不得不用xml来解决,但是想要偷懒,不想写xml,于是去网上搜索了下是否有连表插件,居然还真有。于是乎就拿下来试用下,问题就来了,由于项目里有写过自定义的sql注入器,加上链表插件后,启动居然报错了,于是乎查看源码分析原因,发现连表插件里也用到了sql注入器,原来如此,现在问题显而易见了。 因为连表插件里和项目原先配置里都有sql注入器,导致springboot容器在实例化类时不知

ygxyvip的博客 5500

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

MyBatis-Plus级联查询(多表联查)

mybatis-plus作为mybatis的增强工具,简化了开发中的数据库操作。一旦遇到left join或right join的左右连接,还是得老老实实的打开xml文件,手写上一大段的sql语句。今天总结一下一款叫做mybatis-plus-join的工具(后面就简称mpj了),可以用类似mybatis-plus中QueryWrapper的方式来进行联表查询。

m0_59408612的博客 2659

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Mybatis -plus -jion的复习

- 普通 Wrapper 和 Lambda Wrapper 生成的 SQL 相同queryWrapper.eq("name", "张三");

m0_68274160的博客 1531

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

一篇学懂丨三万字Mybatis Plus 详解 IService、BaseMapper、自动填充、分页查询功能Mapper 层选装件,比官方文档都细致

是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。愿景我们的愿景是成为 MyBatis 最好的搭档,就像魂斗罗中的 1P、2P,基友搭配,效率翻倍。

这里面的代码全是错的 3042

基于MybatisPlus动态生成Mapper/Service类的方法

mybatisplus动态生成mapper/service/serviceImpl类,不用生成对应文件。

weixin_42675725的博客 6154

基于mybatis-plus实现多表联查功能(mybatis-plus-join-boot-starter)

基于mybatis-plus实现多表联查功能(mybatis-plus-join-boot-starter)

小鬼的博客 3785

mybatis plus selectJoinPage 查询太慢问题解决

mybatisPlus 默认的count sql是 select count(*) from (sql),sql为查询数据的sql.通过测试发现select 里没有distinct的关键字,只扫主表,如果加上distinct关键字就会扫整个sql。通过打印sql发现,是获取total时查询过慢,因为使用了多个leftJoin.最重要 是这点:.使count里的sql只有主表,没有leftJoin表。分析:因为分页本身数据不大,最多也就几十条,速度不应该太慢。项目中遇到,数据量如果过大,分页查询就很慢。

qq_43921238的博客 3569

Mybatis-plus-join连表查询

最近发现一个好玩的框架,我们知道mybatis-plus在连表查询上是不行的,如果需要连表查询,那么我们就得乖乖的去写xml文件了,但是今天发现一个新的框架 mybatis-plus-join。它既包含了mybatis-plus的所有优点,然后还支持连表查询,还支持对多,对一的查询,行了废话不多说直接看代码吧。

weixin_39555954的博客 1万+

补充几个BaseMapper公用方法

用法如下,喜欢搓麻绳的朋友可以试试。

qq_37148232的博客 214

mybatis-plus MPJBaseMapper selectJoinOne 用法leftjoin一张表两次添加别名处理

可能是一个自定义的 Mapper,它扩展了 MyBatis-Plus 的基本 Mapper 功能。这段代码使用了 MyBatis-Plus (MP) 和其扩展功能来从数据库中查询一个。实例,允许使用流畅的 Lambda 表达式方式构建复杂的 SQL 查询。的所有字段以及关联的分析师和发布者的用户名。实例,该实例将被填充从数据库获取的数据。综上所述,这段代码的主要目的是根据提供的。表,并将其别名为 “user1”。表,并将其别名为 “user2”。再次执行左连接操作,连接。执行左连接操作,连接。

志存高远 1288

MybatisPlus的联表分页查询+动态拼接主子表条件

MybatisPlus动态联表分页查询

niewenxue的博客 9501

BaseMapper接口的使用

在封装的 BaseMapper 中只有一个插入语句,因为海量数据插入单条SQL无法实行,所以mybatis-plus 把批量插入放在了Service 层对应的封装接口里了。之所以会为负数,是因为数据库设置的是自增,而在User实体类中没有进行设置。MyBatis-Plus中的基本CRUD在内置的 BaseMapper 中都已得到了实现,我们可以直接使用,这样大大的简化了开发效率。设置完成后,将数据库之前测试的数据删除,重新运行一下。通过map条件查询,键值对应数据的字段和值。

yu的博客 1万+
上一篇: 【多页文件上传优化】首页快速返回,其余后台多线程异步处理 。涉及技术:springboot+多线程[自定义注解线程池]+MPJBaseMapper+PDFBox
下一篇: 【运营商双线路网络高可用】核心设备AD+业务服务器
alan0721
博客等级 码龄10年 29粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值