Mybatis_3 1对多对多 多层查询 association 与 collection 案例演示

本文探讨了实体类AProjectVo与AEngVo之间的关系,包括一对一和一对多关联,以及如何在DAO层实现基于这些关系的数据查询。具体展示了通过最小分子gid查询AProjectVo的SQL语句,涉及左连接操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//VO 返回的实体类之间的关系
public class AProjectVo extends AProject {
    private AProjectDetail aProjectDetail; //project : projectdetail = 1:1
    private List eListVo;//project : eng = 1:n
    
public class AEngVo extends AEng{
    private List gList;//eng : group = 1:n
    
//dao层 主要 返回对象就要保证查询的结果唯一 我们这里通过 最小的分子gid查询
AProjectVo selectAProjectVo(@Param("gId")String gId);


//xml  注意,如果 被包含对象 的字段名称 和父对象 字段名称 相同,则需要 起别名

   
   
   
   
  
   
   
   
   
  
 
   
   
   
   
   
   
          
       
       
       
       
   
 


    select * FROM a_project p
        LEFT JOIN a_project_detail pd ON p.p_id = pd.p_id
        LEFT JOIN a_eng e ON p.p_id = e.p_id
        LEFT JOIN a_group g ON e.e_id = g.e_id
        WHERE g.g_id = #{gId}

### MyBatis 中自连接一对多关系时结果集嵌套的 resultMap 配置示例 在 MyBatis 中,处理自连接的一对多关系并实现结果集嵌套,可以通过 `resultMap` 的 `association` 和 `collection` 标签完成。以下是一个完整的配置示例,展示如何映射自连接表中的一对多关系。 #### 示例场景 假设有一个 `employee` 表,其中包含员工信息,并且每个员工可以有一个上级(即自连接)。我们需要查询所有员工及其直接下属。 #### 数据库表结构 ```sql CREATE TABLE employee ( id INT PRIMARY KEY, name VARCHAR(50), manager_id INT, -- 上级员工ID,外键指向自身id FOREIGN KEY (manager_id) REFERENCES employee(id) ); ``` #### 查询 SQL ```sql SELECT e1.id AS emp_id, e1.name AS emp_name, e2.id AS sub_emp_id, e2.name AS sub_emp_name FROM employee e1 LEFT JOIN employee e2 ON e1.id = e2.manager_id; ``` #### resultMap 配置 以下是 MyBatis 的 `resultMap` 配置示例: ```xml <resultMap id="EmployeeResultMap" type="com.example.Employee"> <id property="id" column="emp_id"/> <result property="name" column="emp_name"/> <!-- 嵌套集合:表示当前员工的所有直接下属 --> <collection property="subordinates" ofType="com.example.Employee"> <id property="id" column="sub_emp_id"/> <result property="name" column="sub_emp_name"/> </collection> </resultMap> ``` #### Mapper 接口方法 ```java public interface EmployeeMapper { @Select({ "SELECT e1.id AS emp_id, e1.name AS emp_name, ", " e2.id AS sub_emp_id, e2.name AS sub_emp_name ", "FROM employee e1 ", "LEFT JOIN employee e2 ON e1.id = e2.manager_id" }) @ResultMap("EmployeeResultMap") List<Employee> getAllEmployeesWithSubordinates(); } ``` #### 实体类定义 ```java import java.util.List; public class Employee { private Integer id; private String name; // 直接下属列表 private List<Employee> subordinates; // Getter 和 Setter 方法 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Employee> getSubordinates() { return subordinates; } public void setSubordinates(List<Employee> subordinates) { this.subordinates = subordinates; } } ``` #### 关键点说明 - 使用 `collection` 标签来映射一对多关系[^1]。 - 在 `collection` 标签中,`ofType` 属性指定集合中元素的类型[^2]。 - 通过为子查询字段指定别名(如 `sub_emp_id` 和 `sub_emp_name`),确保父查询和子查询字段不会冲突[^3]。 --- ### 注意事项 1. 如果存在多层嵌套关系(如员工的下属还有下属),需要进一步扩展 `resultMap` 或使用递归查询[^4]。 2. 确保数据库查询语句中的字段别名 `resultMap` 中的 `column` 属性一致,否则会导致映射失败[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值