(六)springboot + mybatis plus实现多表联查分页3.X版本

29 篇文章 1 订阅
22 篇文章 1 订阅

注明 : 上两篇文章我们讲解了springboot+mybatis-plus对于单表的CRUD和条件构造器的使用方法,但是对于我们的实战项目中多表联查也是经常会出现的。今天我们就来说下怎么在springboot+MP模式下实现多表联查并分页。

项目源码下载位置 | gitee

MP推荐使用的是一种苞米豆团队自己封装好的分页插件,也就是PaginationInterceptor分页拦截器,那么下面我们集成分页插件,如果在项目使用使用过程中出现任何问题,下载源码观看,可找到问题所在,如不能解决,可在下方博客留言,看到留言后会帮你解决问题。

1 配置分页插件

package com.lqf.multitable.config;

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@EnableTransactionManagement
@Configuration
@MapperScan("com.lqf.multitable.dao.*")
public class MybatisPlusConfig {
    /**
     * mybatis-plus SQL执行效率插件【生产环境可以关闭】
     */
    @Bean
    public PerformanceInterceptor performanceInterceptor() {
        return new PerformanceInterceptor();
    }

    /*
     * 分页插件,自动识别数据库类型 多租户,请参考官网【插件扩展】
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }


}

分页插件配置好后,需要在项目中自动生成各个层级代码,在这里我就不阐述自动生成的过程了,如果有不知道的童鞋可观看我MP第三篇博文

由于在多表联查的情况下可能会出现返回不同表的字段,当自动生成的表不能满足你的返回条件时,需要我们自动生成一个返回实体。下面实体是包括用户表和角色表的两张返回实体。

2 创建返回实体

package com.lqf.multitable.bean.crm;

import com.sun.corba.se.spi.presentation.rmi.IDLNameTranslator;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

/**
 * @author : lqf
 * @Description :
 * @date : Create in 18:14 2018/10/3
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserRoleVo {

    private Long userId;

    /**
     * 创建时间
     */
    private LocalDateTime createTime;

    /**
     * 修改时间
     */
    private LocalDateTime updateTime;

    /**
     * 账号
     */
    private String username;

    /**
     * 密码
     */
    private String password;

    /**
     * 姓名
     */
    private String realname;

    /**
     * 性别(0为女 1为男)
     */
    private Integer sex;

    /**
     * 手机号
     */
    private String mobile;

    /**
     * 密码加密串
     */
    private String passwordMd5;

    /**
     * 开账号人
     */
    private Long parentId;

    /**
     * 是否禁用 0否 1是
     */
    private Integer status;

    /**
     * 授权大区
     */
    private String authArea;

    /**
     * 授权城市
     */
    private String authCity;

    private Integer role;

    /**
     * 用户剩余卡数
     */
    private Integer residueCardNumber;

    /**
     * 最后登录时间
     */
    private LocalDateTime lastLoginTime;

    /**
     * 最后登录ip地址
     */
    private String lastLoginIp;

    /**
     * 最后登录次数
     */
    private Integer lastLoginCount;

    /**
     * 渠道
     */
    private String authChannel;

    /**
     * 0 外网 1 内网
     */
    private Integer internet;

    /**
     * 金币
     */
    private Long goldCoin;

    private Long id;

    /**
     * 状态
     */
    private String statusId;

    /**
     * 角色名
     */
    private String roleName;

    /**
     * 角色值
     */
    private String roleValue;

    /**
     * 能添加的下属角色值
     */
    private String addibleValue;
}

3 测试Test

package com.lqf.multitable;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lqf.multitable.bean.crm.UserRoleVo;
import com.lqf.multitable.service.crm.FyUserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;


@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootMybatisPlusMultiTableApplicationTests {

    @Autowired
    private FyUserService service;

    /**
     * 联表查询并分页
     */
    @Test
    public void contextLoads() {
        // 当前页,总条数 构造 page 对象
        Page<UserRoleVo> page = new Page<>(1, 10);
        page.setRecords(service.selectUserListPage(page));
        System.out.println(page);
    }

}

4 service层

package com.lqf.multitable.service.crm.impl;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lqf.multitable.bean.crm.FyUser;
import com.lqf.multitable.bean.crm.UserRoleVo;
import com.lqf.multitable.dao.crm.FyUserMapper;
import com.lqf.multitable.service.crm.FyUserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author lqf
 * @since 2018-10-02
 */
@Service
public class FyUserServiceImpl extends ServiceImpl<FyUserMapper, FyUser> implements FyUserService {

    @Override
    public List<UserRoleVo> selectUserListPage(Page<UserRoleVo> page) {
        return this.baseMapper.selectUserListPage(page);
    }
}

注意这里的baseMapper不是你自己定义的,直接通过this.baseMapper调用就可以,这个是封装好的。

5mapper层

package com.lqf.multitable.dao.crm;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lqf.multitable.bean.crm.FyUser;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.lqf.multitable.bean.crm.UserRoleVo;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * <p>
 *  Mapper 接口
 * </p>
 *
 * @author lqf
 * @since 2018-10-02
 */
@Repository
public interface FyUserMapper extends BaseMapper<FyUser> {


    @Select("SELECT * FROM fy_user u LEFT JOIN fy_role r ON u.role = r.id")
    List<UserRoleVo> selectUserListPage(Page<UserRoleVo> pagination);

}

上方代码我直接通过注解进行了sql查询,你也可以通过mapper.xml进行,这里无需设置分页条件,会自动进行sql拼接,这里要注意sql的结尾不要用;否自自动拼接limit无法完成

6 测试结果

==>  Preparing: SELECT COUNT(1) FROM fy_user u LEFT JOIN fy_role r ON u.role = r.id 
==> Parameters: 
<==    Columns: COUNT(1)
<==        Row: 391
==>  Preparing: SELECT * FROM fy_user u LEFT JOIN fy_role r ON u.role = r.id LIMIT 0,10 
==> Parameters: 
<==    Columns: user_id, create_time, update_time, username, password, realname, sex, mobile, password_md5, parent_id, status, auth_area, auth_city, role, residue_card_number, last_login_time, last_login_ip, last_login_count, auth_channel, internet, gold_coin, id, status_id, create_time, update_time, role_name, role_value, addible_value
********* 这里是查询到的信息,有隐私就不打印了
<==      Total: 10
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@63c12e52]
com.baomidou.mybatisplus.extension.plugins.pagination.Page@5d2828c9
 Time:61 ms - ID:com.lqf.multitable.dao.crm.FyUserMapper.selectUserListPage
Execute SQL:SELECT * FROM fy_user u LEFT JOIN fy_role r ON u.role = r.id LIMIT 0,10

上面的测试结果可以看出,总查询条数391条,分页后查询limit 0,10
查询耗时 61ms
到这里通过MP的分页插件进行多表联查并分页就演示完成了,诚心接受大家的指正。

上一篇 : (五)springboot + mybatis plus强大的条件构造器queryWrapper、updateWrapper

下一篇 : 待续

  • 30
    点赞
  • 142
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
在使用SpringbootMybatis-plus实现联查分页的情况下,你可以按照以下步骤进行操作: 1. 首先,你需要配置分页插件。在MybatisPlusConfig类中,使用@Bean注解配置一个PaginationInterceptor的bean,并返回该对象。 2. 接下来,你可以在你的业务逻辑中使用Mybatis-plus提供的API实现联查分页。使用Mybatis-plus的Wrapper类构建查询条件,然后调用Mybatis-plus的selectPage方法进行分页查询。 3. 你可以在Wrapper对象中使用join方法来关联多张,并使用eq、like等方法设置查询条件。 4. 在selectPage方法中,传入一个Page对象作为参数,该Page对象包含了页码、每页显示数量等信息。调用selectPage方法后,会返回一个IPage对象,其中包含了查询结果和分页信息。 举个例子,假设你要查询用户和订单,并分页显示结果,可以按照以下步骤进行操作: 1. 在你的业务逻辑中,引入UserService和OrderService(假设已经定义了对应的service类)。 2. 创建一个Wrapper对象,并分别使用join方法关联用户和订单。 3. 使用eq、like等方法设置查询条件。 4. 创建一个Page对象,设置页码和每页显示数量。 5. 调用UserService的selectPage方法,传入Wrapper对象和Page对象作为参数。 6. 从返回的IPage对象中获取查询结果和分页信息。 以上是使用SpringbootMybatis-plus实现联查分页的基本步骤。通过Mybatis-plus的API和分页插件,我们可以简化开发过程,减少手写sql语句的情况,实现联查分页。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Java企业报管理系统源码](https://download.csdn.net/download/m0_55416028/88269629)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [SpringBoot整合Mybatis-plus 实现自定义的多查询、分页条件查询](https://blog.csdn.net/shilu6558445/article/details/123792323)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [springboot + mybatis plus实现联查分页](https://blog.csdn.net/weixin_33913332/article/details/92172655)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值