在接触MybaitsPlus的时候,之前使用的mybatis,通常项目中需要用到多表关联查询,但是因为MybatisPlus在官网不支持进行多表关联查询,所以在此记录一下,以供大家多多学习。
网上还推荐一种第三方写的一种插件
链接地址: mybatis-plus-join
功能介绍:
支持连表查询的 mybatis-plus
演示工程
一对一,一对多
可以通过selectJoinPage进行像mybaits的xml中写的那样
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()));
}
持久层方法
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())));
}
持久层方法
/**
* 分页查询文章列表,一个文章对应一个分类
*/
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())));
}
通过该种方式想法是:https://blog.51cto.com/u_15495434/4955709该博客的想法