mybatis 使用到了left join 还要进行分页,分页使用pageHelper,如何能精准得获取总条数

在 MyBatis 中使用 PageHelper 进行分页并同时使用 LEFT JOIN 操作,可以通过以下步骤确保获取到精准的总条数:

  1. 配置 PageHelper 插件:确保你的 MyBatis 配置文件中已经配置了 PageHelper 插件。

  2. 设置分页参数:在你的查询方法中,使用 PageHelper 的静态方法 startPage 来设置分页参数。

  3. 执行查询:编写包含 LEFT JOIN 的 SQL 查询语句,并在对应的 Mapper 中调用该查询方法。

  4. 获取分页信息:通过 PageInfo 对象来获取分页信息,包括总条数。

具体示例如下:

1. 配置 PageHelper 插件

在 MyBatis 配置文件中添加 PageHelper 插件配置:

<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <property name="helperDialect" value="mysql"/>
    </plugin>
</plugins>

2. 编写包含 LEFT JOIN 的 SQL 查询

在 Mapper XML 文件中编写 SQL 查询语句,例如:

<select id="selectWithLeftJoin" resultType="YourResultType">
    SELECT a.*, b.*
    FROM tableA a
    LEFT JOIN tableB b ON a.id = b.a_id
    <!-- 其他条件 -->
</select>

3. 在 Service 层使用 PageHelper 进行分页查询

在你的 Service 层中使用 PageHelper 进行分页查询,并获取分页信息:

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import java.util.List;

@Service
public class YourService {
    
    @Autowired
    private YourMapper yourMapper;

    public PageInfo<YourResultType> getPagedResults(int pageNum, int pageSize) {
        // 设置分页参数
        PageHelper.startPage(pageNum, pageSize);
        // 执行查询
        List<YourResultType> results = yourMapper.selectWithLeftJoin();
        // 获取分页信息
        PageInfo<YourResultType> pageInfo = new PageInfo<>(results);
        return pageInfo;
    }
}

4. 在 Controller 层调用 Service 方法

在你的 Controller 层中调用 Service 方法并返回结果:

@RestController
@RequestMapping("/yourApi")
public class YourController {

    @Autowired
    private YourService yourService;

    @GetMapping("/getPagedResults")
    public PageInfo<YourResultType> getPagedResults(@RequestParam int pageNum, @RequestParam int pageSize) {
        return yourService.getPagedResults(pageNum, pageSize);
    }
}

总结

通过以上步骤,你可以使用 PageHelper 进行分页,并结合 LEFT JOIN 查询来获取精准的总条数信息。关键点在于通过 PageInfo 对象来获取分页信息,这样不仅能够得到查询结果,还能获得分页的详细信息(包括总条数)。

但如果我a表对应得b表数据是 一对多得关系,,分页是按照A表又多少条数据,就是多少条得,又办法来处理么

如果表 a 和表 b 是一对多的关系,并且你希望分页是按照表 a 的记录数进行,而不是表 b 的总记录数,那么可以通过以下方法来处理:

  1. 首先查询表 a 的记录数:这一步用于确定表 a 的总记录数,并设置分页参数。
  2. 执行包含 LEFT JOIN 的分页查询:在这一步,分页逻辑仅针对表 a 的记录数进行,而查询结果包括 LEFT JOIN 的表 b 的数据。

实现步骤

1. 在 Mapper 中编写 SQL 查询

你需要两个查询,一个是仅查询表 a 的记录数和记录的分页数据,另一个是包含 LEFT JOIN 的详细查询。

仅查询表 a 的分页数据
<select id="selectAPaged" resultType="YourAType">
    SELECT a.*
    FROM tableA a
    <!-- 其他条件 -->
</select>
包含 LEFT JOIN 的详细查询
<select id="selectWithLeftJoin" resultType="YourResultType">
    SELECT a.*, b.*
    FROM tableA a
    LEFT JOIN tableB b ON a.id = b.a_id
    WHERE a.id IN
    <foreach item="item" index="index" collection="list" open="(" separator="," close=")">
        #{item}
    </foreach>
</select>
2. 在 Service 层实现分页查询逻辑

在 Service 层中,首先获取表 a 的分页数据,然后基于这些数据获取详细信息。

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class YourService {

    @Autowired
    private YourMapper yourMapper;

    public PageInfo<YourResultType> getPagedResults(int pageNum, int pageSize) {
        // 设置分页参数
        PageHelper.startPage(pageNum, pageSize);
        // 查询表 a 的分页数据
        List<YourAType> aPagedResults = yourMapper.selectAPaged();
        PageInfo<YourAType> pageInfoA = new PageInfo<>(aPagedResults);

        // 获取表 a 的 ID 列表
        List<Integer> aIds = aPagedResults.stream().map(YourAType::getId).collect(Collectors.toList());

        // 基于表 a 的 ID 列表查询包含 LEFT JOIN 的详细数据
        List<YourResultType> detailedResults = yourMapper.selectWithLeftJoin(aIds);

        // 创建 PageInfo 对象来返回分页信息和详细结果
        PageInfo<YourResultType> pageInfo = new PageInfo<>(detailedResults);
        pageInfo.setTotal(pageInfoA.getTotal());
        pageInfo.setPageNum(pageInfoA.getPageNum());
        pageInfo.setPageSize(pageInfoA.getPageSize());
        pageInfo.setPages(pageInfoA.getPages());

        return pageInfo;
    }
}
3. 在 Controller 层调用 Service 方法

在 Controller 层中调用 Service 方法并返回结果:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.github.pagehelper.PageInfo;

@RestController
@RequestMapping("/yourApi")
public class YourController {

    @Autowired
    private YourService yourService;

    @GetMapping("/getPagedResults")
    public PageInfo<YourResultType> getPagedResults(@RequestParam int pageNum, @RequestParam int pageSize) {
        return yourService.getPagedResults(pageNum, pageSize);
    }
}

解释

通过这种方式,你首先分页查询表 a 的记录,这确保了分页逻辑是基于表 a 的记录数。然后,你使用这些记录的 ID 列表去查询包含 LEFT JOIN 的详细数据。最终,你可以通过 PageInfo 对象将分页信息和详细结果返回给前端。这样,你就实现了分页是按照表 a 的记录数进行的,而查询结果仍然包含 LEFT JOIN 的数据。

是否可以直接用一个SQL 就处理完毕呢,

可以直接使用一个 SQL 查询处理分页和 LEFT JOIN 操作,通过 PageHelper 插件来确保分页逻辑基于表 a 的记录数。这种方式在性能上可能更高效,且简化了代码逻辑。以下是实现步骤:

1. 配置 PageHelper 插件

确保在 MyBatis 配置文件中已经配置了 PageHelper 插件:

<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <property name="helperDialect" value="mysql"/>
    </plugin>
</plugins>

2. 编写包含 LEFT JOIN 的分页查询

在 Mapper XML 文件中编写包含 LEFT JOIN 的分页查询语句。例如:

<select id="selectWithLeftJoinPaged" resultType="YourResultType">
    SELECT a.*, b.*
    FROM tableA a
    LEFT JOIN tableB b ON a.id = b.a_id
    <!-- 其他条件 -->
</select>

3. 在 Service 层使用 PageHelper 进行分页查询

在你的 Service 层中使用 PageHelper 进行分页查询,并获取分页信息:

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class YourService {

    @Autowired
    private YourMapper yourMapper;

    public PageInfo<YourResultType> getPagedResults(int pageNum, int pageSize) {
        // 设置分页参数
        PageHelper.startPage(pageNum, pageSize);
        // 执行包含 LEFT JOIN 的分页查询
        List<YourResultType> results = yourMapper.selectWithLeftJoinPaged();
        // 获取分页信息
        PageInfo<YourResultType> pageInfo = new PageInfo<>(results);
        return pageInfo;
    }
}

4. 在 Controller 层调用 Service 方法

在你的 Controller 层中调用 Service 方法并返回结果:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.github.pagehelper.PageInfo;

@RestController
@RequestMapping("/yourApi")
public class YourController {

    @Autowired
    private YourService yourService;

    @GetMapping("/getPagedResults")
    public PageInfo<YourResultType> getPagedResults(@RequestParam int pageNum, @RequestParam int pageSize) {
        return yourService.getPagedResults(pageNum, pageSize);
    }
}

总结

通过上述步骤,你可以使用 PageHelper 插件和一个 SQL 查询实现分页和 LEFT JOIN 操作。这样,分页逻辑是基于表 a 的记录数,而查询结果包含了 LEFT JOIN 的数据。这种方式简化了代码逻辑,并提高了性能。

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、使用 SelectProvider 进行 left join Mybatis Plus 提供了一个 SelectProvider 类,可以动态生成 SQL 语句。在 left join 操作中,我们可以使用 SelectProvider 来实现。 例如,我们有两个表,一个是用户表 user,另一个是订单表 order。我们想要查询某个用户的所有订单信息,可以使用 left join 来实现。 首先,我们需要定义一个查询语句的模板,使用 @SelectProvider 注解来指定: ``` @SelectProvider(type = MyProvider.class, method = "selectUserOrders") List<UserOrder> selectUserOrders(@Param("userId") Long userId); ``` 其中,MyProvider 是我们定义的一个 SelectProvider 类,selectUserOrders 是其中的一个方法,用来生成查询语句。 然后,在 MyProvider 中,我们需要实现 selectUserOrders 方法,生成查询语句: ``` public String selectUserOrders(@Param("userId") Long userId) { return new SQL(){{ SELECT("user.*, order.*"); FROM("user"); LEFT_JOIN("order ON user.id = order.user_id"); WHERE("user.id = #{userId}"); }}.toString(); } ``` 在这个方法中,我们使用 SQL 类来生成查询语句。首先,使用 SELECT 方法指定要查询的字段,使用 FROM 方法指定主表,使用 LEFT_JOIN 方法来进行左连接操作,使用 WHERE 方法来指定查询条件。 2、使用分页插件进行分页查询 Mybatis Plus 提供了一个分页插件,可以方便地实现分页查询。 首先,我们需要在配置文件中开启分页插件: ``` <plugins> <plugin interceptor="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor"> <property name="dialectType" value="mysql"/> </plugin> </plugins> ``` 然后,在查询方法中,我们可以使用 Page 类来进行分页查询: ``` Page<UserOrder> page = new Page<>(1, 10); List<UserOrder> userOrders = userOrderMapper.selectUserOrders(page, userId); ``` 其中,Page 的第一个参数是当前页码,第二个参数是每页显示的记录数。userOrderMapper 是我们定义的一个 Mapper 接口,selectUserOrders 是其中的一个方法,用来进行查询操作。 在 selectUserOrders 方法中,我们需要使用 Mybatis Plus 提供的分页参数注解 @Param 来指定分页参数: ``` List<UserOrder> selectUserOrders(@Param("page") Page<UserOrder> page, @Param("userId") Long userId); ``` 然后,在 SQL 语句中,我们可以使用 Mybatis Plus 提供的分页语句来进行分页操作: ``` public String selectUserOrders(@Param("page") Page<UserOrder> page, @Param("userId") Long userId) { return new SQL(){{ SELECT("user.*, order.*"); FROM("user"); LEFT_JOIN("order ON user.id = order.user_id"); WHERE("user.id = #{userId}"); }}.toString() + " LIMIT " + page.getOffset() + ", " + page.getSize(); } ``` 在这个方法中,我们需要使用 Page 类提供的 getOffset 和 getSize 方法来获取当前分页的偏移量和每页显示的记录数,然后将它们拼接到 SQL 语句的末尾。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值