您的位置:

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分页多表关联查询的一些方法和技巧,掌握这些方法可以让我们在多表关联查询和分页查询时更加轻松自如。