在 MyBatis 中,@Many
注解用于表示“一对多”关系,通常用在需要关联查询的场景,比如一个订单可以有多个商品,或者一个用户可以有多个角色。
1. 数据库表结构
假设我们有两张表,User
和 Order
:
-- User 表
CREATE TABLE user (
id INT PRIMARY KEY,
name VARCHAR(50)
);
-- Order 表
CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT,
order_details VARCHAR(255),
FOREIGN KEY (user_id) REFERENCES user(id)
);
2. 实体类
接下来定义两个实体类 User
和 Order
:
// Order 实体类
public class Order {
private Integer id;
private Integer userId;
private String orderDetails;
// Getter 和 Setter 方法
}
// User 实体类
public class User {
private Integer id;
private String name;
private List<Order> orders; // 一对多关系,一个用户有多个订单
// Getter 和 Setter 方法
}
3. Mapper 接口和 XML 配置
我们将通过 MyBatis 的 Mapper 接口来查询数据。这里使用 @Many
注解来配置查询。
public interface UserMapper {
// 根据用户 ID 查询用户和其订单列表
@Select("SELECT * FROM user WHERE id = #{id}")
@Results({
@Result(property = "id", column = "id"),
@Result(property = "name", column = "name"),
@Result(property = "orders", column = "id",
many = @Many(select = "selectOrdersByUserId"))
})
User selectUserWithOrders(int id);
// 根据用户 ID 查询其订单列表
@Select("SELECT * FROM orders WHERE user_id = #{userId}")
List<Order> selectOrdersByUserId(int userId);
}
4. 使用示例
使用上面定义的 UserMapper
,可以查询一个用户及其所有的订单:
public class UserService {
private UserMapper userMapper;
public User getUserWithOrders(int userId) {
return userMapper.selectUserWithOrders(userId);
}
}
5. 运行结果
通过调用 getUserWithOrders(userId)
方法,可以得到一个 User
对象,里面包含了该用户的基本信息以及他的所有订单信息。
总结
@Many
注解用于处理“一对多”关系。@Result
注解中的many
属性指定了一个@Many
注解,用于表示多的一方。- 在
@Many
注解中,select
属性指向另一个查询方法,通常用于查询关联表的数据。
通过这种方式,你可以轻松地在 MyBatis 中处理一对多的关联关系。
文章评论