Mybatis中的关系映射

这篇具有很好参考价值的文章主要介绍了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<OrderItem>属性,并在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<Course>属性,并在中间表中存储对应的关联关系来实现多对多映射。

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

1.一对一的映射关系

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

1.1 创建模型类和Vo类

package com.YU.model;

public class OrderItem {
    private Integer orderItemId;

    private Integer productId;

    private Integer quantity;

    private Integer oid;

    public OrderItem(Integer orderItemId, Integer productId, Integer quantity, Integer oid) {
        this.orderItemId = orderItemId;
        this.productId = productId;
        this.quantity = quantity;
        this.oid = oid;
    }

    public OrderItem() {
        super();
    }

    public Integer getOrderItemId() {
        return orderItemId;
    }

    public void setOrderItemId(Integer orderItemId) {
        this.orderItemId = orderItemId;
    }

    public Integer getProductId() {
        return productId;
    }

    public void setProductId(Integer productId) {
        this.productId = productId;
    }

    public Integer getQuantity() {
        return quantity;
    }

    public void setQuantity(Integer quantity) {
        this.quantity = quantity;
    }

    public Integer getOid() {
        return oid;
    }

    public void setOid(Integer oid) {
        this.oid = oid;
    }
}
package com.YU.vo;

import com.YU.model.Order;
import com.YU.model.OrderItem;

/**
 * @author YU
 * @create 2023-09-04 9:31
 */
public class OrderItemVo extends OrderItem {
    private Order order;

    public Order getOrder() {
        return order;
    }

    public void setOrder(Order order) {
        this.order = order;
    }
}

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

<resultMap id="OrderItemVoMap" type="com.YU.vo.OrderItemVo">
    <result column="order_item_id" property="orderItemId"></result>
    <result column="product_id" property="productId"></result>
    <result column="quantity" property="quantity"></result>
    <result column="oid" property="oid"></result>
    <association property="order" javaType="com.YU.model.Order">
      <result column="order_id" property="orderId"></result>
      <result column="order_no" property="orderNo"></result>
    </association>
  </resultMap>

  <select id="selectByOrderItemId" parameterType="OrderItemVoMap" parameterMap="java.lang.Integer">
    SELECT * FROM t_hibernate_order o,t_hibernate_order_item oi
  where o.order_id = oi.oid and oi.order_item_id = #{oiid}
  </select>

1.3 开始测试

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

package com.YU.biz.Impl;

import com.YU.biz.OrderItemBiz;
import com.YU.vo.OrderItemVo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * @author YU
 * @create 2023-09-04 9:49
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"}
)
public class OrderTest {

    @Autowired
    private OrderItemBiz orderItemBiz;

    @Test
    public void selectOrderItemId(){
        OrderItemVo orderItemVo = orderItemBiz.selectByOrderItemId(27);
        System.out.println(orderItemVo);
        System.out.println(orderItemVo.getOrder());
    }
}

2.一对多的映射关系

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

2.1 创建模型类和Vo类

package com.YU.model;

import lombok.ToString;

@ToString
public class Order {
    private Integer orderId;

    private String orderNo;

    public Order(Integer orderId, String orderNo) {
        this.orderId = orderId;
        this.orderNo = orderNo;
    }

    public Order() {
        super();
    }

    public Integer getOrderId() {
        return orderId;
    }

    public void setOrderId(Integer orderId) {
        this.orderId = orderId;
    }

    public String getOrderNo() {
        return orderNo;
    }

    public void setOrderNo(String orderNo) {
        this.orderNo = orderNo;
    }
}
package com.YU.vo;

import com.YU.model.Order;
import com.YU.model.OrderItem;

import java.util.ArrayList;
import java.util.List;

/**
 * @author YU
 * @create 2023-09-04 9:31
 */
public class OrderVo extends Order {
    private List<OrderItem> OrderItems = new ArrayList<>();

    public List<com.YU.model.OrderItem> getOrderItem() {
        return OrderItems;
    }

    public void setOrderItem(List<com.YU.model.OrderItem> OrderItems) {
        this.OrderItems = OrderItems;
    }
}

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

<resultMap id="OrderVoMap" type="com.YU.vo.OrderVo">
    <result column="order_id" property="orderId"></result>
    <result column="order_no" property="productId"></result>
    <collection property="orderItems" ofType="com.YU.model.Order">
      <result column="order_item_id" property="orderItemId"></result>
      <result column="product_id" property="productId"></result>
      <result column="quantity" property="quantity"></result>
      <result column="oid" property="oid"></result>
    </collection>
  </resultMap>

  <select id="selectByOid" resultMap="OrderVoMap" parameterType="java.lang.Integer">
    SELECT * FROM t_hibernate_order o,t_hibernate_order_item oi
    where o.order_id = oi.oid and o.order_id = #{oid}
  </select>

2.3 开始测试

@Autowired
    private OrderBiz orderBiz;

    @Test
    public void selectByOid(){
        OrderVo orderVo = orderBiz.selectByOid(7);
        System.out.println(orderVo);
        orderVo.getOrderItem().forEach(System.out::println);
    }

3.多对多的映射关系

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

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

总结

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

基于 XML 的映射方式:

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

 注意点: 

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

正确配置映射关系可以提高数据的访问效率和开发效率,使数据库表和 Java 对象之间的转换更加方便和灵活。文章来源地址https://www.toymoban.com/news/detail-700348.html

到了这里,关于Mybatis中的关系映射的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 认识Mybatis的关联关系映射,灵活关联表对象之间的关系

    目录      一、概述 ( 1 )  介绍 ( 2 )  关联关系映射 ( 3 ) 关联讲述 二、一对一关联映射 2.1 数据库创建 2.2 配置文件  2.3 代码生成 2.4 编写测试 三、一对多关联映射 四 、多对多关联映射 给我们带来的收获 关联关系映射是指在数据库中,通过定义 表之间的关联关系 ,将多

    2024年02月11日
    浏览(46)
  • 如何在MyBatis中处理复杂结果集映射关系

    在开发中,我们不是总是对单表进行操作的场景。按照数据库表的设计原则,要符合一定的范式,那么就需要对某一种场景的表进行拆分。 在业务上,可能是属于同一个业务。但是,在数据库中表的存储这块,可能就会涉及到表的拆分。 这里设计到表的创建直接创建两张表

    2024年02月05日
    浏览(49)
  • MyBatis中至关重要的关系映射----全方面介绍

    目录 一 对于映射的概念 1.1 三种关系映射 1.2 resultType与resultMap的区别 resultType: resultMap: 二,一对一关联查询 2.1 嵌套结果集编写 2.2 案例演示 三,一对多关联查询 3.1 嵌套结果集编写  3.3 案例演示 四,多对多关联查询  4.1 嵌套结果集编写  4.2 案例演示      在关系型数

    2024年02月09日
    浏览(40)
  • MyBatis注解开发---实现自定义映射关系和关联查询

    目录 相关导读 一、使用注解实现自定义映射关系 1. 编写注解方法 2. 编写测试方法

    2023年04月09日
    浏览(44)
  • Mybatis的三种映射关系以及联表查询

    目录 一、概念 二、一对一 1、配置generatorConfig.xml 2、Vo包的编写 3、xml的sql编写 4、编写对应接口及实现类 5、测试 三、一对多 1、Vo包类的编写 2、xml的sql编写 3、编写对应接口及实现类 4、测试 四、多对多 1、Vo类 2、xml的sql配置 3、接口及接口实现类 4、测试 1、MyBatis中表之间

    2024年02月10日
    浏览(48)
  • MyBatis 的关联关系配置 一对多,一对一,多对多 关系的映射处理

    目录 一.关联关系配置的好处  二. 导入数据库表:  三.    一对多关系:--    一个订单对应多个订单项        四.一对一关系:---一个订单项对应一个订单 五.多对多关系(两个一对多)          MyBatis是一个Java持久化框架,可以 通过XML或注解的方式 将对象与数据库

    2024年02月11日
    浏览(64)
  • 【Spring 篇】深入探讨MyBatis映射文件中的动态SQL

    MyBatis,这个名字在Java开发者的世界中犹如一道光芒,照亮着持久层操作的道路。而在MyBatis的映射文件中,动态SQL则是一个让人爱-hate的存在。有时候,你感叹它的灵活性,有时候,你可能会为它的繁琐而头痛。但别担心,我们将在本文中一起揭开动态SQL的神秘面纱,带你领

    2024年01月24日
    浏览(59)
  • MyBatis中的关联关系以及多表连接

    目录 一对一 一对多 多对多 关联关系总结 一对一 一张表的一条记录对应查询到另一张表的一条记录,重要的是实体中的一个对象也要包含另一个对象 实例,一个乘客查询到一本护照 实体类 dao层 mapper语句 测试层 一对多 mapper语句 实体类 dao层 测试层 多对多 dao层 测试层 m

    2024年02月13日
    浏览(37)
  • MyBatis XML 映射文件中的 SQL 语句可以分为动态语句和静态语句

    目录 静态查询: 动态查询: 静态更新: 动态更新: 静态删除: 动态删除: 动态语句和静态语句在 MyBatis 中的作用如下: 静态查询: 静态查询是指在 SQL 语句中执行固定的查询操作,查询的条件和内容是预先确定的,不会随着用户输入或其他条件的改变而改变。以下是一

    2024年01月18日
    浏览(72)
  • Mybatis/Mybatis-Plus驼峰式命名映射

    目录 一、mybatis驼峰式命名 二、mybatisPlus默认开启驼峰命名映射 方法一: 使用前提:数据库表设计按照规范“字段名中各单词使用下划线\\\"_\\\"划分”; 使用好处:省去mapper.xml文件中繁琐编写表字段列表与表实体类属性的映射关系,即resultMap。 示例: 方法二: mybatis-config.xml文

    2024年02月14日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包