Mybatis一对多多对一MySQL LEFT JOIN分页方案

在项目中遇到Mybatis一对多多对一查询时,使用LEFT JOIN结合LIMIT进行分页出现记录不足的问题。通过引入用户变量的方式,可以解决LEFT JOIN后分页不准确的难题,确保分页基于主表记录数进行。
摘要由CSDN通过智能技术生成

项目中遇到Mybatis需要写一对多多对一的翻页,用LEFT JOIN之后再用LIMIT记录数是不足的。因为LEFT JOIN后记录数大于主表的记录数了。所以LIMIT出来的记录是少的,不足一页。后来我使用了用户变量的方式,解决了这个问题。上代码:

select t.id, t2.* from table1 t left join table2 t2 = t1.id = t2.t_id limit 0,10

这样查,其实总共table1的记录没有对应10条。改为下面的方式

SELECT *
FROM (
  SELECT
    if(@tid = t.id, @rownum := @rownum, @rownum := @rownum + 1) rn,
    @tid := t.id,
 
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、付费专栏及课程。

余额充值