mybatis 1对多的数据,如何一次性查出来?

1 个回答

  • 小王子-B727
    能治愈生活的良方,是保持对生活的热爱。
    在 MyBatis 中,查询一对多的数据通常需要使用 **嵌套查询** 或 **关联映射** 来实现一次性查出父子数据。以下是两种常见的实现方式: ### 1. **使用嵌套查询(`<select>`)** 这是通过一个 SQL 查询,先查询父对象,然后在结果中包含一个子对象集合(通常是通过子查询或连接查询)。 **假设有两个表:** - `user`(用户表) - `order`(订单表) 一个用户有多个订单(1 对 多),你想一次性查询出所有用户以及他们的订单。 **SQL 设计:** ```sql SELECT u.id AS userId, u.name AS userName, o.id AS orderId, o.amount AS orderAmount FROM user u LEFT JOIN order o ON u.id = o.user_id ``` **Mapper XML 配置:** ```xml <resultMap id="userResultMap" type="User"> <id property="id" column="userId"/> <result property="name" column="userName"/> <collection property="orders" ofType="Order"> <id property="id" column="orderId"/> <result property="amount" column="orderAmount"/> </collection> </resultMap> <select id="selectUsersWithOrders" resultMap="userResultMap"> SELECT u.id AS userId, u.name AS userName, o.id AS orderId, o.amount AS orderAmount FROM user u LEFT JOIN order o ON u.id = o.user_id </select> ``` **Java 实体类:** ```java public class User { private Integer id; private String name; private List<Order> orders; // getters and setters } public class Order { private Integer id; private BigDecimal amount; // getters and setters } ``` ### 2. **使用 `@One` 或 `@Many` 注解(仅适用于 MyBatis-Plus)** 在 MyBatis-Plus 中,如果你使用注解的方式来实现一对多的关联查询,可以通过 `@One` 或 `@Many` 来实现。 **假设与上述相同的场景:** **Java 实体类:** ```java public class User { private Integer id; private String name; private List<Order> orders; // 这里用 List 来表示一对多关系 // getters and setters } public class Order { private Integer id; private BigDecimal amount; // getters and setters } ``` **Mapper 接口:** ```java public interface UserMapper extends BaseMapper<User> { @Select("SELECT * FROM user WHERE id = #{id}") @Results({ @Result(property = "orders", column = "id", many = @Many(select = "com.example.OrderMapper.selectByUserId")) }) User selectUserWithOrders(Integer id); } public interface OrderMapper extends BaseMapper<Order> { @Select("SELECT * FROM `order` WHERE user_id = #{userId}") List<Order> selectByUserId(Integer userId); } ``` ### 3. **使用 MyBatis 提供的 `@Results` 和 `@Result` 注解** 可以使用 MyBatis 的注解方式来进行一对多的映射查询。假设你已经定义了两张表(`user` 和 `order`),下面是一个使用注解的例子。 **Java 实体类:** ```java public class User { private Integer id; private String name; private List<Order> orders; // getters and setters } public class Order { private Integer id; private BigDecimal amount; // getters and setters } ``` **Mapper 接口:** ```java public interface UserMapper { @Select("SELECT id, name 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 selectUserById(Integer id); @Select("SELECT id, amount FROM `order` WHERE user_id = #{userId}") List<Order> selectOrdersByUserId(Integer userId); } ``` **调用:** ```java User user = userMapper.selectUserById(1); System.out.println(user.getName()); user.getOrders().forEach(order -> System.out.println(order.getAmount())); ``` ### 结论: 1. **关联查询:** 一般来说,查询一对多的数据,我们会用 `LEFT JOIN` 进行关联查询,查询结果通过 `resultMap` 来映射父子对象。 2. **多表查询:** 如果你的关系较为复杂,涉及多个表的联合查询,推荐使用 `LEFT JOIN` 或子查询。 3. **注解方式:** 如果是 MyBatis 3.x,常用 `@One`、`@Many` 等注解进行一对多查询。
    发布于 2025-01-18 02:42 •IP属地 贵州
    举报
    评论
    收藏