> 文章列表 > mybatis-plus-join MPJ连表查询 这样写太香了!

mybatis-plus-join MPJ连表查询 这样写太香了!

MyBatis-Plus-Join(MPJ)工具就像一把瑞士军刀,为MyBatis-Plus的联表查询功能大大提升了生产力!

引言:

在开发过程中,联表查询总是让人头大,特别是当需要处理多表关联时,手写SQL既费时又容易出错。MyBatis-Plus虽然简化了很多数据库操作,但在联表查询上依然不够友好,需要借助XML文件手写SQL语句。不过,现在有了MPJ工具,这一切都变得轻松了!

那么,这个工具到底香在哪?

简单概括,MPJ让联表查询像拼积木一样简单!只需要通过代码的方式配置关联关系和需要查询的字段,就能生成复杂的SQL语句,彻底告别XML地狱。

举个栗子:

假设我们有订单表(Order)、用户表(User)、商品表(Product)。想要查询所有订单,并携带用户姓名和商品名称,只需要如下配置:

`java
orderMapper.selectJoinList(OrderDto.class,
new MPJLambdaWrapper().
selectAll(Order.class).
select(User::getName). // 选择用户姓名
selectAs(User::getName, OrderDto::getUserName). // 将字段映射到DTO对应字段
leftJoin(User.class, Order:: getUserId, User:: getId) // 左连接用户表
.leftJoin(Product.class, Order:: getProduct Id, Product:: getId); // 左连接商品表
`

这样就轻松实现了三表联查,代码清晰易懂。

别急,还有进阶操作:

MPJ还支持别名设置、复杂条件查询等,甚至可以处理子查询等高级场景,堪称全能型选手。

整体而言:

MPJ的出现,不仅提升了开发效率,更解放了开发者双手,让代码更加优雅简洁!如果你还在为联表查询烦恼,不妨试试这个神器。说不定,它就是你一直在寻找的高效开发工具!

mybatis-plus-join MPJ连表查询 这样写太香了!

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

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

引入依赖

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

<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项目中,像往常一样正常配置数据源连接信息就可以了。

数据准备

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

订单表:

mybatis-plus-join MPJ连表查询 这样写太香了!
用户表,包含用户姓名:

mybatis-plus-join MPJ连表查询 这样写太香了!
商品表,包含商品名称和单价:
mybatis-plus-join MPJ连表查询 这样写太香了!
在订单表中,通过用户id和商品id与其他两张表进行关联。

修改Mapper

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

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

对其余两个表的Mapper接口也进行相同的改造。此外,我们的service也可以选择继承MPJBaseServiceserviceImpl选择继承MPJBaseServiceImpl,这两者为非必须继承。

查询

Mapper接口改造完成后,我们把它注入到Service中,虽然说我们要完成3张表的联表查询,但是以Order作为主表的话,那么只注入这一个对应的OrderMapper就可以,非常简单。

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

MPJLambdaWrapper

接下来,我们体验一下再也不用写sql的联表查询:

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.