• Mybatis——一对多关联映射


    一对多关联映射

    一对多关联映射有两种方式,都用到了collection元素

    以购物网站中用户和订单之间的一对多关系为例

    collection集合的嵌套结果映射

    创建两个实体类和映射接口

    1. package org.example.demo;
    2. import lombok.Data;
    3. import java.util.List;
    4. @Data
    5. public class User {
    6. private Integer userId;
    7. private String userName;
    8. private String password;
    9. private Cart cart;
    10. private List orderList;
    11. }
    1. package org.example.demo;
    2. import lombok.Data;
    3. @Data
    4. public class Order {
    5. private Integer orderId;
    6. private double price;
    7. }

    实现根据用户id查询出所有用户信息,包括该用户的所有订单信息 

    1. package org.example.mapper;
    2. import org.example.demo.User;
    3. import java.util.List;
    4. public interface UserMapper {
    5. User findUserAndOrderListByUserId(Integer userId);
    6. }
    方式一:与association类似,集合的嵌套结果映射就是指通过一次SQL查询得到所有的结果 
    1. <resultMap type="com.mybatis.entity.User"
    2. id="userMap">
    3. <id property="id" column="id"/>
    4. <result property="userName" column="user_name"/>
    5. <result property="password" column="password"/>
    6. resultMap>
    7. <resultMap type="com.mybatis.entity.User"
    8. id="userAndOrderListMap" extends="userMap">
    9. <collection property="orderList"
    10. ofType="com.mybatis.entity.Order">
    11. <id property="id" column="order_id"/>
    12. <result property="price" column="price"/>
    13. collection>
    14. resultMap>
    15. <select id="findUserAndOrderListById"
    16. resultMap="userAndOrderListMap">
    17. select u.id, u.user_name, u.password,
    18. o.order_id, o.price
    19. from user u
    20. left join orders o on u.id = o.user_id
    21. where u.id = #{id}
    22. select>

    resultMap元素中的extends属性可以实现结果映射的继承

    collection的ofType属性指定集合中元素的类型,必选项 

    1. <resultMap id="userAndOrderMap" type="org.example.demo.User">
    2. <id property="userId" column="user_id"/>
    3. <result property="userName" column="user_name"/>
    4. <result property="password" column="password"/>
    5. <collection property="orderList" ofType="org.example.demo.Order">
    6. <id property="orderId" column="order_id"/>
    7. <result property="price" column="price"/>
    8. collection>
    9. resultMap>
    10. <select id="findUserAndOrderListByUserId" resultMap="userAndOrderMap">
    11. select
    12. *
    13. from t_user u
    14. left join t_order o on u.user_id = o.user_id
    15. where u.user_id = #{userId};
    16. select>

     

    collection集合的嵌套查询

    集合的嵌套查询同样会执行额外的SQL查询

    1. <resultMap type="com.mybatis.entity.User"
    2. id="userAndOrderListMap" extends="userMap">
    3. <collection property="orderList" column="{uid=id}"
    4. ofType="com.mybatis.entity.Order" select="com.mybatis.mapper.OrderMapper.findOrdersByUserId">
    5. collection>
    6. resultMap>
    7. <select id="findUserAndOrderListById"
    8. resultMap="userAndOrderListMap">
    9. select * from user where id = #{id}
    10. select>

    OrderMapper.xml

    1. <resultMap type="com.mybatis.entity.Order"
    2. id="orderMap">
    3. <id property="id" column="order_id"/>
    4. <result property="price" column="price"/>
    5. resultMap>
    6. <select id="findOrdersByUserId"
    7. resultMap="orderMap">
    8. select * from orders where user_id = #{uid}
    9. select>

    对比两种方式

    第一种方式属于“关联的嵌套结果映射“,即通过一次SQL查询根据表或指定的属性映射到不同的对象中

    第二种方式属于“关联的嵌套查询”,利用简单的SQL语句,通过多次查询得到想要的结果,也可以实现延迟加载效果 

     

     

  • 相关阅读:
    【JavaScript保姆级教程】输出函数和初识变量
    C++调试:GDB调试器(GDB主要调试的是C/C++的程序)
    在有本地管理员权限的前提下,不知道密码,如何关闭zscaler
    RNN 浅析
    Java的HTML转义工具
    鸿蒙HarmonyOS实战-Stage模型(ExtensionAbility组件)
    对象的关联
    一套完整的养老院人员定位解决方案包含哪些内容?
    Git基本概念与使用
    经典游戏案例:仿植物大战僵尸
  • 原文地址:https://blog.csdn.net/LIUCHANGSHUO/article/details/137266856