学会Mybatis框架:让你的开发事半功倍【五.Mybatis关系映射】

news2024/11/28 4:53:18

      

目录

🥳🥳Welcome Huihui's Code World ! !🥳🥳

导语

一、一对一的关系映射

1.表结构

2.resultMap配置

3.测试关系映射

二、一对多的关系映射

1.表结构

2.resultMap配置

3.测试关系映射

三、多对多的关系映射 

1.表结构

​编辑

2.resultMap配置

3.测试关系映射


🥳🥳Welcome Huihui's Code World ! !🥳🥳

接下来看看由辉辉所写的关于Mybatis的相关操作吧


导语

        在实际开发中,对数据库的操作常常会涉及到多张表,针对多表之间的操作,MyBatis 提供了关联映射,通过关联映射可以很好地处理表与表、对象与对象之间的关联关系。

在关系型数据库中,表与表之间存在着三种关联映射关系,分别为一对一关系、一对多关系和多对多关系

  • 一对一的关系:就是在本类中定义对方类型的对象,如A类中定义B类类型的属性b,B类中定义A类类型的属性a。
  • 一对多的关系:就是一个A类类型对应多个B类类型的情况,需要在A类中以集合的方式引入B类类型的对象,在B类中定义A类类型的属性a。
  • 多对多的关系:在A类中定义B类类型的集合,在B类中定义A类类型的集合。

调节数据库字段与实体类的属性对应需要标签resultMap,就可以这样写:

<resultMap id="empResultMap" type="Emp">
    <id property="empId" column="emp_id"></id>
    <result property="empName" column="emp_name"></result>
    <result property="age" column="age"></result>
    <result property="gender" column="gender"></result>
</resultMap>
 
    <select id="getEmpById" resultMap="empResultMap">
        select * from t_emp where emp_id = #{empId};
    </select>

属性:

  • id:表示自定义映射的唯一标识
  • type:查询的数据要映射的实体类的类型

子标签:

  • id:设置主键的映射关系
  • result:设置普通字段的映射关系
  • association :设置多对一的映射关系
  • collection:设置一对多的映射关系

属性:

  • property:设置映射关系中实体类中的属性名
  • column:设置映射关系中表中的字段名


一、一对一的关系映射

1.表结构

这里需要建一个VO类,VO是Value Object的缩写,是一种轻量级的数据结构,用于在视图层与业务逻辑层之间传递数据。VO通常用于表示视图层所需的数据,这些数据来自于业务逻辑层或数据访问层。VO的主要目的是将业务逻辑层的数据结构转换为视图层可以使用的数据结构 。简单来说就是用于关系映射时的结果接收。

下面我们利用订单项以及订单来描述一对一的关系,所以我们建立一个OrderitemVo。

package com.wh.vo;

import com.wh.model.HOrder;
import com.wh.model.HOrderItem;

/**
 * @author 王辉
 * @site www.shihuihuila.com
 * @create 2023-09-03 17:15
 */

public class OrderitemVo extends HOrderItem {
    private HOrder order;

    public HOrder getOrder() {
        return order;
    }

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

2.resultMap配置

<resultMap id="OrderitemvoMap" type="com.wh.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.wh.model.HOrder">
      <result column="order_id" property="orderId"></result>
      <result column="order_no" property="orderNo"></result>
    </association>
  </resultMap>

  <select id="selectByOiid" resultMap="OrderitemvoMap" parameterType="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>

3.测试关系映射

HOrderItemMapper

package com.wh.mapper;

import com.wh.model.HOrderItem;
import com.wh.vo.OrderitemVo;
import org.springframework.stereotype.Repository;

@Repository
public interface HOrderItemMapper {
   
    OrderitemVo selectByOiid(Integer bid);

}

HOrderItemBiz

package com.wh.biz;

import com.wh.vo.OrderitemVo;

/**
 * @author 王辉
 * @site www.shihuihuila.com
 * @create 2023-09-03 17:41
 */
public interface HOrderItemBiz {
    OrderitemVo selectByOiid(Integer bid);
}

HOrderItemBizImpl 

package com.wh.biz;

import com.wh.mapper.HOrderItemMapper;
import com.wh.vo.OrderitemVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author 王辉
 * @site www.shihuihuila.com
 * @create 2023-09-03 17:41
 */
@Service
public class HOrderItemBizImpl implements HOrderItemBiz {
    @Autowired
    private HOrderItemMapper horderItemMapper;
    @Override
    public OrderitemVo selectByOiid(Integer bid) {
        return horderItemMapper.selectByOiid(bid);
    }
}

 junit测试类

package com.wh.biz;

import com.wh.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 王辉
 * @site www.shihuihuila.com
 * @create 2023-09-03 17:43
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:Spring-context.xml"})
public class HOrderItemBizImplTest {
    @Autowired
    private HOrderItemBiz horderItemBiz;

    @Test
    public void selectByOiid() {
        OrderitemVo orderitemVo = horderItemBiz.selectByOiid(27);
        System.out.println(orderitemVo);
        System.out.println(orderitemVo.getOrder());
    }
}

测试结果: 

二、一对多的关系映射

1.表结构

下面我们利用订单以及订单项来描述一对多的关系,所以我们建立一个OrderVo。

package com.wh.vo;

import com.wh.model.HOrder;
import com.wh.model.HOrderItem;

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

/**
 * @author 王辉
 * @site www.shihuihuila.com
 * @create 2023-08-26 16:41
 */
public class OrderVo extends HOrder {
    private List<HOrderItem> horderItems=new ArrayList<>();

    public List<HOrderItem> getHorderItems() {
        return horderItems;
    }

    public void setHorderItems(List<HOrderItem> horderItems) {
        this.horderItems = horderItems;
    }
}

2.resultMap配置

 <resultMap id="OrderMap" type="com.wh.vo.OrderVo" >
    <result column="order_id" property="orderId"></result>
    <result column="order_no" property="orderNo"></result>
    <collection property="orderitems" ofType="com.wh.model.HOrderItem">
      <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="OrderMap" 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>

3.测试关系映射

HOrderMapper

package com.wh.mapper;

import com.wh.model.HOrder;
import com.wh.vo.OrderVo;
import org.springframework.stereotype.Repository;

@Repository
public interface HOrderMapper {
    
     OrderVo selectbyOid(Integer boid);

}

 HOrderBiz

package com.wh.biz;

import com.wh.vo.OrderVo;


public interface HOrderBiz {
    OrderVo selectbyOid(Integer boid);
}

HOrderBizImpl

package com.wh.biz;

import com.wh.mapper.HOrderMapper;
import com.wh.vo.OrderVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author 王辉
 * @site www.shihuihuila.com
 * @create 2023-08-26 16:55
 */
@Service
public class HOrderBizImpl implements HOrderBiz {
    @Autowired
    private HOrderMapper hOrderMapper;

    @Override
    public OrderVo selectbyOid(Integer boid) {
        return hOrderMapper.selectbyOid(boid);
    }
}

junit测试类 

package com.wh.biz;

import com.wh.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 王辉
 * @site www.shihuihuila.com
 * @create 2023-08-26 16:59
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:Spring-context.xml"})
public class HOrderBizImplTest {
    @Autowired
    private HOrderBiz hOrderBiz;

    @Test
    public void selectbyOid() {
        OrderVo orderVO = hOrderBiz.selectbyOid(7);
        System.out.println(orderVO);
        orderVO.getHorderItems().forEach(System.out::println);
    }
}

测试结果: 

三、多对多的关系映射 

1.表结构

我们以书籍有多个类别以及每个类别又有多本书的这种关系来实操多对多关系的查询

public class HbookVo  extends HBook {
    private List<HCategory> hcategory;
 
    public List<HCategory> getHcategory() {
        return hcategory;
    }
 
    public void setHcategory(List<HCategory> hcategory) {
        this.hcategory = hcategory;
    }
}

2.resultMap配置

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

  <select id="selectByBid" resultMap="HbookVo" parameterType="java.lang.Integer">
    SELECT
	*
FROM
	t_hibernate_book b,
	t_hibernate_book_category bc,
	t_hibernate_category c
WHERE
	b.book_id = bc.bid
	AND bc.cid = c.category_id
	AND b.book_id =#{bid}
  </select>

3.测试关系映射

HBookMapper

package com.wh.mapper;

import com.wh.model.HBook;
import com.wh.vo.HbookVo;
import org.springframework.stereotype.Repository;

@Repository
public interface HBookMapper {
   
    HbookVo selectByBid(Integer bid);

}

 HBookBiz

package com.wh.biz;

import com.wh.vo.HbookVo;

/**
 * @author 王辉
 * @site www.shihuihuila.com
 * @create 2023-09-03 18:41
 */
public interface HBookBiz {
    HbookVo selectByBid(Integer bid);
}

HBookBizImpl

package com.wh.biz;

import com.wh.mapper.HBookMapper;
import com.wh.vo.HbookVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author 王辉
 * @site www.shihuihuila.com
 * @create 2023-09-03 18:41
 */
@Service
public class HBookBizImpl implements HBookBiz {
    @Autowired
    private HBookMapper hBookMapper;

    @Override
    public HbookVo selectByBid(Integer bid) {
        return hBookMapper.selectByBid(bid);
    }
}

junit测试类

 

package com.wh.biz;

import com.wh.vo.HbookVo;
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 王辉
 * @site www.shihuihuila.com
 * @create 2023-09-03 18:42
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:Spring-context.xml"})
public class HBookBizImplTest {
    @Autowired
    private HBookBiz hBookBiz;

    @Test
    public void selectByBid() {
        HbookVo hbookVo = hBookBiz.selectByBid(8);
        System.out.println(hbookVo);
        hbookVo.getHcategory().forEach(System.out::println);
    }
}

测试结果: 

 好啦,今天的分享就到这了,希望能够帮到你呢!😊😊  

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

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

相关文章

一文讲通嵌入式现状

近年来&#xff0c;随着计算机技术和集成电路技术的迅速发展&#xff0c;嵌入式技术在通讯、网络、工控、医疗、电子等领域日益普及&#xff0c;并发挥着越来越重要的作用。嵌入式系统已成为当前最为热门和前景广阔的IT应用领域之一。 随着信息化、智能化、网络化的不断推进&am…

基于Citespace、vosviewer、R语言的文献计量学可视化分析技术及全流程文献可视化SCI论文高效写作

文献计量学是指用数学和统计学的方法&#xff0c;定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体&#xff0c;注重量化的综合性知识体系。特别是&#xff0c;信息可视化技术手段和方法的运用&#xff0c;可直观的展示主题的研究发展历程、研究现状、研究…

ARM DIY(七)麦克风调试

前言 上篇文章介绍了扬声器调试&#xff0c;今天介绍下麦克风调试。 硬件 焊接&#xff1a;咪头、电阻、电容 驱动 && 应用程序 音频调试时已完成&#xff0c;参考上篇文章 测试 使能 mic1 # ./amixer -c 0 cset numid12 2 numid12,ifaceMIXER,nameMic1 Captu…

【杂言】写在研究生开学季

这两天搬进了深研院的宿舍&#xff0c;比中南的本科宿舍好很多&#xff0c;所以个人还算满意。受台风 “苏拉” 的影响&#xff0c;原本的迎新计划全部打乱&#xff0c;导致我现在都还没报道。刚开学的半个月将被各类讲座、体检以及入学教育等活动占满&#xff0c;之后又是比较…

【数据结构篇】线性表1 --- 顺序表、链表 (万字详解!!)

前言&#xff1a;这篇博客我们重点讲 线性表中的顺序表、链表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列... 线性表在逻辑上是…

【learnopengl】Assimp构建与编译

文章目录 【learnopengl】Assimp构建与编译1 前言2 Assimp构建与编译2.1 下载源码2.2 CMake构建2.3 VS2022编译 3 在VS中配置Assimp库4 验证 【learnopengl】Assimp构建与编译 1 前言 最近在跟着LearnOpenGL这个网站学习OpenGL&#xff0c;这篇文章详细记录一下教程中关于Ass…

vue的第3篇 第一个vue程序

一 vue的mvvm实践者 1.1 介绍 Model&#xff1a;模型层&#xff0c; 在这里表示JavaScript对象 View&#xff1a;视图层&#xff0c; 在这里表示DOM(HTML操作的元素) ViewModel&#xff1a;连接视图和数据的中间件&#xff0c; Vue.js就是MVVM中的View Model层的实现者 在M…

SpringBoot复习:(60)文件上传的自动配置类MultipartAutoConfiguration

可以看到&#xff0c;定义了一个类型为StandartServletMultipartResolver的bean 用来进行文件上传&#xff0c;定义了一个类型为MultipartConfigElement的bean用来进行上传相关的配置&#xff0c;其中使用了MultipartProperties中的属性&#xff0c;这个类的定义如下&#xff1…

【Day-27满就是快】代码随想录-二叉树-二叉树的最大深度

给定一个二叉树&#xff0c;找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 ———————————————————————————————————— 1. 递归法 可以使用前序和后序遍历。前序就是…

Linux Day12 ---进程间通信

一、管道 1.1 有名管道 有名管道可以在任意两个进程之间通信 1.1.1 有名管道的创建&#xff1a; 命令创建&#xff1a; mkfifo 管道名 系统调用创建 1.1.2 与普通文件区别 打开管道文件&#xff0c;在内存分配一块空间&#xff0c;往管道文件里面写数据&#xff0c;实际是…

产品思维用户思维

用户思维是一种关注用户需求、体验和价值的思维方式,将用户放在产品设计、开发和提供服务的核心位置。它强调了理解用户在不同场景下的需求,提供与之相匹配的解决方案,从而帮助用户实现他们的目标。 描述一个用户时,可以从不同角度来考虑: 按人口属性描述用户: 个人属性…

【python】reshape的使用

import numpy as np x np.array([1,2,3]) print(fx.shape{x.shape}) print(fx.reshape((1,-1)){x.reshape((1,-1))}) print(fx.reshape(3,){x.reshape(3,)}) print(fx.reshape(3,1)\n{x.reshape(3,1)}) print(fx[:,np.newaxis]\n{x[:,np.newaxis]})

IDEA中Run/Debug Configurations添加VM options和Program arguments

1. 现象描述 我在我的IDEA当中打开配置模板后&#xff0c;发现没有VM options和Program arguments&#xff0c;也就是虚拟机选项和程序实参这两项&#xff0c;导致我不能配置系统属性参数和命令行参数&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff0…

Navicat连接数据库报2003错误解决办法

是防火墙还没有开启 查看防火墙管理的端口 设置3306防火墙开启&#xff0c;重载防火墙 连接成功

java实现粤语歌曲0243填词法

粤语歌曲填词法 一、前言 转化成数字歌。对每个音符&#xff0c;提供配合广东话声调的字&#xff0c;选出成为歌词。可以在网上创作&#xff0c;或下载到自己电脑中使用。 简谱 3656536&#xff0c;歌词 落花满天蔽月光。 唱起来配合乐曲音调。这叫做‘叶韵’&#xff0c;又叫…

基于Open3D的点云处理17-Open3d的C++版本

参考&#xff1a; http://www.open3d.org/docs/latest/cpp_api.htmlhttp://www.open3d.org/docs/latest/getting_started.html#chttp://www.open3d.org/docs/release/cpp_project.html#cplusplus-example-projecthttps://github.com/isl-org/open3d-cmake-find-packagehttps:/…

数学建模:相关性分析

&#x1f506; 文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 数学建模&#xff1a;相关性分析 文章目录 数学建模&#xff1a;相关性分析相关性分析两变量的相关分析PearsonSpearmanKendall tua-b 双变量关系强度测量的指标相关系数的性质代码实现example偏相关分析 相…

vmware虚拟机(ubuntu)远程开发golang、python环境安装

目录 1. 下载vmware2. 下载ubuntu镜像3. 安装4. 做一些设置4.1 分辨率设置4.2 语言下载4.3 输入法设置4.4 时区设置 5. 直接切换管理员权限6. 网络6.1 看ip6.2 ssh 7. 本地编译器连接远程服务器7.1 创建远程部署的配置7.2 文件同步7.3 远程启动项目 8. ubuntu安装golang环境8.1…

2023 AZ900备考

文章目录 如何学习最近准备考AZ900考试&#xff0c;找了一圈文档&#xff0c;结果发现看那么多文档&#xff0c;不如直接看官方的教程https://learn.microsoft.com/zh-cn/certifications/exams/az-900/ &#xff0c;简单直接&#xff0c;突然想到纳瓦尔宝典中提到多花时间进行思…

JUC并发编程--------CAS、Atomic原子操作

什么是原子操作&#xff1f;如何实现原子操作&#xff1f; 什么是原子性&#xff1f; 事务的一大特性就是原子性&#xff08;事务具有ACID四大特性&#xff09;&#xff0c;一个事务包含多个操作&#xff0c;这些操作要么全部执行&#xff0c;要么全都不执行 并发里的原子性…