Mybatisplus分页多表关联查询详解

一、Mybatisplus连表分页查询

Mybatis-plus是一个Mybatis的增强工具,提供了许多功能强大的API,其中包括分页查询和多表关联查询。

在Mybatis-plus中,连表查询可以使用LambdaQueryWrapper或QueryWrapper加入多个表进行查询,然后再使用IPage进行分页。

下面是一个示例代码:

IPage<Map<String, Object>> page = new Page<>(pageNum, pageSize);
LambdaQueryWrapper<Order> wrapper = new QueryWrapper<>().lambda();
wrapper.eq(Order::getUserId, userId)
        .eq(Order::getStatus, status)
        .select(Order::getId, Order::getOrderNo, Order::getCreateTime, Order::getStatus)
        .orderByDesc(Order::getCreateTime);
IPage<Map<String, Object>> orderPage = orderService.pageMaps(page, wrapper);

二、Mybatisplus多表关联查询参数

Mybatis-plus的多表关联查询的参数,可以使用LambdaQueryWrapper或QueryWrapper加入多个表查询条件,并使用Join方法进行关联。也可以使用wrapper.select()方法指定需要查询的字段,并使用SelectJoinTableInfo解决列名冲突问题。

下面是一个示例代码:

// 使用wrapper.select进行列名映射,解决列名冲突问题
LambdaQueryWrapper<Order> wrapper = new QueryWrapper<>().lambda();
wrapper.eq(Order::getUserId, userId)
        .eq(Order::getStatus, status)
        .select(Order::getId, Order::getOrderNo, Order::getCreateTime, Order::getStatus,
                Sqls.custom().and("(user.`name`) as userName"));
wrapper.last("LEFT JOIN user on order.user_id = user.id");
wrapper.orderByDesc(Order::getCreateTime);

// 进行关联查询
IPage<Map<String, Object>> orderPage = orderService.pageMaps(page, wrapper);

三、Mybatisplus多表分页查询怎么用

Mybatis-plus多表分页查询需要使用IPage进行分页,每个表都需要有唯一的查询条件字段,通常是表的主键。同时,每个表的查询结果需要使用alias()方法为分页结果进行别名映射。

下面是一个示例代码:

// 使用wrapper.select别名解决列名冲突
LambdaQueryWrapper<Order> wrapper = new QueryWrapper<>().lambda();
wrapper.eq(Order::getUserId, userId)
        .eq(Order::getStatus, status)
        .select(Order::getId().as("id"), Order::getOrderNo().as("orderNo"), Order::getCreateTime().as("createTime"), Order::getStatus().as("status"));
wrapper.orderByDesc(Order::getCreateTime());

// 使用IPage进行分页
IPage<Map<String, Object>> page = new Page<>(pageNum, pageSize);
IPage<Map<String, Object>> orderPage = orderService.pageMaps(page, wrapper);

// 别名映射
List<Map<String, Object>> records = orderPage.getRecords();
for (Map<String, Object> record : records) {
    record.put("order_id", record.get("id"));
    record.put("order_no", record.get("orderNo"));
    record.put("create_time", record.remove("createTime"));
    record.put("status", record.get("status"));
}

四、Mybatisplus多表联查结果分页选取

在Mybatis-plus多表联查的结果中,需要进行结果的分页选取,通常可以在查询语句中直接进行分页。

下面是一个示例代码:

// 使用wrapper.last进行分页
LambdaQueryWrapper<Order> wrapper = new QueryWrapper<>().lambda();
wrapper.eq(Order::getUserId, userId)
        .eq(Order::getStatus, status)
        .select(Order::getId().as("id"), Order::getOrderNo().as("orderNo"), Order::getCreateTime().as("createTime"), Order::getStatus().as("status"));
wrapper.last("LIMIT " + (pageNum - 1) * pageSize + "," + pageSize);

// 执行查询
List<Map<String, Object>> orders = orderService.listMaps(wrapper);

五、Mybatisplus多表分页

Mybatis-plus多表分页需要进行多次查询,因为Mybatis-plus分页的实现是在查询结果中进行截取的。首先需要查询符合查询条件的所有记录,并记录查询结果的总数。然后再按照分页条件进行截取,得到分页的记录。

下面是一个示例代码:

// 查询符合条件的所有订单
LambdaQueryWrapper<Order> countWrapper = new QueryWrapper<>().lambda();
countWrapper.eq(Order::getUserId, userId)
        .eq(Order::getStatus, status);
long count = orderService.count(countWrapper);

// 计算分页参数
int offset = (pageNum - 1) * pageSize;
int limit = pageSize;

// 分页查询
LambdaQueryWrapper<Order> pageWrapper = new QueryWrapper<>().lambda();
pageWrapper.eq(Order::getUserId, userId)
        .eq(Order::getStatus, status)
        .select(Order::getId().as("id"), Order::getOrderNo().as("orderNo"), Order::getCreateTime().as("createTime"), Order::getStatus().as("status"));
pageWrapper.last("LIMIT " + offset + "," + limit);
List<Map<String, Object>> orders = orderService.listMaps(pageWrapper);

// 别名映射
for (Map<String, Object> order : orders) {
    order.put("order_id", order.get("id"));
    order.put("order_no", order.get("orderNo"));
    order.put("create_time", order.remove("createTime"));
    order.put("status", order.get("status"));
}

// 分页结果封装
IPage<Map<String, Object>> orderPage = new Page<>(pageNum, pageSize);
orderPage.setRecords(orders);
orderPage.setTotal(count);

结语

以上是Mybatisplus分页多表关联查询的一些方法和技巧,掌握这些方法可以让我们在多表关联查询和分页查询时更加轻松自如。

原创文章,作者:AOFA,如若转载,请注明出处:https://www.506064.com/n/138596.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
AOFAAOFA
上一篇 2024-10-04 00:21
下一篇 2024-10-04 00:21

相关推荐

  • jQuery Datatable分页中文

    jQuery Datatable是一个非常流行的数据表插件,它可以帮助您快速地在页面上创建搜索、过滤、排序和分页的数据表格。不过,它的默认设置是英文的,今天我们就来探讨如何将jQu…

    编程 2025-04-29
  • uniapp分页第二次请求用法介绍

    本文将从多个方面对uniapp分页第二次请求进行详细阐述,并给出对应的代码示例。 一、请求参数的构造 在进行分页请求时,需要传递的参数体包含当前页码以及每页显示的数据量。对于第二次…

    编程 2025-04-27
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25
  • Python安装OS库详解

    一、OS简介 OS库是Python标准库的一部分,它提供了跨平台的操作系统功能,使得Python可以进行文件操作、进程管理、环境变量读取等系统级操作。 OS库中包含了大量的文件和目…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25
  • git config user.name的详解

    一、为什么要使用git config user.name? git是一个非常流行的分布式版本控制系统,很多程序员都会用到它。在使用git commit提交代码时,需要记录commi…

    编程 2025-04-25

发表回复

登录后才能评论