【java踩坑搞起】MybatisPlus封装的mapper不支持 join,那咋办

news2024/9/24 19:23:56

众所周知,Mybatis Plus 封装的 mapper 不支持 join,如果需要支持就必须自己去实现。但是对于大部分的业务场景来说,都需要多表 join,要不然就没必要采用关系型数据库了。

直到前几天,偶然碰到了这么一款叫做mybatis-plus-join的工具(后面就简称mpj了),使用了一下,不得不说真香!彻底将我从xml地狱中解放了出来,终于可以以类似mybatis-plusQueryWrapper的方式来进行联表查询了,话不多说,我们下面开始体验。

引入依赖

首先在项目中引入引入依赖坐标,因为mpj中依赖较高版本mybatis-plus中的一些api,所以项目建议直接使用高版本。

  • maven
<dependency>
    <groupId>com.github.yulichang</groupId>
    <artifactId>mybatis-plus-join</artifactId>
    <version>1.2.4</version>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.1</version>
</dependency>

引入相关依赖后,在springboot项目中,像往常一样正常配置数据源连接信息就可以了。

  • Gradle
implementation 'com.github.yulichang:mybatis-plus-join-boot-starter:1.4.4'

使用

  • mapper继承MPJBaseMapper (必选)
  • service继承MPJBaseService (可选)
  • serviceImpl继承MPJBaseServiceImpl (可选)

核心类MPJLambdaWrapper和MPJQueryWrapper

MPJLambdaWrapper用法

简单的三表查询

class test {
    @Resource
    private UserMapper userMapper;

    void testJoin() {
        //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用
        MPJLambdaWrapper<UserDO> wrapper = new MPJLambdaWrapper<UserDO>()
                .selectAll(UserDO.class)//查询user表全部字段
                .select(UserAddressDO::getTel)//查询user_address tel 字段
                .selectAs(UserAddressDO::getAddress, UserDTO::getUserAddress)//别名 t.address AS userAddress
                .select(AreaDO::getProvince, AreaDO::getCity)
                .leftJoin(UserAddressDO.class, UserAddressDO::getUserId, UserDO::getId)
                .leftJoin(AreaDO.class, AreaDO::getId, UserAddressDO::getAreaId)
                .eq(UserDO::getId, 1)
                .like(UserAddressDO::getTel, "1")
                .gt(UserDO::getId, 5);

        //连表查询 返回自定义ResultType
        List<UserDTO> list = userMapper.selectJoinList(UserDTO.class, wrapper);

        //分页查询 (需要启用 mybatis plus 分页插件)
        Page<UserDTO> listPage = userMapper.selectJoinPage(new Page<>(2, 10), UserDTO.class, wrapper);
    }
}

对应sql

SELECT  
    t.id, t.name, t.sex, t.head_img, 
    t1.tel, t1.address AS userAddress,
    t2.province, t2.city 
FROM 
    user t 
    LEFT JOIN user_address t1 ON t1.user_id = t.id 
    LEFT JOIN area t2 ON t2.id = t1.area_id 
WHERE (
    t.id = ? 
    AND t1.tel LIKE ? 
    AND t.id > ?)

说明:

  • UserDTO.class 查询结果返回类(resultType)
  • selectAll() 查询指定实体类的全部字段
  • select() 查询指定的字段,支持可变参数,同一个select只能查询相同表的字段
  • selectAs() 字段别名查询,用于数据库字段与业务实体类属性名不一致时使用
  • leftJoin() 参数说明;第一个参数: 参与连表的实体类class 第二个参数: 连表的ON字段,这个属性必须是第一个参数实体类的属性 第三个参数: 参与连表的ON的另一个实体类属性
  • 默认主表别名是t,其他的表别名以先后调用的顺序使用t1,t2,t3…
  • 条件查询,可以查询主表以及参与连接的所有表的字段,全部调用mp原生的方法,正常使用没有sql注入风险

MPJLambdaWrapper 还有很多其他的功能

  • 简单的SQL函数使用:https://gitee.com/best_handsome/mybatis-plus-join/wikis/selectFunc()?sort_id=4082479
  • ON语句多条件支持:https://gitee.com/best_handsome/mybatis-plus-join/wikis/leftJoin?sort_id=3496671

等效于ResultMap

<resultMap id="xxxxxxxx" type="com.github.yulichang.join.dto.UserDTO">
    <result property="id" column="id"/>
    <result property="name" column="name"/>
    <!--其他属性省略-->
    <collection property="addressList" javaType="java.util.List"
                ofType="com.github.yulichang.join.entity.UserAddressDO">
        <id property="id" column="mpj_id"/>
        <result property="address" column="address"/>
        <result property="userId" column="user_id"/>
        <!--其他属性省略-->
    </collection>
</resultMap>

MPJLambdaWrapper其他功能

  • 一对一,一对多使用:https://ylctmh.com/pages/core/lambda/select/selectCollection.html
  • 简单的SQL函数使用:https://ylctmh.com/pages/core/lambda/select/selectFunc.html
  • ON语句多条件支持:https://ylctmh.com/pages/core/lambda/join/leftJoin.html

分页查询

mpj中也能很好的支持列表查询中的分页功能,首先我们要在项目中加入分页拦截器:

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
    return interceptor;
}

接下来改造上面的代码,调用selectJoinPage()方法:

public void page() {
    IPage<OrderDto> orderPage = orderMapper.selectJoinPage(
      new Page<OrderDto>(2,10),
      OrderDto.class,
      new MPJLambdaWrapper<Order>()
        .selectAll(Order.class)
        .select(Product::getUnitPrice)
        .selectAs(User::getName, OrderDto::getUserName)
        .selectAs(Product::getName, OrderDto::getProductName)
        .leftJoin(User.class, User::getId, Order::getUserId)
        .leftJoin(Product.class, Product::getId, Order::getProductId)
        .orderByAsc(Order::getId));

    orderPage.getRecords().forEach(System.out::println);
}

注意在这里需要添加一个分页参数的Page对象,我们再执行上面的代码,并对日志进行解析,查看sql语句:

图片

可以看到底层通过添加limit进行了分页,同理,MPJQueryWrapper也可以这样进行分页。

最后

经过简单的测试,个人感觉mpj这款工具在联表查询方面还是比较实用的,能更应对项目中不是非常复杂的场景下的sql查询,大大提高我们的生产效率。当然,在项目的issues中也能看到当前版本中也仍然存在一些问题,希望在后续版本迭代中能继续完善。

关注我,后续更新更多好用的工具,效率天花板

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

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

相关文章

权限提升:网站后台.(提权思路.)

权限提升&#xff1a;网站后台 权限提升简称提权&#xff0c;由于操作系统都是多用户操作系统&#xff0c;用户之间都有权限控制&#xff0c;比如通过 Web 漏洞拿到的是 Web 进程的权限&#xff0c;往往 Web 服务都是以一个权限很低的账号启动的&#xff0c;因此通过 Webshell …

Form Designer V2发布

基于Ant Design 和 jQuery UI 的表单设计器 github 地址 特性 React Vue 3.x Typescript 统一的组件定义&#xff0c;对Vue 和React 的实现提供一个统一的组件定义描述 概念 Component 组件Layout 布局&#xff0c;一种特殊的ComponentComponent Editor 组件属性编辑器Comp…

【开发日志】2023.04 ZENO----Composite----CompImport、ReadImageFlie

CompImport TEST&#xff1a; 用ParticlesWrangle创造属性A(紫色&#xff09;&#xff0c;B&#xff08;青色&#xff09; &#xff0c;用CompImport结点将属性转化为图片输入到Composite3进行合成 Input&#xff1a; Output: /* 导入地形网格的属性&#xff0c;可能会有多个属…

Docker安装 docker-registry 镜像仓库

一、运行如下命令安装docker-registry镜像仓库&#xff1a; docker run -d \ -p 5000:5000 \ -v /usr/local/registry:/var/lib/registry \ --restartalways \ --name registry \ registry:2 二、测试镜像生成并推送到镜像仓库 1、新建一个目录 mkdir target 2、上传一…

Taro+Vue3 小程序引入echarts表

背景&#xff1a;根据需求在一个报告界面需要展示不同的echarts表来使数据更友好的显示。 效果如下&#xff1a; 一.taro支持echarts 官方说明&#xff1a;Taro 文档支持引用小程序端第三方组件库 物料文档&#xff1a;Taro 物料市场 | 让每一个轮子产生价值 二.引入echart…

Qt5.12實戰之Linux靜態庫編譯與調用完整過程

1.安裝gedit sudo apt-get install gedit -y 2.使用gedit編輯靜態庫源文件test.cpp gedit test.cpp 輸入下面內容 &#xff1a; #include <stdio.h> int func() {return 888; } 如下圖操作&#xff1a; 保存test.cpp並編譯 爲目標文件 gcc -c test.cpp如下圖示&am…

【剑指 Offer】(1)

文章目录前言一、 数组中重复的数字:fire: 解决方法:dog: 代码二、二维数组中的查找:fire:思路:dog:代码三、替换空格:fire:思路:dog: 代码四、从尾到头打印链表:fire:思路:dog:代码:dog: 代码五、重建二叉树:fire:思路:dog: 代码总结前言 剑指offer系列是一本非常著名的面试题…

【BUG SHOW】一个由高并发引起的缺陷分析

软件质量保障: 所寫即所思&#xff5c;一个阿里质量人对测试的所感所悟。 缺陷介绍 平台有这样的两个功能&#xff1a; ​功能01: 用户发起支付&#xff0c;成功则将表pay单据状态推进SUCCESS&#xff0c;然后发出支付结果消息&#xff1b;反之如果支付失败&#xff0c;则状态…

vue 报错 error:03000086:digital envelope routines::initialization error解决方案

目录 1. 引言: 2. 更换版本出现问题: 3. 出现原因: 4. 解决办法: -> 4. 1 删了 再换回16.15版本 -> 4.2 指令修改(好使) ---> 4.2.1效果如图 -> 4.3 其他指令就别试了 压根不好使 1. 引言: npm出现问题 , 卸载后 装了个新node 18.15版本 2. 更换版本…

Servlet-搭建个人博客系统(MVC架构模式简介,maven的配置和使用)

目录 1. MVC架构模式简介 2. maven的配置和使用 3. 项目总述&#x1f43b; 3.1 &#x1f34e;Controller层 3.2 &#x1f34e;Model层 3.3 &#x1f34e;View层 4. 页面的主要功能实现&#x1f43b; 4.1 &#x1f34e;登陆页面&#xff08;login.html&#xff09; 4.2…

Oracle Recovery Tools快速恢复断电引起的无法正常启动数据库----惜分飞

由于异常断电,数据库启动报错ORA-01113和ORA-01110&#xff0c;ORA-00322和ORA-00312以及ORA-00314和ORA-00312错误 Mon Apr 17 09:35:04 2023 ALTER DATABASE OPEN Errors in file D:\APP\ADMINISTRATOR\diag\rdbms\orcl\orcl\trace\orcl_ora_10192.trc: ORA-01113: 文件 1 需…

史上最牛二分查找,不服来战

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paperjie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《算法详解》&#xff0c;笔者用重金(时间和精力)打造&#xff0c;将算法知识一网打尽&#xff0c;希望可以…

音视频-ffplay的音视频同步

最近自己在做一个视频播放器&#xff0c;渲染视频帧时有些疑惑&#xff0c;所以特意来学习一下ffplay中是如何处理视频帧的渲染的&#xff01;&#x1f60a; 我自己最初的理解是这样 1、只关心视频本身的时间戳&#xff0c;不考虑音视频同步以及其他的同步时钟&#xff0c;或…

写了那么久的文章,现在才改回来!

大家好&#xff0c;我是即兴小索奇&#xff0c;最近在阅读文章时发现了自己文章的一个缺陷&#xff0c;就记录下来并分享给大家&#xff0c;大家写文章时也可以借鉴。 这是我以前写的的文章&#xff0c;light亮色下显示正常 -当我不经意间把手机调成深色模式阅读文章时&#xf…

Leetcode912.排序数组(三路划分)

文章目录 一、三路划分二、Leetcode912.排序数组 一、三路划分 为何还会有三路划分&#xff1f; 快速排序算法在某个数据大量重复时效率极低&#xff0c;在运行程序时会超出时间限制&#xff0c;为了解决数据大量重复的情况下&#xff0c;三路划分诞生了。三路划分是基于快速排…

第五回:如何使用ListView Widget

文章目录概念介绍使用方法示例代码我们在上一章回中介绍了Container Widget,本章回中将介绍 ListView这种Widget&#xff0c;闲话休提&#xff0c;让我们一起Talk Flutter吧。概念介绍 ListView就是一个滚动的列表&#xff0c;它可以看作是在Column的基础上添加了滚动功能&…

WPS表格查找替换技巧:让你的工作效率翻倍

WPS表格中查找和替换是最基础的操作&#xff0c;看似简单&#xff0c;但是还有很多人在工作中不会熟练使用&#xff0c;其实掌握一些小技巧可以快速提高工作效率&#xff0c;本节课就来介绍几种比较有效的“查找和替换技巧”。 本节课目录&#xff1a; 1、常规的查找和替换 2…

AIGC市场群雄逐鹿,阿里云发出了什么大招?

如果要评选当下IT圈最火爆的话题&#xff0c;相信就算生成式AI&#xff08;Artificial Intelligence Generated Content&#xff0c;简称AIGC&#xff09;甘认第二&#xff0c;也没有人敢认第一。于是我们看到&#xff0c;在ChatGPT快速升级迭代的同时&#xff0c;百度、360、商…

基于树莓派的智能家居控制系统设计论文参考

完整论文咨询可WX联系&#xff1a;gyf1842965496 智能家居控制系统功能实现详细介绍&#xff1a;基于树莓派的智能家居控制系统设计https://blog.csdn.net/G1842965496/article/details/125491350#comments_26030679 目录 论文简述 摘要 随着科技的进步&#xff0c;人们生活水…

DAY 37 shell免交互

Here Document 概述 常用的交互程序&#xff1a;read&#xff0c;ftp&#xff0c;passwd&#xff0c;su&#xff0c;sudo cat也可配合免交互的方式重定向输出到文件 Here Document 的作用 使用I/O重定向的方式将命令列表提供给交互式程序标准输入的一种替代品 格式 命令 &…