Mybatis-Plus-Join(MPJ连表查询)

news/2024/10/3 8:21:58

mybatis-plus作为mybatis的增强工具,它的出现极大的简化了开发中的数据库操作,但是长久以来,它的联表查询能力一直被大家所诟病。一旦遇到left join或right join的左右连接,你还是得老老实实的打开xml文件,手写上一大段的sql语句

一款叫做mybatis-plus-join的工具(后面就简称mpj了),可以不用在xml编写SQL就可以实现SQL的连接查询,且使用方式类似mybatis-plus中QueryWrapper的方式来进行联表查询了

引入依赖库

<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>

因为要实现联表查询,所以我们先来建几张表进行测试

订单表

用户表

商品表

修改Mapper接口

以往在使用myatis-plus的时候,我们的Mapper层接口都是直接继承的BaseMapper,使用mpj后需要对其进行修改,改为继承MPJBaseMapper接口

@Mapper
public interface OrderMapper extends MPJBaseMapper<Order> {
}

此外,我们的service也可以选择继承MPJBaseServiceserviceImpl选择继承MPJBaseServiceImpl,这两者为非必须继承

@Service
@AllArgsConstructor
public class OrderServiceImpl implements OrderService {private final OrderMapper orderMapper;
}

MPJLambdaWrapper使用

public void getOrder() {List<OrderDto> list = orderMapper.selectJoinList(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).eq(Order::getStatus,3));list.forEach(System.out::println);
}

首先,调用mapperselectJoinList()方法,进行关联查询,返回多条结果。后面的第一个参数OrderDto.class代表接收返回查询结果的类,作用和我们之前在xml中写的resultType类似

@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class OrderDto extends Order {String userName;String productName;Double unitPrice;
}

接下来的MPJLambdaWrapper就是构建查询条件的核心了,看一下我们在上面用到的几个方法:

  • selectAll():查询指定实体类的全部字段
  • select():查询指定的字段,支持可变长参数同时查询多个字段,但是在同一个select中只能查询相同表的字段,所以如果查询多张表的字段需要分开写
  • selectAs():字段别名查询,用于数据库字段与接收结果的dto中属性名称不一致时转换
  • leftJoin():左连接,其中第一个参数是参与联表的表对应的实体类,第二个参数是这张表联表的ON字段,第三个参数是参与联表的ON的另一个实体类属性

MPJQueryWrapper

和mybatis-plus非常类似,除了LamdaWrapper外还提供了普通QueryWrapper的写法,改造上面的代码

public void getOrderSimple() {List<OrderDto> list = orderMapper.selectJoinList(OrderDto.class,new MPJQueryWrapper<Order>().selectAll(Order.class).select("t2.unit_price","t2.name as product_name").select("t1.name as user_name").leftJoin("t_user t1 on t1.id = t.user_id").leftJoin("t_product t2 on t2.id = t.product_id").eq("t.status", "3"));list.forEach(System.out::println);
}

分页查询

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

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));return interceptor;
}
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);
}

 

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

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

相关文章

什么是shell?

使用Mac系统的朋友应该比较熟悉Zsh和Bash这两个shell,但是对二者具体有什么区别可能不太了解。本文将从这两个shell入手,对相关概念以及二者区别进行解释。 1.什么是shell? shell 单词的本意是“壳子”,在计算机领域一样可以理解为机器外面的一层壳,目的是进行用于人机交互…

linux或者CentOS环境下安装.NET Core环境

一、下载 注册Microsoft密钥:在安装之前,需要: 1、注册Microsoft密钥 2、注册产品资料库 3、安装所需的依赖项打开终端并输入命令: sudo rpm -Uvh https://packages.microsoft.com/config/centos/8/packages-microsoft-prod.rpm安装效果如下图所示:安装期间会提示用户验证…

AUTOSAR平台中的信息安全标准模块

目前,经纬恒润已为国内多家客户提供汽车网络安全开发及测试服务,打造车联网可信安全平台,为智能网联汽车安行之路保驾护航!面向MCU端的AUTOSAR CP平台加密组件——CryptoECU中所有的软件单元都遭受到信息安全攻击的可能。AUTOSAR为保障ECU信息和数据安全,定义了CRYPTO 组件…

如何通过一张图片判断摄影师的位置(图片经纬度转换)

目录通过图片属性中的经纬度计算拍照的位置(其实就是经纬度计算转换)一、 查看图片经纬度信息(只有原文件且拍照时开启了GPS才能看到这个信息)二、 通过经纬度计算地理位置三、 获得精确经纬度,在地图查询经纬度查询经纬度的链接 通过图片属性中的经纬度计算拍照的位置(其…

数仓实践-元数据

1.元数据:关于数据的数据 2.元数据分类:主题域英文名称主题域前缀描述成本域costcost表和目录的存储消耗,任务的计算资源消耗。权限域authorityauthdataworks数据访问权限申请记录,冗余权限统计。任务域tasktaskdataworks任务,MC上的application。查询域queryquery各个查询…

7、docker-commit镜像、将容器打包成一个镜像

#docker  commit  提交容器成为一个新的副本 #docker commit  -m="提交的描述信息"  -a="作者"  容器id  目标镜像名:[TAG] =========================================== 测试: 1、启动tomcat启动:docker run -it -p 8080:8080 tomcat  …

9、docker-mysql容器数据同步到本机-挂载

1、查看镜像、下载镜像docker search mysqldocker pull mysql:5.7    //指定下载5.7版本 2、启动镜像 -d  后台运行-p  端口映射  主机端口:容器端口-v  卷挂载-e  环境配置  这里配置的是数据库的密码--name    容器名字docker run -d -p 3310:3306 -v /…

c/c++设计模式--备忘录模式

#include <iostream> #include <vector>#ifdef _DEBUG //只在Debug(调试)模式下 #ifndef DEBUG_NEW #define DEBUG_NEW new(_NORMAL_BLOCK,__FILE__,__LINE__) //重新定义new运算符 #define new DEBUG_NEW #endif #endif//#include <boost/type_index.hpp&g…