注明 : 上两篇文章我们讲解了springboot+mybatis-plus对于单表的CRUD和条件构造器的使用方法,但是对于我们的实战项目中多表联查也是经常会出现的。今天我们就来说下怎么在springboot+MP模式下实现多表联查并分页。
项目源码下载位置 | gitee
MP推荐使用的是一种苞米豆团队自己封装好的分页插件,也就是PaginationInterceptor分页拦截器,那么下面我们集成分页插件,如果在项目使用使用过程中出现任何问题,下载源码观看,可找到问题所在,如不能解决,可在下方博客留言,看到留言后会帮你解决问题。
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第三篇博文。
由于在多表联查的情况下可能会出现返回不同表的字段,当自动生成的表不能满足你的返回条件时,需要我们自动生成一个返回实体。下面实体是包括用户表和角色表的两张返回实体。
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;
}
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 page = new Page<>(1, 10);
page.setRecords(service.selectUserListPage(page));
System.out.println(page);
}
}
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;
/**
*
* 服务实现类
*
*
* @author lqf
* @since 2018-10-02
*/
@Service
public class FyUserServiceImpl extends ServiceImpl implements FyUserService {
@Override
public List selectUserListPage(Page page) {
return this.baseMapper.selectUserListPage(page);
}
}
注意这里的baseMapper不是你自己定义的,直接通过this.baseMapper调用就可以,这个是封装好的。
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;
/**
*
* Mapper 接口
*
*
* @author lqf
* @since 2018-10-02
*/
@Repository
public interface FyUserMapper extends BaseMapper {
@Select("SELECT * FROM fy_user u LEFT JOIN fy_role r ON u.role = r.id")
List selectUserListPage(Page pagination);
}
上方代码我直接通过注解进行了sql查询,你也可以通过mapper.xml进行,这里无需设置分页条件,会自动进行sql拼接,这里要注意sql的结尾不要用;否自自动拼接limit无法完成
==> 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
下一篇 : 待续