mybatis一对多和多对一查表 注解开发
时间: 2024-12-26 15:17:49 浏览: 5
### MyBatis 一对多和多对一关系映射注解开发
#### 使用 `@Results` 和 `@Result` 进行集合映射
在 MyBatis 中,为了实现复杂的关系映射,如一对多或多对一,可以通过组合使用 `@Results`, `@Result` 及特定的嵌套标签完成。对于一对多的情况,比如部门(Department)与员工(Employee),其中部门表中一条记录对应着员工表中的多条记录。
```java
public interface DepartmentMapper {
@Select("SELECT * FROM department WHERE id = #{id}")
@Results({
@Result(id=true,column="id",property="id"),
@Result(column="name",property="name"),
@Result(property="employees",
javaType=ArrayList.class,
column="id",
many=@Many(select="com.example.EmployeeMapper.getEmployeesByDeptId"))
})
Department getDepartmentById(int id);
}
```
上述代码展示了如何查询指定 ID 的部门及其所属的所有员工[^1]。这里的关键在于 `many=@Many(...)` 属性指定了用于获取关联实体列表的方法路径。
相反,在处理多对一时,则是从多方出发去查找单一的对象实例。例如,当有多个订单(Order)属于同一个客户(Customer),即从订单角度查看其对应的唯一客户:
```java
public interface OrderMapper {
@Select("SELECT * FROM orders WHERE order_id=#{orderId}")
@Results({
@Result(id=true,column="order_id",property="orderId"),
@Result(column="customer_id",property="customerId"),
@Result(property="customer",
column="customer_id",
one=@One(select="com.example.CustomerMapper.getCustomerById"))
})
Order getOrderById(String orderId);
}
```
这段代码说明了怎样依据给定订单编号取得相应订单详情以及它所归属的那个顾客的信息[^4]。注意这里的 `one=@One(...)` 参数用来指示一对一的选择语句位置。
#### 修改核心配置文件以支持注解驱动
为了让这些带有注解的 Mapper 接口生效,还需要调整 MyBatis 的全局配置文件 sqlMapConfig.xml 来注册相应的 Mapper 类型。具体做法是在 `<mappers>` 节点下加入如下声明:
```xml
<mapper class="com.example.DepartmentMapper"/>
<mapper class="com.example.OrderMapper"/>
<!-- 更多 mapper 定义 -->
```
这一步骤告知 MyBatis 哪些接口应该被当作 SQL 映射处理器对待,并允许框架自动发现并应用上面提到的各种注解设置[^2]。
阅读全文