IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 什么?mybatis-plus的多表查询,你还在写sql语句?!【CRUD2】多表联查的三种方式 -> 正文阅读

[Java知识库]什么?mybatis-plus的多表查询,你还在写sql语句?!【CRUD2】多表联查的三种方式

???自信攻城狮小名又来攻城啦???

在这里插入图片描述


在这里插入图片描述
书接上文,在上一篇,小名给大家演示了三种 MP的单表查询方式,今天这篇文章的小名想给大家演示一下关于 MP多表查询的相关操作。

1. 一篇朴实无华的MyBatis-Plus小白看完原地进阶的文章
2. 【CRUD】番外篇
3. 此专栏下其他文章


数据表
practice_user:
在这里插入图片描述

practice_teacher:
在这里插入图片描述

公用部分:
1. VO
@Data
public class TeacherAndUserVo extends PracticeTeacher{

    @ApiModelProperty(value = "User名字")
    private String name;

    @ApiModelProperty(value = "User性别")
    private String sex;

}
2. PracticeTeacherService
/**
 * 通过sql多表查询
 * @return
 */
List<TeacherAndUserVo> selectTeacherAndUserVoBySql();
/**
 * 通过foreach多表查询
 * @return
 */
List<TeacherAndUserVo> selectTeacherAndUserVoByForeach();
/**
 * 通过stream多表查询
 * @return
 */
List<TeacherAndUserVo> selectTeacherAndUserVoByStream();

一、SQL
1. PracticeTeacherMapper.xml
<select id="selectTeacherAndUserVoBySql" resultType="eamon.daily.practice.teacher.entity.vo.TeacherAndUserVo">
    SELECT
    `user`.`name`,
    `user`.sex,
    teacher.*
    FROM
    `practice_teacher` teacher
    LEFT JOIN practice_user `user` ON teacher.user_id = `user`.id
    where `user`.sex="女"
</select>
2. PracticeTeacherMapper.java
/**
 * 通过sql多表查询
 * @return
 */
List<TeacherAndUserVo> selectTeacherAndUserVoBySql();
3. PracticeTeacherServiceImpl.java
@Resource
PracticeTeacherMapper practiceTeacherMapper;

@Override
public List<TeacherAndUserVo> selectTeacherAndUserVoBySql() {
    return practiceTeacherMapper.selectTeacherAndUserVoBySql();
}
4. 结果:

在这里插入图片描述


众所周知:mybatis-plus的条件构造器、链式查询只能单表查询

在这里插入图片描述

下面小名给大家说点不一样的吧😏

二、链式调用 lambda 式,lambdaQuery()+foreach

(不了解lambdaQuery()的小伙伴见:【CRUD1】简单单表查询

1. PracticeTeacherServiceImpl.java
@Autowired
IPracticeTeacherService practiceTeacherService;

@Autowired
IPracticeUserService practiceUserService;

@Override
public List<TeacherAndUserVo> selectTeacherAndUserVoByForeach() {

    //查询所有Teacher
    List<PracticeTeacher> teachers = practiceTeacherService.lambdaQuery().list();

    ArrayList<TeacherAndUserVo> teacherAndUserVos = new ArrayList<>();

    for (PracticeTeacher teacher : teachers) {
        //查询符合条件的User表中的女性
        PracticeUser woman = practiceUserService.lambdaQuery()
                .eq(PracticeUser::getSex, "女")
                .eq(PracticeUser::getId, teacher.getUserId())
                .one();
        if(woman!=null){
            //将当前teacher对象拷贝到teacherAndUserVo中
            TeacherAndUserVo copy = CopyUtil.copy(teacher, TeacherAndUserVo.class);
            //将User姓名及性别放到teacherAndUserVo中
            copy.setName(woman.getName());
            copy.setSex(woman.getSex());
            teacherAndUserVos.add(copy);
        }
    }
    return teacherAndUserVos;
}
2. 结果

在这里插入图片描述


下面咱们再搞点“高端操作”吧

在这里插入图片描述

咱们尝试用lambda表达式来实现上面foreach的效果

三、stream
1. PracticeTeacherServiceImpl.java
@Override
    public List<TeacherAndUserVo> selectTeacherAndUserVoByStream() {
        //查询所有teacher对象
        List<PracticeTeacher> teachers = practiceTeacherService.lambdaQuery().list();
        //查询女生用户
        List<PracticeUser> womans = practiceUserService.lambdaQuery().eq(PracticeUser::getSex, "女").list();
        List<TeacherAndUserVo> teacherAndUserVos = womans.stream().map(
                o -> {
                    //过滤符合要求的对象
                    TeacherAndUserVo vo = new TeacherAndUserVo();
                    for (PracticeTeacher teacher : teachers) {
                        if (teacher.getUserId().longValue() == o.getId()) {
                            vo = CopyUtil.copy(teacher, TeacherAndUserVo.class);
                            vo.setName(o.getName());
                            vo.setSex(o.getSex());
                        }
                    }
                    return vo;
                })
                .filter(x -> x.getName() != null)//过滤空对象
                .collect(Collectors.toList());
        return teacherAndUserVos;
    }

这个例子不是很恰当,小名只是为了给大家演示一下lambda的用法。

2. 结果

在这里插入图片描述


在这里插入图片描述

完事儿~收工!

如果觉得小名的文章帮助到了您,请关注小名的新专栏 MyBatis-Plus【CRUD】,支持一下小名😄,给小名的文章点赞👍、评论?、收藏🤞谢谢大家啦~???
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-25 23:42:19  更:2021-08-25 23:42:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 9:18:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码