• Mybatis中的关系映射


    目录

    前言

    1.一对一的映射关系

    1.1 创建模型类和Vo类

     1.2 配置当前模型类的mapper.xml

    1.3 开始测试

    2.一对多的映射关系

    2.1 创建模型类和Vo类

    2.2 配置当前模型类的mapper.xml

    2.3 开始测试

    3.多对多的映射关系

    总结

     注意点: 


    前言

    1. 一对一映射(One-to-One Mapping)

      • 一对一关系指的是两个实体之间存在严格的一对一对应关系。
      • 可以通过在对象之间定义关联属性和外键字段来实现一对一映射。
      • 比如,在数据库中有一个user表和一个user_profile表,通过在user对象中定义一个UserProfile属性,并在user_profile表中定义一个外键字段user_id来实现一对一映射。
    2. 一对多映射(One-to-Many Mapping)

      • 一对多关系指的是一个实体对象关联多个实体对象。
      • 可以通过在对象之间定义关联属性和外键字段来实现一对多映射。
      • 比如,在数据库中有一个order表和一个order_item表,通过在order对象中定义一个List属性,并在order_item表中定义一个外键字段order_id来实现一对多映射。
    3. 多对一映射(Many-to-One Mapping)

      • 多对一关系指的是多个实体对象关联一个实体对象。
      • 可以通过在对象之间定义关联属性和外键字段来实现多对一映射。
      • 比如,在数据库中有一个order_item表和一个product表,通过在OrderItem对象中定义一个Product属性,并在order_item表中定义一个外键字段product_id来实现多对一映射。
    4. 多对多映射(Many-to-Many Mapping)

      • 多对多关系指的是多个实体对象相互关联。
      • 在数据库中,多对多关系需要通过一个中间表来实现。
      • 可以通过在对象之间定义关联集合属性来实现多对多映射。
      • 比如,在数据库中有一个student表和一个course表,通过在Student对象中定义一个List属性,并在中间表中存储对应的关联关系来实现多对多映射。

    以上是一些常见的关系映射方式,MyBatis提供了多种配置方式来支持这些关系映射,包括XML配置文件和注解。通过使用适当的配置和映射规则,MyBatis可以将数据库中的数据映射到Java对象中,使得数据的访问和操作更加便捷。

    1.一对一的映射关系

    一对一关系(One-to-One)表示两个实体对象之间存在唯一的关联关系。例如,一个学生只能拥有一个身份证。在 MyBatis 中,我们可以使用结果嵌套或一对一映射来处理一对一关系。

    1.1 创建模型类和Vo类

    1. package com.YU.model;
    2. public class OrderItem {
    3. private Integer orderItemId;
    4. private Integer productId;
    5. private Integer quantity;
    6. private Integer oid;
    7. public OrderItem(Integer orderItemId, Integer productId, Integer quantity, Integer oid) {
    8. this.orderItemId = orderItemId;
    9. this.productId = productId;
    10. this.quantity = quantity;
    11. this.oid = oid;
    12. }
    13. public OrderItem() {
    14. super();
    15. }
    16. public Integer getOrderItemId() {
    17. return orderItemId;
    18. }
    19. public void setOrderItemId(Integer orderItemId) {
    20. this.orderItemId = orderItemId;
    21. }
    22. public Integer getProductId() {
    23. return productId;
    24. }
    25. public void setProductId(Integer productId) {
    26. this.productId = productId;
    27. }
    28. public Integer getQuantity() {
    29. return quantity;
    30. }
    31. public void setQuantity(Integer quantity) {
    32. this.quantity = quantity;
    33. }
    34. public Integer getOid() {
    35. return oid;
    36. }
    37. public void setOid(Integer oid) {
    38. this.oid = oid;
    39. }
    40. }
    1. package com.YU.vo;
    2. import com.YU.model.Order;
    3. import com.YU.model.OrderItem;
    4. /**
    5. * @author YU
    6. * @create 2023-09-04 9:31
    7. */
    8. public class OrderItemVo extends OrderItem {
    9. private Order order;
    10. public Order getOrder() {
    11. return order;
    12. }
    13. public void setOrder(Order order) {
    14. this.order = order;
    15. }
    16. }

     1.2 配置当前模型类的mapper.xml

    1. <resultMap id="OrderItemVoMap" type="com.YU.vo.OrderItemVo">
    2. <result column="order_item_id" property="orderItemId">result>
    3. <result column="product_id" property="productId">result>
    4. <result column="quantity" property="quantity">result>
    5. <result column="oid" property="oid">result>
    6. <association property="order" javaType="com.YU.model.Order">
    7. <result column="order_id" property="orderId">result>
    8. <result column="order_no" property="orderNo">result>
    9. association>
    10. resultMap>
    11. <select id="selectByOrderItemId" parameterType="OrderItemVoMap" parameterMap="java.lang.Integer">
    12. SELECT * FROM t_hibernate_order o,t_hibernate_order_item oi
    13. where o.order_id = oi.oid and oi.order_item_id = #{oiid}
    14. select>

    1.3 开始测试

    省略了业务逻辑层的编写,这里使用junit直接进行测试

    1. package com.YU.biz.Impl;
    2. import com.YU.biz.OrderItemBiz;
    3. import com.YU.vo.OrderItemVo;
    4. import org.junit.Test;
    5. import org.junit.runner.RunWith;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.test.context.ContextConfiguration;
    8. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    9. /**
    10. * @author YU
    11. * @create 2023-09-04 9:49
    12. */
    13. @RunWith(SpringJUnit4ClassRunner.class)
    14. @ContextConfiguration(locations={"classpath:spring-context.xml"}
    15. )
    16. public class OrderTest {
    17. @Autowired
    18. private OrderItemBiz orderItemBiz;
    19. @Test
    20. public void selectOrderItemId(){
    21. OrderItemVo orderItemVo = orderItemBiz.selectByOrderItemId(27);
    22. System.out.println(orderItemVo);
    23. System.out.println(orderItemVo.getOrder());
    24. }
    25. }

    2.一对多的映射关系

    一对多关系(One-to-Many)表示一个实体对象(一的一方)可以与多个相关实体对象(多的一方)建立关联。例如,一个部门可以有多个员工。在 MyBatis 中,我们可以使用嵌套查询或结果映射来处理一对多关系。

    2.1 创建模型类和Vo类

    1. package com.YU.model;
    2. import lombok.ToString;
    3. @ToString
    4. public class Order {
    5. private Integer orderId;
    6. private String orderNo;
    7. public Order(Integer orderId, String orderNo) {
    8. this.orderId = orderId;
    9. this.orderNo = orderNo;
    10. }
    11. public Order() {
    12. super();
    13. }
    14. public Integer getOrderId() {
    15. return orderId;
    16. }
    17. public void setOrderId(Integer orderId) {
    18. this.orderId = orderId;
    19. }
    20. public String getOrderNo() {
    21. return orderNo;
    22. }
    23. public void setOrderNo(String orderNo) {
    24. this.orderNo = orderNo;
    25. }
    26. }
    1. package com.YU.vo;
    2. import com.YU.model.Order;
    3. import com.YU.model.OrderItem;
    4. import java.util.ArrayList;
    5. import java.util.List;
    6. /**
    7. * @author YU
    8. * @create 2023-09-04 9:31
    9. */
    10. public class OrderVo extends Order {
    11. private List OrderItems = new ArrayList<>();
    12. public List getOrderItem() {
    13. return OrderItems;
    14. }
    15. public void setOrderItem(List OrderItems) {
    16. this.OrderItems = OrderItems;
    17. }
    18. }

    2.2 配置当前模型类的mapper.xml

    1. <resultMap id="OrderVoMap" type="com.YU.vo.OrderVo">
    2. <result column="order_id" property="orderId">result>
    3. <result column="order_no" property="productId">result>
    4. <collection property="orderItems" ofType="com.YU.model.Order">
    5. <result column="order_item_id" property="orderItemId">result>
    6. <result column="product_id" property="productId">result>
    7. <result column="quantity" property="quantity">result>
    8. <result column="oid" property="oid">result>
    9. collection>
    10. resultMap>
    11. <select id="selectByOid" resultMap="OrderVoMap" parameterType="java.lang.Integer">
    12. SELECT * FROM t_hibernate_order o,t_hibernate_order_item oi
    13. where o.order_id = oi.oid and o.order_id = #{oid}
    14. select>

    2.3 开始测试

    1. @Autowired
    2. private OrderBiz orderBiz;
    3. @Test
    4. public void selectByOid(){
    5. OrderVo orderVo = orderBiz.selectByOid(7);
    6. System.out.println(orderVo);
    7. orderVo.getOrderItem().forEach(System.out::println);
    8. }

    3.多对多的映射关系

    多对多的映射关系是指两个实体之间存在多对多的关系,其中一个实体可以关联多个另一个实体,而另一个实体也可以关联多个第一个实体。

    在关系型数据库中,多对多的关系需要通过中间表(也称为连接表)来实现。中间表包含两个外键关联到两个实体的主键,用于记录它们之间的关系。

    总结

    在 MyBatis 中,映射关系是指数据库表和 Java 对象之间的映射配置,用于将查询结果映射到 Java 对象或将 Java 对象的属性映射到数据库表的列

    基于 XML 的映射方式:

    • 使用  元素配置结果集的映射关系,指定数据库列和 Java 对象属性之间的映射。
    • 可以使用  元素将数据库列映射到 Java 对象的属性,并指定属性的类型、映射关系及相关配置。
    • 可以使用  元素配置关联对象的映射关系,用于映射复杂对象之间的关系。
    • 可以使用  元素配置集合类型对象的映射关系,用于映射一对多或多对多的关系。
    • 使用  元素定义可重用的 SQL 片段,提供了组织和共享 SQL 语句的能力。

     注意点: 

    • 确保数据库表和 Java 对象的属性名称、类型一致,以便正确地映射数据。
    • 配置正确的映射关系,确保查询结果能正确映射到 Java 对象,或对象的属性能正确映射到数据库表。
    • 对于复杂的关联关系,需要配置适当的映射关系,以便处理关联对象之间的关系。

    正确配置映射关系可以提高数据的访问效率和开发效率,使数据库表和 Java 对象之间的转换更加方便和灵活。

  • 相关阅读:
    2022年哪些浏览器安全、速度快、好用又不卡?
    [附源码]Python计算机毕业设计Django农村人居环境治理监管系统
    推荐系统实践读书笔记-05利用上下文信息
    Docker Dockerfile 文件中设置时区的命令解析
    基因组学整理试题
    宇凡微发布2.4G合封芯片YE08,融合高性能MCU与射频收发功能
    1028 人口普查(JAVA)
    LeetCode 热题100——链表专题(二)
    SpringMVC与JavaConfig笔记整理
    一文读懂差分数组~
  • 原文地址:https://blog.csdn.net/weixin_73320743/article/details/132662151