java、mysql多表查询 JOIN ON 语句

一、前言

本文章案例是基于,SpringBoot + MyBatisPlus开发的项目
我这里给出两个案例:
(1)一个字段关联
(2)多个字段关联

二、一个字段关联

现有一个Post类,数据库对应为tb_post,其中有一个user_id字段,对应sys_user表中的user_id字段,现需要将user_id对应的user_name查询出来和其他字段一起返回给前端。
1、新建DTO类
我们根据POST类,创建一个PostDTO类,PostDTO类中,复制Post的所有代码,只新增一行private String userName ,代码如下

@Data
public class PostDTO {
    private static final long serialVersionUID = 1L;

    /** ID */
    private String id;

    /** 用户id */
    @Excel(name = "用户id")
    private String userId;

    @Excel(name = "发布者")
    private String userName;

    /** 浏览量 */
    @Excel(name = "浏览量")
    private Long viewNum;

    /** 回复数 */
    @Excel(name = "回复数")
    private Long replyNum;

    /** 点赞数 */
    @Excel(name = "点赞数")
    private Long likedNum;

    /** 标题 */
    @Excel(name = "标题")
    private String title;

    /** 内容 */
    @Excel(name = "内容")
    private String content;
}

2、编写xml文件
其他的controller、service、serviceImpl文件怎么写我这里不过多赘述了,相信能看到这篇文章的同学应该都会。

<select id="listDTO" resultType="com.igxia.eggor.domain.dto.PostDTO">
        SELECT * FROM tb_post p LEFT JOIN sys_user u ON p.user_id = u.user_id
</select>

我这里使用的是LEFT JOIN ON,其实使用RIGHT JOIN ON语句也是一样的,MyBatisPlus会自动将查询出来的结果与我们的entity类对应
注意我这边使用的是select * ,所以是LEFT JOIN 还是RIGHT JOIN就没用区别了,直接将两个表的数据全部查询出来了。

三、多个字段关联

现有一个tb_report表,里面包含user_id和target_user_id,都对应的是sys_user表里面user_id,现需要将Report类中的userId和targetUserId都查询到对应的userName。代码如下
1、新建ReportDTO类,只增加userName和targetUserName字段

@Data
public class ReportDTO {
    private static final long serialVersionUID = 1L;

    /** id */
    private String id;

    /** 举报者id */
    @Excel(name = "举报者id")
    private String userId;

    @Excel(name = "举报人")
    private String userName;

    /** 被举报者id */
    @Excel(name = "被举报者id")
    private String targetUserId;

    @Excel(name = "被举报人")
    private String targetUserName;

    /** 类型(1:文章2:用户3:评论4:收藏品) */
    @Excel(name = "类型", readConverterExp = "1=:文章2:用户3:评论4:收藏品")
    private Integer type;

    /** 目标id */
    @Excel(name = "目标id")
    private String targetId;

    /** 举报理由 */
    @Excel(name = "举报理由")
    private String reason;

    /** 状态(0:待受理1:成立2:驳回) */
    @Excel(name = "状态", readConverterExp = "0=:待受理1:成立2:驳回")
    private Integer status;

    /** 违规事件处理 */
    @Excel(name = "违规事件处理")
    private String eventHandle;

    /** 违规账号处理 */
    @Excel(name = "违规账号处理")
    private String accountHandle;
}

2、xml文件编写

<select id="listDTO" resultType="com.igxia.eggor.domain.dto.ReportDTO">
        SELECT r.id, r.user_id, u1.user_name AS user_name, r.target_user_id, u2.user_name AS target_user_name, r.type, r.target_id, r.reason, r.status, r.event_handle, r.account_handle, r.create_time, r.update_time
        FROM tb_report r 
        JOIN sys_user u1 ON r.user_id = u1.user_id 
        JOIN sys_user u2 ON r.target_user_id = u2.user_id
</select>

多个关联查询也只是使用多个JOIN ON而已,没有大家想象的那么难,注意select语句中,我没有使用 * 只查询我需要的字段,就需要重命名的方式去区分相同的字段名。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

igxia

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值