MybatisPlus多表关联查询

MybatisPlus多表关联查询

  • 一、一对一查询
    • 1.1、查询单条记录
    • 1.2、查询多条记录
    • 1.3、分页列表
  • 二、一对多查询
    • 2.1、查询单条记录
    • 2.2、查询多条数据
    • 2.3、分页列表
  • 三、多对多查询
    • 3.1、查询单条记录
    • 3.2、查询多条数据
    • 3.3、分页列表

在接触MybaitsPlus的时候,之前使用的mybatis,通常项目中需要用到多表关联查询,但是因为MybatisPlus在官网不支持进行多表关联查询,所以在此记录一下,以供大家多多学习。
网上还推荐一种第三方写的一种插件

链接地址: mybatis-plus-join

功能介绍:
支持连表查询的 mybatis-plus
演示工程
一对一,一对多
可以通过selectJoinPage进行像mybaits的xml中写的那样

一、一对一查询

1.1、查询单条记录

maven文件

 
 <dependency>
     <groupId>org.mapstructgroupId>
     <artifactId>mapstructartifactId>
     <version>1.3.1.Finalversion>
 dependency>
 <dependency>
     <groupId>org.mapstructgroupId>
     <artifactId>mapstruct-jdk8artifactId>
     <version>1.3.1.Finalversion>
 dependency>
 <dependency>
     <groupId>org.mapstructgroupId>
     <artifactId>mapstruct-processorartifactId>
     <version>1.3.1.Finalversion>
 dependency>
 <dependency>
     <groupId>com.baomidougroupId>
     <artifactId>mybatis-plus-coreartifactId>
     <version>3.1.2version>
 dependency>

实体转Vo

package com.whkj.project.converter;


import com.whkj.project.entity.Article;
import com.whkj.project.vo.ArticleVo;
import org.mapstruct.Mapper;

@Mapper(componentModel = "spring")
public interface ArticleConverter {

    public ArticleVo entityToDto(Article article);

}

持久层方法

public RestResult get(Integer id) {
    Article article = articleMapper.selectById(id);
    ArticleVo articleVo = articleConverter.entityToDto(article);
    Optional.ofNullable(articleVo).ifPresent(this::addArticleTypeNameInfo);
    return RestResult.ok(articleVo);
}

补充信息方法

private void addArticleTypeNameInfo(ArticleVo vo){
    LambdaQueryWrapper<ArticleType> wrapper = new LambdaQueryWrapper<>();
    wrapper.eq(ArticleType::getId,vo.getType());
    ArticleType articleType = articleTypeMapper.selectOne(wrapper);
    Optional.ofNullable(articleType).ifPresent(e -> vo.setTypeName(e.getName()));
}

1.2、查询多条记录

持久层方法

public List<ArticleVo> getArticleByList() {
    // 先查询用户信息(表现形式为列表)
    List<Article> user = articleMapper.selectList(Wrappers.emptyWrapper());
    List<ArticleVo> articleVos = articleConverter.entityToDto(user);
    // 此步骤可以有多个
    addArticleTypeNameInfo(articleVos);
    return articleVos;
}

补充信息方法

private void addArticleTypeNameInfo(List<ArticleVo> vo){
    // 提取类型编号,方便后续循环遍历
     Set<Integer> typeIds = vo.stream().map(ArticleVo::getType).collect(toSet());
     // 根据类型编号查询出符合条件的数据结果集
     LambdaQueryWrapper<ArticleType> wrapper = new LambdaQueryWrapper<>();
     wrapper.in(ArticleType::getId,typeIds);
     List<ArticleType> articleTypes = articleTypeMapper.selectList(wrapper);
     // 构造映射条件,方便匹配类型编号、名称
     Map<Integer, String> hashMap = articleTypes.stream().collect(toMap(ArticleType::getId, ArticleType::getName));
     // 封装Vo,并添加到集合中(关键内容)
     vo.forEach(e -> e.setTypeName(hashMap.get(e.getId())));
 }

1.3、分页列表

持久层方法

/**
 * 分页查询文章列表,一个文章对应一个分类
 */
public IPage<ArticleVo> page(Integer num, Integer size, String keyWords) {
    IPage<Article> articleIPage = null;
    try {
         LambdaQueryWrapper<Article> queryWrapper = new LambdaQueryWrapper();
         if (null != keyWords && !keyWords.equals("")) {
             queryWrapper.and(wrapper -> wrapper.like(Article::getTitle, keyWords));
         }
         articleIPage = articleMapper.selectPage(new Page<>(num, size), queryWrapper);
     } catch (Exception e) {
         e.printStackTrace();
     }
    // 初始化Vo
    IPage<ArticleVo> voListPage= articleConverter.entityToDto(articleIPage);
    if (voList.getRecords().size() > 0) {
        addArticleTypeNameInfo(voListPage);
    }
    return userVoPage;
}

补充信息方法

private void addArticleTypeNameInfo(IPage<ArticleVo> voListPage) {
    // 提取用户userId,方便批量查询
    Set<Integer> typeIds = userVoPage.getRecords().stream().map(ArticleVo::getType).collect(toSet());
    // 根据deptId查询deptName
    LambdaQueryWrapper<ArticleType> wrapper = new LambdaQueryWrapper<>();
     wrapper.in(ArticleType::getId,typeIds);
     List<ArticleType> articleTypes = articleTypeMapper.selectList(wrapper);
     // 构造映射条件,方便匹配类型编号、名称
     Map<Integer, String> hashMap = articleTypes.stream().collect(toMap(ArticleType::getId, ArticleType::getName));
    // 将查询补充的信息添加到Vo中
    voListPage.convert(e -> e.setTypeName(hashMap.get(e.getId())));
}

二、一对多查询

2.1、查询单条记录

2.2、查询多条数据

2.3、分页列表

三、多对多查询

3.1、查询单条记录

3.2、查询多条数据

3.3、分页列表

通过该种方式想法是:https://blog.51cto.com/u_15495434/4955709该博客的想法

你可能感兴趣的:(Java开发,MybatisPlus)