一文详解MySql外连接查询在SpringBoot中的具体使用

 更新时间:2025年02月14日 11:11:57   作者:陈老师还在写代码  
外连接通常分为左外连接,右外连接和全外连接,这篇文章主要为大家详细介绍了如何在SpringBoot中使用MySql的外连接查询,需要的可以参考下

在Spring Boot中使用MySQL的外连接查询时,通常通过JPA、MyBatis或JDBC等持久层框架来实现。外连接查询主要用于从多个表中获取数据,即使某些表中没有匹配的记录。外连接分为左外连接(LEFT JOIN)、右外连接(RIGHT JOIN)和全外连接(FULL JOIN),MySQL不支持全外连接。

1. 左外连接(LEFT JOIN)

左外连接返回左表中的所有记录,即使右表中没有匹配的记录。如果右表中没有匹配的记录,则结果中右表的字段为NULL。

示例SQL:

SELECT 
    a.id, 
    a.name, 
    b.order_id, 
    b.order_date
FROM 
    customers a
LEFT JOIN 
    orders b 
ON 
    a.id = b.customer_id;

在Spring Boot中的使用:

使用JPA的@Query注解:

public interface CustomerRepository extends JpaRepository<Customer, Long> {
    @Query("SELECT new com.example.CustomerOrderDTO(c.id, c.name, o.orderId, o.orderDate) " +
           "FROM Customer c LEFT JOIN c.orders o")
    List<CustomerOrderDTO> findCustomerOrders();
}

使用MyBatis:

<select id="findCustomerOrders" resultType="com.example.CustomerOrderDTO">
    SELECT 
        a.id, 
        a.name, 
        b.order_id AS orderId, 
        b.order_date AS orderDate
    FROM 
        customers a
    LEFT JOIN 
        orders b 
    ON 
        a.id = b.customer_id
</select>

2. 右外连接(RIGHT JOIN)

右外连接返回右表中的所有记录,即使左表中没有匹配的记录。如果左表中没有匹配的记录,则结果中左表的字段为NULL。

示例SQL:

SELECT 
    a.id, 
    a.name, 
    b.order_id, 
    b.order_date
FROM 
    customers a
RIGHT JOIN 
    orders b 
ON 
    a.id = b.customer_id;

在Spring Boot中的使用:

使用JPA的@Query注解:

public interface OrderRepository extends JpaRepository<Order, Long> {
    @Query("SELECT new com.example.CustomerOrderDTO(c.id, c.name, o.orderId, o.orderDate) " +
           "FROM Customer c RIGHT JOIN c.orders o")
    List<CustomerOrderDTO> findOrderCustomers();
}

使用MyBatis:

<select id="findOrderCustomers" resultType="com.example.CustomerOrderDTO">
    SELECT 
        a.id, 
        a.name, 
        b.order_id AS orderId, 
        b.order_date AS orderDate
    FROM 
        customers a
    RIGHT JOIN 
        orders b 
    ON 
        a.id = b.customer_id
</select>

3. 全外连接(FULL JOIN)

MySQL不支持全外连接,但可以通过UNION操作来模拟。

示例SQL:

SELECT 
    a.id, 
    a.name, 
    b.order_id, 
    b.order_date
FROM 
    customers a
LEFT JOIN 
    orders b 
ON 
    a.id = b.customer_id
UNION
SELECT 
    a.id, 
    a.name, 
    b.order_id, 
    b.order_date
FROM 
    customers a
RIGHT JOIN 
    orders b 
ON 
    a.id = b.customer_id;

在Spring Boot中的使用:

使用JPA的@Query注解:

public interface CustomerOrderRepository extends JpaRepository<Customer, Long> {
    @Query("SELECT new com.example.CustomerOrderDTO(c.id, c.name, o.orderId, o.orderDate) " +
           "FROM Customer c LEFT JOIN c.orders o " +
           "UNION " +
           "SELECT new com.example.CustomerOrderDTO(c.id, c.name, o.orderId, o.orderDate) " +
           "FROM Customer c RIGHT JOIN c.orders o")
    List<CustomerOrderDTO> findAllCustomerOrders();
}

使用MyBatis:

<select id="findAllCustomerOrders" resultType="com.example.CustomerOrderDTO">
    SELECT 
        a.id, 
        a.name, 
        b.order_id AS orderId, 
        b.order_date AS orderDate
    FROM 
        customers a
    LEFT JOIN 
        orders b 
    ON 
        a.id = b.customer_id
    UNION
    SELECT 
        a.id, 
        a.name, 
        b.order_id AS orderId, 
        b.order_date AS orderDate
    FROM 
        customers a
    RIGHT JOIN 
        orders b 
    ON 
        a.id = b.customer_id
</select>

总结

在Spring Boot中使用MySQL的外连接查询时,可以通过JPA、MyBatis等持久层框架来实现。左外连接和右外连接是最常用的外连接类型,而全外连接可以通过UNION操作来模拟。根据具体的业务需求,选择合适的连接类型,并通过DTO或实体类来映射查询结果。

到此这篇关于一文详解MySql外连接查询在SpringBoot中的具体使用的文章就介绍到这了,更多相关SpringBoot MySql外连接查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot启动扫描不到dao层接口的解决方案

    springboot启动扫描不到dao层接口的解决方案

    这篇文章主要介绍了springboot启动扫描不到dao层接口的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • SpringMVC4 + MyBatis3 + SQL Server 2014整合教程(含增删改查分页)

    SpringMVC4 + MyBatis3 + SQL Server 2014整合教程(含增删改查分页)

    这篇文章主要给大家介绍了关于SpringMVC4 + MyBatis3 + SQL Server 2014整合的相关资料,文中包括介绍了增删改查分页等相关内容,通过示例代码介绍的非常详细,分享出来供大家参考学习,下面来一起看看吧。
    2017-06-06
  • PC 端微信扫码注册和登录实例

    PC 端微信扫码注册和登录实例

    这篇文章主要介绍了PC 端微信扫码注册和登录实例的相关资料,需要的朋友可以参考下
    2016-09-09
  • MybatisPlus 自定义.vm模板的生成

    MybatisPlus 自定义.vm模板的生成

    为更加快捷方便的开发代码,使用MybatisPlus的代码自动生成功能,将一些繁琐的操作自动生成,本文主要介绍了MybatisPlus 自定义.vm模板的生成,感兴趣的可以了解一下
    2024-03-03
  • JSON 与对象、集合之间的转换的示例

    JSON 与对象、集合之间的转换的示例

    在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML、JSON等,JSON作为一个轻量级的数据格式比xml效率要高,本篇文章主要介绍了JSON 与 对象 、集合 之间的转换,有兴趣的可以了解一下。
    2017-01-01
  • Springboot 读取自定义pro文件注入static静态变量方式

    Springboot 读取自定义pro文件注入static静态变量方式

    这篇文章主要介绍了Springboot 读取自定义pro文件注入static静态变量方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • java递归处理单位人员组织机构树方式

    java递归处理单位人员组织机构树方式

    这篇文章主要介绍了java递归处理单位人员组织机构树方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Mybatis-Plus中使用@DS注解动态选择数据源的源码解读

    Mybatis-Plus中使用@DS注解动态选择数据源的源码解读

    这篇文章主要介绍了Mybatis-Plus中使用@DS注解动态选择数据源的源码解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • MyBatis Plus之实现动态排序方式

    MyBatis Plus之实现动态排序方式

    这篇文章主要介绍了MyBatis Plus之实现动态排序方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • RocketMQ设计之异步刷盘

    RocketMQ设计之异步刷盘

    本文介绍RocketMQ设计之异步刷盘,RocketMQ消息存储到磁盘上,这样既保证断电后恢复,也让存储消息量超出内存限制,RocketMQ为了提高性能,会尽可能保证磁盘顺序写,消息通过Producer写入RocketMQ的时候,有两种方式,上篇介绍了同步刷盘,本文介绍异步刷盘,需要的朋友可以参考下
    2022-03-03

最新评论