MyBatis关系映射

2023-11-06

前言

MyBatis是一个Java持久化框架,它提供了一种将数据库表和Java对象之间进行关系映射的方式。这种关系映射可以通过XML配置文件或注解来定义。

在MyBatis中,关系映射是通过Mapper接口和SQL语句来实现的。Mapper接口定义了数据库操作的方法,而SQL语句则定义了具体的数据库操作。

在关系映射中,MyBatis提供了一些注解和XML配置来实现对象和数据库表之间的映射关系。例如,@Table注解可以用于指定Java对象对应的数据库表,@Column注解可以用于指定Java对象属性对应的数据库字段。

此外,MyBatis还支持一对一、一对多、多对一和多对多等复杂的关系映射。通过配置关联关系,可以在查询时自动加载相关联的对象。

一、一对一映射

一对一映射是指数据库中的两个表之间存在一对一的关系,即一个记录在一个表中只对应一个记录在另一个表中的情况。

1.1 创建实体

假设我们有两个表:student(学生表)和 id_card(身份证表)。每个学生只有一个身份证,而每个身份证只属于一个学生。

public class Student {
    private int id;
    private String name;
    private IdCard idCard;

    // 省略构造函数和getter/setter方法
}

public class IdCard {
    private int id;
    private String number;
    private Student student;

    // 省略构造函数和getter/setter方法
}

1.2 xml配置

使用XML配置的方式,可以在Student类对应的中使用标签来定义关联关系:

<resultMap id="studentResultMap" type="com.xqx.model.Student">
    <!-- 省略其他映射配置 -->
    <association property="idCard" javaType="com.xqx.model.IdCard">
        <id property="id" column="id_card_id"/>
        <result property="number" column="id_card_number"/>
    </association>
</resultMap>

通过以上配置,我们可以在查询学生信息时,自动加载关联的身份证信息。

二、一对多映射

一对多映射是指数据库中的两个表之间存在一对多的关系,即一个记录在一个表中对应多个记录在另一个表中的情况。例如,一个订单(Oeder)与一个订单详情(OrderItem)之间的关系。假设我们有以下表结构:
在这里插入图片描述

2.1 创建实体

建立一个OrderVo。OrderVo 类用于表示一个订单及其关联的订单项。

package com.xqx.vo;
 
import com.xqx.model.Order;
import com.xqx.model.OrderItem;
import lombok.Data;
 
import java.util.ArrayList;
import java.util.List;
 
@Data
public class OrderVo extends Order {
    private List<OrderItem> orderItems = new ArrayList<>();
} 

2.2 resultMap配置

    <resultMap id="OrderVoMap" type="com.xqx.vo.OrderVo">
        <result column="order_id" property="orderId"></result>
        <result column="order_no" property="orderNo"></result>
        //多关系使用collection
        <collection property="orderItems" ofType="com.xqx.model.OrderItem">
            <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>

2.3 测试

OrderMapper

package com.xqx.mapper;
 
import com.xqx.model.Order;
import com.xqx.vo.OrderVo;
import org.springframework.stereotype.Repository;
 
@Repository
public interface OrderMapper {
    
     OrderVo selectbyOid(Integer boid);
 
}

OrderBiz

package com.xqx.biz;
 
import com.xqx.vo.OrderVo;
 
 
public interface OrderBiz {
    OrderVo selectbyOid(Integer boid);
}

OrderBizImpl


package com.xqx.biz;
 
import com.xqx.mapper.OrderMapper;
import com.xqx.vo.OrderVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 

@Service
public class OrderBizImpl implements OrderBiz {
    @Autowired
    private OrderMapper OrderMapper;
 
    @Override
    public OrderVo selectbyOid(Integer boid) {
        return OrderMapper.selectbyOid(boid);
    }
}

Junit测试

package com.xqx.biz;
 
import com.xqx.vo.OrderVo;
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;
 

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:Spring-context.xml"})
public class OrderBizImplTest {
    @Autowired
    private OrderBiz OrderBiz;
 
    @Test
    public void selectbyOid() {
        OrderVo orderVO = OrderBiz.selectbyOid(7);
        System.out.println(orderVO);
        orderVO.getOrderItems().forEach(System.out::println);
    }
}

测试结果
在这里插入图片描述

三、 多对多映射

多对多映射是指多个对象与多个对象具有多对多的关系。以根据书籍id查找关联属性类别为例
在这里插入图片描述

3.1 创建实体

vo对象

package com.xqx.vo;
 
import com.xqx.model.BookCategory;
import com.xqx.model.Book;
import lombok.Data;
import java.util.List;

@Data
public class BookVo extends Book {
    private List<BookCategory> bookc = new ArrayList<>();
}

3.2 resultMap配置

  <resultMap id="BookVoMap" type="com.xqx.vo.BookVo" >
    <result column="book_id" property="bookId"></result>
    <result column="book_name" property="bookName"></result>
    <result column="price" property="price"></result>
    <collection property="bookc" ofType="com.xqx.model.Category">
      <result column="category_id" property="categoryId"></result>
      <result column="category_name" property="categoryName"></result>
    </collection>
  </resultMap>
 
  <!--根据书籍的id查询书籍的信息及所属属性-->
  <select id="selectByBookId" resultMap="BookVoMap" parameterType="java.lang.Integer">
    SELECT
      *
    FROM
      t_hibernate_book b,
      t_hibernate_category c,
      t_hibernate_book_category bc
    WHERE
      b.book_id = bc.bid
      AND c.category_id = bc.bcid
      AND b.book_id = #{bid}
  </select>

3.3 测试

BookMapper

package com.xqx.mapper;
 
import com.xqx.model.Book;
import com.xqx.vo.BookVo;
import org.springframework.stereotype.Repository;
 
@Repository
public interface BookMapper {
   
    HbookVo selectByBid(Integer bid);
 
}

BookBiz

package com.xqx.biz;
 
import com.xqx.vo.BookVo;
 

public interface BookBiz {
    HbookVo selectByBid(Integer bid);
}

BookBizImpl

package com.xqx.biz;
 
import com.xqx.mapper.BookMapper;
import com.xqx.vo.BookVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 

@Service
public class BookBizImpl implements BookBiz {
    @Autowired
    private BookMapper BookMapper;
 
    @Override
    public BookVo selectByBid(Integer bid) {
        return BookMapper.selectByBid(bid);
    }
}

junit测试

package com.xqx.biz;
 
import com.xqx.vo.BookVo;
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;
 

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:Spring-context.xml"})
public class BookBizImplTest {
    @Autowired
    private BookBiz BookBiz;
 
    @Test
    public void selectByBid() {
        BookVo bookVo = BookBiz.selectByBid(8);
        System.out.println(bookVo);
        BookVo.getHcategory().forEach(System.out::println);
    }
}

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MyBatis关系映射 的相关文章

  • 查询以查找平均加权价格

    我在 Oracle 中有一个表 每个给定部分包含多行 每行都有一个与其关联的数量和价格 还有一个给定零件的行集相加的总数量 以下是数据示例 我需要的是获得该零件的平均加权价格 例如 如果数量为 100 的零件的价格为 1 数量为 50 的零
  • Where 子句中的 If 语句

    我正在处理一个在 WHERE 子句中包含 IF 语句的查询 但是 PL SQL Developer 在执行时给出了一些错误 谁能帮我正确的查询吗 这是查询 SELECT t first name t last name t employid
  • 如何动态创建表数据类型的变量?

    在以下查询中 select string 可以返回具有任何可能数据类型的任意数量的列和行 Execute immediate select string into v table variable 例如 select string 可以是
  • 从 Oracle 获取包方法和参数

    我正在寻找 Oracle 查询来获取 Oracle 包 过程的所有参数 我知道有一个视图或表可以提供此功能 但我似乎不记得它是什么 注意 我并不是要从 user objects 获取包列表 而是要获取包 中每个过程的数据类型和参数名称 Th
  • 如何在 PL/SQL 中查找字符串中不同字符的数量和名称[重复]

    这个问题在这里已经有答案了 我对 PL SQL 很陌生 我需要获取字符串中不同字符的名称和计数 例如 如果我有一个字符串str helloexample 我需要获得不同字符的输出str i e heloxamp 我怎样才能做到这一点 您可以
  • Oracle PLSQL 将日期时间截断为 15 分钟块

    我想将我的数据聚合成 15 分钟的片段 一刻钟 为此 我编写了一些生成 15 分钟日期时间块的代码 SELECT TRUNC SYSDATE hh 0 25 24 ROWNUM 0 25 24 AS time start ROWNUM TR
  • 如何捕获 PL/SQL 块中的唯一约束错误?

    假设我有一个 Oracle PL SQL 块 它将一条记录插入表中 并且需要从唯一约束错误中恢复 如下所示 begin insert into some table some values exception when update som
  • Oracle 事务在 C++ 和 Java 之间的传播

    我们有一个现有的 C 应用程序 我们将逐步将其替换为新的基于 Java 的系统 在我们用 Java 完全重新实现所有内容之前 我们期望 C 和 Java 必须相互通信 RMI SOAP 消息传递等 我们尚未决定 现在我的经理认为我们需要 J
  • DBMS_SCHEDULER.DROP_JOB 仅当存在时

    我有一个 sql 脚本 在导入转储后必须运行该脚本 该脚本除了执行其他操作外 还执行以下操作 BEGIN remove program SYS DBMS SCHEDULER DROP PROGRAM program name gt STAT
  • 从 CTE 插入

    WITH DTL AS SELECT CMPI CODE CMN CDTY MTRL CMI WT FACTOR CMI CNTRCT RATE PL PRESENT PRICE TRM CODE ROUND NVL PRESENT PRI
  • 金融 - 计算到期收益率

    我读了this https stackoverflow com questions 1173555 open source financial library specifically yield to maturity发布关于 net 库
  • oracle lag 函数与 group by

    我有一个查询忽略从前一个值增加的值 例如 采用下表 col1 col2 col3 5 1 A 4 2 A 6 3 A 9 4 B 8 5 B 10 6 B 现在进行以下查询 select col1 from select col1 lag
  • 如何使用 JSON_TABLE 从 Oracle JSON 列获取键值作为结果集

    我用谷歌搜索了很多 似乎无法找到适合我的简单用例的简单解决方案 我在 Oracle 12C 数据库中有一个 json 列 当然实际上是一个带有 json 约束的 varchar 在该列中我存储了这样的 Map 表示 a 9 0847 b 8
  • SQL使用多个/相关列计算项目频率?

    我对 SQL 完全陌生 并且阅读了有关 SQL 的 StackOverflow 帖子来尝试弄清楚这一点 以及其他来源 但无法在 SQL 中执行此操作 开始 我有一个 3 列和数千行的表 其中包含前 2 列的数据 第三列当前为空 我需要根据第
  • 在 plsql 中立即执行

    如何从这段代码中得到结果 EXECUTE IMMEDIATE SELECT FROM table name through for loop 通常的方法看起来像这样 for items in select from this table l
  • 以无法破坏的方式限制表中允许的记录数量

    我们有一个 Web 应用程序 Grails 我们将根据用户数量为其出售许可证 数据库 Oracle 10g 中有一个表保存用户 客户将托管自己的软件和数据库副本 有人可以建议一些策略来限制允许存在于用户表中的记录数量 从而使客户无法合理地破
  • 如何打印Oracle中过程的定义?

    oracle中有没有办法查看过程的结构是什么 我正在尝试记录并运行程序 并希望将实际的程序结构存储在我的日志中 您可以查询ALL SOURCE table SELECT text FROM all source WHERE owner lt
  • 使用 JPA 时如何在部署时设置序列的架构名称?

    出于安全原因 我们的 Oracle 数据库对象通常属于与登录用户不同的架构 例如 表位于 xx core 中 我们登录的用户是 xx app yy 在我的 persistence xml 中 我定义了一个 orm 文件 以便我可以在部署时指
  • CREATE TABLE 和 CREATE ANY TABLE 权限之间的区别

    我不明白这两种特权之间的区别 我找到了这两个解释 但这对我没有帮助 CREATE TABLE gt Enables a user to create a table owned by that user CREATE ANY TABLE g
  • 什么是 Oracle 数据集成器?

    什么是ODI ODI的实际用途是什么 oracle data integrator工具如何帮助编程 sql Developer 工具和 ODI 工具实际上有什么区别 真的厌倦了在某些网站上找到的定义 如果有人能提出 gud 解释 那就太好了

随机推荐

  • 求n的阶乘的方法

    n 1 2 3 4 n 具体来说1 2后再乘3再乘4 依次下去 1 首先用循环的方式 include
  • Linux下备份文件到其他服务器

    最近遇到需求 需要定时将文件备份到其他服务器 于是记录一下 本文旨在描述如何通过rsync插件实现服务器之间的文件备份 以下统一将备份文件所在服务器称为 源服务器 接收备份文件的服务器为 目标服务器 目录 一 为什么用rsync 二 安装r
  • 51单片机学习:外部中断0实验

    实验名称 外部中断0实验 接线说明 实验现象 下载程序后 当按下K3键可控制D1指示灯亮灭 注意事项 将红外接收传感器取下 防止对P3 2口干扰 include reg52 h typedef unsigned int u16 对系统默认数
  • JS中如何跳出.forEach循环

    写在前面 提到在一段程序中如果碰到需要终止 结束一个循环 函数或者一段代码 一般会想到以下这几个关键字return continue break 简述一下三者的区别 break 终止整个循环 有内层循环时终止的是内层循环 退出switch语
  • cpu运行gpu上的pytorch 报错:AssertionError:torch not compiled with cuda enabled——已解决

    感觉今天介绍的这种方法可以解决所有这种报错出现的问题 事件发生 报错 AssertionError torch not compiled with cuda enabled 解决方法 后来看到这个代码 parser add argument
  • uniapp:组件间传值

    组件间传值的情况 子组件 父组件 父组件 子组件 普通组件 普通组件 1 父组件 子组件 father vue
  • 深度了解特征工程

    一 特征工程介绍 Feature Engineering 什么是特征工程 特征工程解决了什么问题 为什么特征工程对机器学习很重要 怎么做特征工程 怎么做好特征工程 集众多博友智慧 一文全面了解并应用特征工程 1 定义及意义 1 定义 特征工
  • icmp隧道工具之ptunnel使用

    一 ptunnel 攻击机A 192 168 137 135 安装ptunnel 跳板机B 192 168 137 130 安装ptunnel 靶机 C 192 168 137 133 1 安装支持库 yum install libpcap
  • DSP定点数的计算规则和示例

    目录 1 Q S表示法的数值范围 2 定点化加减法计算规则 2 1 防溢出处理 3 定点化乘法计算规则 3 1 推算 4 定点化除法计算规则 4 1 推算 5 程序代码中如何确定Q值 6 浮点转定点计算示例 1 Q S表示法的数值范围 Q表
  • 网易游戏测试开发,2023届秋招面经

    一面 技术面 40min 三个面试官 一个负责记录 另两个负责问问题 常规问题 自我介绍 询问简历上的项目经验 项目中遇到的难点是什么 简单介绍一下之前笔试题目的算法思想 谈谈这个题目 基础问题 1 数据结构 怎样打印出全排列 2 数据结构
  • 递归及递归的简单运用之4种方法解斐波那契数列

    什么是递归 若一个对象部分的包含自己或用它自己给自己定义 那么我们说这个对象是递归的 若一个过程直接或间接的调用自己 那么这个过程是递归的 递归的思想是把问题分解为规模更小具有与原问题相同解法的子问题 因此可以让我们思考的方式更加简单 程序
  • 《游戏编程》第一部 基础篇

    游戏编程 第一部 基础篇 目录 零 基础篇的目的 一 游戏的动画原理 二 基于动画原理的提高 三 游戏的基石 窗口 的建立 四 游戏制作利器 引擎 的选择文章内容 零 基础篇的目的 有了一个目标之后 往往人们比较有信心和动力 所以 我重新修
  • 深度学习Caffe实战笔记(1)环境搭建

    1 环境搭建 从知道深度学习开始 就一直想学习使用caffe 碍于各种事情一直没有如愿 这几天终于找了个时间搞了一下 打算把学习的过程整理成笔记 包括环境搭建 跑车牌识别数据 跑mnist数据 用Alexnet跑自己的数据 用Siamese
  • oracle分区

    用列做分区 分区原则是列的内容 create table custaddr id varchar2 15 byte not null areacode varchar2 4 byte partition by list areacode p
  • 【Google Drive 存储空间不够了怎么办】

    在进行深度学习的时候往往要将数据集存储在Google Drive上面 但是Google Drive的免费空间只有15G 怎么呢 因为别人有在Google Drive上的数据集 可以直接右键点击Short Cut 相当于在本地文件夹创建了一个
  • Idea整合Maven安装及配置教程(图文详解)

    目录 友情提醒 第一章 Maven概述 1 1 Maven是什么 1 2 Maven进行构建 build 的主要环节 第二章 Maven的下载安装和配置 2 1 Maven的下载 2 2 Maven环境变量配置 2 3 Maven文件set
  • mysql-redis事务的比较

    mysql redis事务的比较 最近刚好回去看redis的源代码 不得不说这个源代码写的真心不错 很有味道 刚好之前系统学了MySQL 于是就到了和redis进行对比作为本周博客主题 mysql acid 提到mysql的事务 trans
  • vba:inputbox

    inputbox函数与方法 1 区别一 外观区别 InputBox 函数 在一对话框来中显示提示 等待用户输入正文或按下按钮 并返回包含文本框内容的 String Application InputBox 方法 显示一个接收用户输入的对话框
  • 桌面路径改到D盘的目录下

    桌面路径改到D盘的目录下 首先在你的D盘先创建一个desk文件夹 然后在左边这里找到桌面 点击右击 属性 然后点击位置 把这个位置修改为刚才你在D盘所创建的文件夹的位置 这样就大功告成了 似不似so easy
  • MyBatis关系映射

    文章目录 前言 一 一对一映射 1 1 创建实体 1 2 xml配置 二 一对多映射 2 1 创建实体 2 2 resultMap配置 2 3 测试 三 多对多映射 3 1 创建实体 3 2 resultMap配置 3 3 测试 前言 My