为你解决在Mybatis中的疑惑?Mybatis中【关联关系映射】

news2024/11/25 3:07:43

一.介绍Mybatis中【关联关系映射】

1.什么是Mybatis中【关联关系映射】?

可以实现不同实体之间的关联查询和映射。关联关系映射可以将多个实体对象之间的关联关系通过数据库查询进行映射,实现对象之间的关联操作。

2.常见的Mybatis【关联关系映射】

2.1.一对一关联 

一对一关联是指两个实体对象之间存在唯一的关系。在数据库中,这种关系通常通过外键来表示。在MyBatis中,可以使用ResultMap来实现一对一关联映射。通过定义ResultMap的<association>元素,可以指定关联对象的属性与数据库字段的对应关系

2.2.一对多关联

 一对多关联是指一个实体对象对应多个关联对象。在数据库中,通常使用外键来表示这种关系。MyBatis通过使用Collection或者Map来实现一对多关联映射。可以使用ResultMap的<collection>元素来定义关联对象集合属性与数据库字段的对应关系,也可以使用<map>元素来实现Map类型的关联映射。

2.3.多对多关联

是指两个实体对象之间存在互相关联的关系,即一个实体对象可以对应多个另一个实体对象,而另一个实体对象也可以对应多个该实体对象。在数据库中,多对多关联通常通过中间表来实现。

 二.通过举出具体实例来验证:关联关系映射

1.具体实现思路

1.1定义实体对象,创建映射文件

 首先,通过插件来自动生成两个实体对象,例如A和B。它们之间的多对多关联关系由中间表C来表示。在生成实体时映射文件会自动生成出来,并分别定义实体对象A和B的SQL语句以及ResultMap。

1.2定义多对多关联关系

 在映射文件中,使用<collection>元素或者<association>元素来定义多对多关联关系。对于多对多关联,需要通过设置<collection>元素的property属性来指定实体对象A中存放实体对象B集合的属性名,并通过<collection>元素的select属性来引用查询实体对象B的SQL语句。

1.3编写SQL语句:

在映射文件中编写查询语句,以获取实体对象A和B之间的关联信息。这个查询语句通常会包含多个表的联接操作,以及条件的限制。

通过以上步骤,就可以在MyBatis中实现多对多关联映射。在查询时,可以通过调用相应的Mapper接口方法来获取实体对象A及其关联的实体对象B的信息,或者反过来获取实体对象B及其关联的实体对象A的信息。

2.一对多具体实例展示(一个订单对应多个订单项)

2.1生成实体,映射文件(在这里小编生成了所有的后面就不在描述)

 

 2.2在OrderMapper.xml中配置sql,以及映射

select id="byOid"   resultMap=""  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>

 然后再将OrderVoMap添加到 resultmap中

2.3创建一个Vo来实现辅佐方法的实现

package com.lz.vo;

import com.lz.model.Order;
import com.lz.model.OrderItem;

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

/**
 * @author lz
 * @create 2023-08-26 15:31
 */

public class OrderVo  extends Order {
 private List<OrderItem> orderItems=new ArrayList<>();

    public List<OrderItem> getOrderItems() {
        return orderItems;
    }

    public void setOrderItems(List<OrderItem> orderItems) {
        this.orderItems = orderItems;
    }
}

2.4就是创建接口并且实现方法,

package com.lz.biz.impl;

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

/**
 * @author lz
 * @create 2023-08-25 15:54
 */
@Service
public class OrderBizImpl implements OrderBiz{
    @Autowired
    private OrderMapper  orderMapper;

    @Override
    public OrderVo SelectbyOid(Integer oid) {
        return  OrderMapper.SelectbyOid(oid);
    }
}

2.5通过juint测试,返回结果

package com.lz.biz.impl;

import com.lz.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;

/**
 * @author lz
 * @create 2023-08-25 15:58
 */
@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);

     }


}

 

 3.一对以具体实例展示(一个订单项对应一个订单)

3.1在OrderItemMapper.xml中配置sql,以及映射

 3.2创建一个Vo来实现辅佐方法的实现

package com.lz.vo;

import com.lz.model.Order;
import com.lz.model.OrderItem;

/**
 * @author lz
 * @create 2023-08-27 21:04
 */
public class OrderItemVo  extends OrderItem {
      private Order  order;

    public Order getOrder() {
        return order;
    }

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

3.3c创建接口,并且调用

package com.lz.biz;

import com.lz.vo.OrderItemVo;
import org.apache.ibatis.annotations.Param;

public interface OrderItemBiz {
    OrderItemVo   SelectByOiid(@Param("oiid") Integer oiid);
}
package com.lz.biz.impl;

import com.lz.biz.OrderItemBiz;
import com.lz.mapper.OrderMapper;
import com.lz.model.OrderItem;
import com.lz.vo.OrderItemVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author lz
 * @create 2023-08-25 15:54
 */
@Service
public class OederItemBizImpl implements OrderItemBiz {
    @Autowired //相当于  set /get方法
    private OrderItemBiz  orderItemBiz;

    @Override
    public OrderItemVo SelectByOiid(Integer oiid) {
        return OrderItemBiz.SelectByOiid(oiid);
    }
}

3.4通过juint测试,返回结果

package com.lz.biz.impl;

import com.lz.biz.OrderBiz;
import com.lz.biz.OrderItemBiz;
import com.lz.vo.OrderItemVo;
import com.lz.vo.OrderVo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.SystemEnvironmentPropertySource;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * @author lz
 * @create 2023-08-25 15:58
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})

public class OrderBizImplTest {
     

     @Autowired
     private OrderItemBiz orderItemBiz;


    
    @Test
    public  void SelectByOiid(){
         OrderItemVo  orderItemVo= OrderItemBiz.SelectByOiid(27);
        System.out.println(orderItemVo);
        System.out.println(orderItemVo.getOrder());
    }



}

 4.多对多(举例一本书有多个类别,一个类别可以对应多本书)

4.1配置sql,以及映射

resultMap id="CategoryVo" type="com.lz.vo.CategoryVo" >
    <result  column="category_id"  property="categoryId"></result>
    <result column="category_name"  property="categoryName"></result>
    <collection property="books"  ofType="com.lz.model.HCategory">
      <result column="book_id"  property="bookId"></result>
    <result  column="book_name"  property="bookName"></result>
    <result  column="price"   property="price"></result>
    </collection>
  </resultMap>

  
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
    select 
    <include refid="Base_Column_List" />
    from t_hibernate_book_category
    where bcid = #{bcid,jdbcType=INTEGER}
  </select>

  <select id="selcetByBookId"  resultMap="HBookVo"  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 bc.cid =c.category_id
        and b.book_id= ${bid}
  </select>

  <resultMap id="HBookVo" type="com.lz.vo.HBookVo" >
    <result column="book_id"  property="bookId"></result>
    <result  column="book_name"  property="bookName"></result>
    <result  column="price"   property="price"></result>
    <collection property="categories"  ofType="com.lz.model.HCategory">
      <result  column="category_id"  property="categoryId"></result>
      <result column="category_name"  property="categoryName"></result>
    </collection>
  </resultMap>

2.创建vo来实现辅佐方法实现
 

package com.lz.vo;

import com.lz.model.HBook;
import com.lz.model.HCategory;

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

/**
 * @author lz
 * @create 2023-08-28 13:48
 */
public class CategoryVo extends HCategory {
     List<HBook>  books=new ArrayList<>();

    public List<HBook> getBooks() {
        return books;
    }

    public void setBooks(List<HBook> books) {
        this.books = books;
    }
}
package com.lz.vo;

import com.lz.model.HBook;
import com.lz.model.HCategory;

import java.util.List;

/**
 * @author lz
 * @create 2023-08-28 12:38
 */
public class HBookVo  extends HBook {
     private List<HCategory>  hCategories;

    public List<HCategory> gethCategories() {
        return hCategories;
    }

    public void sethCategories(List<HCategory> hCategories) {
        this.hCategories = hCategories;
    }
}

4.3创建接口,并且调用

package com.lz.biz;

import com.lz.vo.HBookVo;
import org.apache.ibatis.annotations.Param;

public interface HBookBiz {


     HBookVo selcetByBookId(@Param("bid") Integer bid);
}
package com.lz.biz.impl;

import com.lz.biz.HBookBiz;
import com.lz.mapper.HBookMapper;
import com.lz.vo.HBookVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author lz
 * @create 2023-08-25 15:54
 */
@Service
public class HBookBizImpl implements HBookBiz {
    @Autowired //相当于  set /get方法
    private HBookMapper  hBookMapper;


    @Override
    public HBookVo selcetByBookId(Integer bid) {
        return  HBookMapper. selcetByBookId(bid);
    }
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/941587.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(1)进程间常见的几种通信方式

文章目录 进程间的通行方式一、管道模型二、消息队列模型三、共享内存四 信号量机制五、socket 进程间的通行方式 每个进程各自有不同的用户地址空间&#xff0c;任何一个进程的全局变量在另一个进程中都看不到&#xff0c;所以进程之间要交换数据必须通过内核&#xff0c;在内…

Python“牵手”淘宝商品列表数据,关键词搜索淘宝API接口数据,淘宝API接口申请指南

淘宝平台API接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范&#xff0c;淘宝API接口是指通过编程的方式&#xff0c;让开发者能够通过HTTP协议直接访问淘宝平台的数据&#xff0c;包括商品信息、店铺信息、物流信息等&#xff0c;从而实现淘宝平台…

大数据-玩转数据-Flink 水印

一、Flink 中的水印 在Flink的流式操作中, 会涉及不同的时间概念&#xff1a; 1.1 处理时间 是指的执行操作的各个设备的时间&#xff0c;对于运行在处理时间上的流程序, 所有的基于时间的操作(比如时间窗口)都是使用的设备时钟。比如, 一个长度为1个小时的窗口将会包含设备…

去掉vue项目运行时中出现的黄色警告

最近在写vue项目时发现想测试一个接口行不行的时候&#xff0c;在控制台输出的时候发现会有很多黄色警告&#xff0c;每次都要找很久才能找到自己想输出的内容&#xff0c;如下图&#xff1a; 去掉这些只需要一句话&#xff1a; const app createApp(App) app.config.warnHa…

数据库管理-第九十九期 OCM之路(20230828)

数据库管理-第九十九期 OCM之路&#xff08;20230828&#xff09; 本周五&#xff0c;我就要在上海Oracle University的考场进行19c OCM的升级考试了。关于之前版本的OCM&#xff0c;11g OCM我是在2016年9月拿下的&#xff0c;在一年后的即2017年的9月拿下了12c OCM。所以对于我…

Spring Cloud Alibaba-Sentinel规则

1 流控规则 流量控制&#xff0c;其原理是监控应用流量的QPS(每秒查询率) 或并发线程数等指标&#xff0c;当达到指定的阈值时 对流量进行控制&#xff0c;以避免被瞬时的流量高峰冲垮&#xff0c;从而保障应用的高可用性。 第1步: 点击簇点链路&#xff0c;我们就可以看到访…

QML Book 学习基础2(基本元素控件)

目录 矩形&#xff08;Rectangle&#xff09; 文本元素 鼠标键盘交互 布局元素 矩形&#xff08;Rectangle&#xff09; 矩形项用于用纯色或渐变填充区域&#xff0c;和/或提供矩形边框。需要注意如果长宽没有设置&#xff0c;是无法看到矩形的 Rectangle {id: rect1x: 12; …

上位机采集8通道模拟量模块数据

模拟量模块和上位机的配合使用可以实现对模拟量数据的采集、传输和处理。下面是它们配合使用的一般步骤&#xff1a;1. 连接模拟量模块&#xff1a;将模拟量模块与上位机进行连接。这通常涉及将模拟量模块的输入通道与被监测的模拟信号源连接起来&#xff0c;如传感器、变送器等…

css元素定位:通过元素的标签或者元素的id、class属性定位,还不明白的伙计,看这个就行了!

前言 大部分人在使用selenium定位元素时&#xff0c;用的是xpath元素定位方式&#xff0c;因为xpath元素定位方式基本能解决定位的需求。xpath元素定位方式更直观&#xff0c;更好理解一些。 css元素定位方式往往被忽略掉了&#xff0c;其实css元素定位方式也有它的价值&…

设计模式入门笔记

1 设计模式简介 在IT这个行业&#xff0c;技术日新月异&#xff0c;可能你今年刚弄懂一个编程框架&#xff0c;明年它就不流行了。 然而即使在易变的IT世界也有很多几乎不变的知识&#xff0c;他们晦涩而重要&#xff0c;默默的将程序员划分为卓越与平庸两类。比如说&#xff…

游戏测试工程师的职业发展前景怎么样?

软件测试是一个看似入门简单&#xff0c;门槛极低&#xff0c;薪资也还不错的的行业&#xff0c;但如果你开始向这个方向发展&#xff0c;你就发现并非如此。实际情况是初级功能岗位薪资偏低&#xff0c;而且以外包公司居多&#xff0c;高级岗位薪资非常可观&#xff0c;但对技…

震动分析国标GB/T 19873.3-2019/ISO 13373-3:2015笔记

1.国家标准 1.1震动测量 现行国家标准是&#xff1a;GB/T 19873.2-2009 机器状态监测与诊断 振动状态监测 第2部分&#xff1a;振动数据处理、分析与描述 它的起草人&#xff1a; 郑州机械研究所。西安热工研究院有限公司。东南大学。 主要起草人 韩国明 、张学延 、傅行…

2023-08-28 C语言函数一定要在.h文件中声明吗

老林的C语言新课, 想快速入门点此 <C 语言编程核心突破> C语言函数一定要在.h文件中声明吗 前言一、三种情况下的函数声明与定义策略单文件小练习多文件工程需要在多个文件调用的函数不需要跨文件调用的函数 二、示例需要在多个文件调用的函数:不需要跨文件调用的函数: …

一起参与开源,志愿者招募中!IT、翻译、新媒体、设计等

Hi 同学&#xff0c;你是不是专注某个领域&#xff0c;想找机会&#xff0c;积累开源软件方面的早期经验&#xff1f;你来对地方啦。请阅读本文&#xff0c;了解为什么要加入 ONLYOFFICE&#xff0c;做出贡献&#xff0c;以及如何做到。 贡献开源&#xff0c;福利多多 为开源项…

2023全国大学生数学建模竞赛B题思路模型代码

目录 一.思路模型见文末名片&#xff0c;比赛开始9.7晚上第一时间更新 二.国赛常用算法之随机森林 3.思路获取见此 一.思路模型见文末名片&#xff0c;比赛开始9.7晚上第一时间更新 二.国赛常用算法之随机森林 # -*- coding: utf-8 -*- """ author: Administ…

自动化运维工具-----Ansible入门详解

目录 一.Ansible简介 什么是Ansible&#xff1f; Ansible的特点 Ansible的架构 二.Ansible任务执行解析 ansible任务执行模式 ansible执行流程 ansible命令执行过程 三.Ansible配置解析 ansible的安装方式 ansible的程序结构&#xff08;yum安装为例&#xff09; ansibl…

11. 排兵布阵

目录 题目 思路&#xff08;贪心快排&#xff09; 注意事项 C代码 题目 排兵布阵 Description 总所周知&#xff0c;韩信是一位神勇的军事家。某日夜幕&#xff0c;敌方突然来袭&#xff0c;韩信作为塞外将帅吹响紧急的号角。各个帐内的士兵听见号角立即集合&#xff0c;站…

Python爬虫异常处理实践:处理被封禁和网站升级问题

在这篇文章中&#xff0c;我们将一起探讨Python爬虫异常处理实践&#xff0c;特别关注处理被封禁和网站升级问题。让我们一起来看看如何解决这些问题&#xff0c;提高我们爬虫程序的稳定性和可靠性。   首先&#xff0c;我们要了解为什么会遇到这些问题。网站封禁爬虫的原因主…

(六)k8s实战-存储管理

一、Volumes 1、HostPath 【使用场景&#xff1a;容器目录 挂载到 主机目录】 【可以持久化到主机上】 将节点上的文件或目录挂载到 Pod 上&#xff0c;此时该目录会变成持久化存储目录&#xff0c;即使 Pod 被删除后重启&#xff0c;也可以重新加载到该目录&#xff0c;该目…

最小化安装移动云大云操作系统--BCLinux-for-Euler-22.10-everything-x86_64-230316版

CentOS 结束技术支持&#xff0c;转为RHEL的前置stream版本后&#xff0c;国内开源Linux服务器OS生态转向了开源龙蜥和开源欧拉两大开源社区&#xff0c;对应衍生出了一系列商用Linux服务器系统。BCLinux-for-Euler-22.10是中国移动基于开源欧拉操作系统22.03社区版本深度定制的…