当前位置: 首页 > news >正文

Mybatis注解开发进阶之复杂的关联查询

        在MyBatis注解式开发里,处理复杂的关联查询可通过多种方式,本文将结合实际场景,详细介绍几种常见的处理方法。

本文目录

      • 1. 使用 @Results 和 @Result注解进行手动映射
      • 2. 使用 @SelectProvider动态生成 SQL

1. 使用 @Results 和 @Result注解进行手动映射

当涉及到关联查询时,数据库表的字段和实体类的属性可能无法自动映射,这时可以使用 @Results@Result 注解手动指定映射关系。

假设有 Order(订单)和 Product(商品)两个实体,一个订单可以包含多个商品,需要查询订单信息并关联查询出商品信息。

实体类定义:

// Order 类
@Data
public class Order {
    private Long id;
    private String orderNo;
    private List<Product> products;
}

// Product 类
@Data
public class Product {
    private Long id;
    private String name;
    private double price;
}

Mapper接口:

import org.apache.ibatis.annotations.*;
import java.util.List;

@Mapper
public interface OrderMapper {
    @Select("SELECT o.id, o.order_no, p.id as product_id, p.name as product_name, p.price as product_price " +
            "FROM orders o " +
            "JOIN order_items oi ON o.id = oi.order_id " +
            "JOIN products p ON oi.product_id = p.id " +
            "WHERE o.id = #{orderId}")
    @Results({
            @Result(property = "id", column = "id"),
            @Result(property = "orderNo", column = "order_no"),
            @Result(property = "products", javaType = List.class,
                    many = @Many(select = "com.shop.mapper.ProductMapper.getProductsByOrderId"))
    })
    Order getOrderWithProducts(Long orderId);
}

// ProductMapper 接口
@Mapper
public interface ProductMapper {
    @Select("SELECT * FROM products WHERE id IN (SELECT product_id FROM order_items WHERE order_id = #{orderId})")
    List<Product> getProductsByOrderId(Long orderId);
}

@Results 注解用于手动指定结果集的映射关系。
@Result 注解中,property 表示实体类的属性名,column 表示数据库表的列名。
@Many 注解用于处理一对多的关联关系,select 属性指定了关联查询的方法。



2. 使用 @SelectProvider动态生成 SQL

对于复杂的关联查询,SQL 语句可能会根据不同的条件动态变化,这时可以使用 @SelectProvider 注解动态生成 SQL。比如,如果需要根据用户输入的条件,动态查询订单及其关联的商品信息。

Mapper接口:

import org.apache.ibatis.annotations.*;
import java.util.List;

@Mapper
public interface OrderMapper {
    @SelectProvider(type = OrderSqlProvider.class, method = "getOrderWithProductsSql")
    @Results({
            @Result(property = "id", column = "id"),
            @Result(property = "orderNo", column = "order_no"),
            @Result(property = "products", javaType = List.class,
                    many = @Many(select = "com.example.shop.ProductMapper.getProductsByOrderId"))
    })
    Order getOrderWithProductsByCondition(@Param("orderId") Long orderId, @Param("productName") String productName);
}

// 动态SQL提供类
class OrderSqlProvider {
    public String getOrderWithProductsSql(@Param("orderId") Long orderId, @Param("productName") String productName) {
        StringBuilder sql = new StringBuilder("SELECT o.id, o.order_no, p.id as product_id, p.name as product_name, p.price as product_price " +
                "FROM orders o " +
                "JOIN order_items oi ON o.id = oi.order_id " +
                "JOIN products p ON oi.product_id = p.id " +
                "WHERE 1 = 1");
        if (orderId != null) {
            sql.append(" AND o.id = #{orderId}");
        }
        if (productName != null && !productName.isEmpty()) {
            sql.append(" AND p.name LIKE CONCAT('%', #{productName}, '%')");
        }
        return sql.toString();
    }
}

@SelectProvider 注解指定了提供 SQL 语句的类和方法。
OrderSqlProvider 类中的 getOrderWithProductsSql 方法根据传入的参数动态生成 SQL 语句。


文章转载自:
http://chincough.jopebe.cn
http://anta.jopebe.cn
http://cavortings.jopebe.cn
http://bordetela.jopebe.cn
http://cctv.jopebe.cn
http://accompany.jopebe.cn
http://agrostography.jopebe.cn
http://cana.jopebe.cn
http://befriend.jopebe.cn
http://brightwork.jopebe.cn
http://cephalous.jopebe.cn
http://acetabularia.jopebe.cn
http://chartered.jopebe.cn
http://biographical.jopebe.cn
http://anapestic.jopebe.cn
http://calamint.jopebe.cn
http://barbarian.jopebe.cn
http://caecum.jopebe.cn
http://becripple.jopebe.cn
http://autoplasty.jopebe.cn
http://bandana.jopebe.cn
http://bardia.jopebe.cn
http://chanciness.jopebe.cn
http://amaze.jopebe.cn
http://chivalrous.jopebe.cn
http://betweenness.jopebe.cn
http://causationism.jopebe.cn
http://aweto.jopebe.cn
http://chenar.jopebe.cn
http://bassoonist.jopebe.cn
http://www.dtcms.com/a/114298.html

相关文章:

  • Nacos注册中心AP模式核心源码分析(集群模式)
  • (一)从零开始:用 LangChain 和 ZhipuAI 搭建简单对话
  • SonarQube数据库配置
  • Flutter之页面布局一
  • Kubernetes 集群搭建(一):k8s 从环境准备到 Calico 网络插件部署(1.16版本)
  • 常见的图像生成算法
  • 堆与二叉树的关系
  • Python四大核心数据结构深度解析:列表、元组、字典与集合
  • STM32F103C8T6实现 SG90 360 °电机转动
  • 积分赛——获取环境温度
  • PyTorch深度学习框架60天进阶学习计划 - 第36天:医疗影像诊断(一)
  • Unhandled exception: org.apache.poi.openxml4j.exceptions.InvalidFormatException
  • 混合精度策略在PBiCGStab算法中的应用
  • 数据蒸馏:Dataset Distillation by Matching Training Trajectories 论文翻译和理解
  • Redis数据结构之String
  • 蓝桥杯:对字符串处理常用知识笔记
  • 如何在Ubuntu上安装Dify
  • 控件主题效果添加程序设计
  • 【速写】SFT案例实操(以Qwen2.5-instruct-0.5B)
  • 24统计建模国奖论文写作框架(机器学习+图像识别类)
  • 搭建redis主从同步实现读写分离(原理剖析)
  • Day1:前端项目uni-app壁纸实战
  • Python-函数参数
  • (四)数据检索与增强生成——让对话系统更智能、更高效
  • 微软的 Copilot 现在可以浏览网页并为您执行操作
  • Qt中左侧项目菜单中构建设置功能中的构建步骤是怎么回事
  • 数字内容个性化推荐引擎构建
  • 计算机网络实验(包括实验指导书)
  • 可视化工具
  • STM32 × CLion 新建项目