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

      

目录

🥳🥳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);
    }
}

测试结果: 

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【微服务部署】一、使用docker-compose部署Jenkins、SonarQube、PostgreSQL

一、安装 1、编写docker-compose部署Postgres、SonarQube、Jenkins的yml文件jenkins-compose.yml Postgres&#xff1a;作为SonarQube的数据库存储SonarQube&#xff1a;代码质量检查Jenkins&#xff1a;jenkins/jenkins:lts镜像&#xff0c;jenkinsci/blueocean镜像缺少node…

51单片机项目(7)——基于51单片机的温湿度测量仿真

本次做的设计&#xff0c;是利用DHT11传感器&#xff0c;测量环境的温度以及湿度&#xff0c;同时具备温度报警的功能&#xff1a;利用两个按键&#xff0c;设置温度阈值的加和减&#xff0c;当所测温度大于温度阈值的时候&#xff0c;蜂鸣器就会响起&#xff0c;进行报警提示。…

C语言深入理解指针(非常详细)(二)

目录 指针运算指针-整数指针-指针指针的关系运算 野指针野指针成因指针未初始化指针越界访问指针指向的空间释放 如何规避野指针指针初始化注意指针越界指针不使用时就用NULL避免返回局部变量的地址 assert断言指针的使用和传址调用传址调用例子&#xff08;strlen函数的实现&a…

java反编译工具jd-gui使用

文章目录 一、JD-GUI介绍二、下载三、安装四、使用教程五、免责声明摘抄 一、JD-GUI介绍 JD-GUI是一个独立的图形实用程序&#xff0c;显示“.class”文件的Java源代码。 使用JD-GUI浏览重构的源代码&#xff0c;以便即时访问方法和字段。 二、下载 MAC安装包&#xff1a;ht…

链路聚合原理

文章目录 一、定义二、功能三、负载分担四、分类五、常用命令 首先可以看下思维导图&#xff0c;以便更好的理解接下来的内容。 一、定义 在网络中&#xff0c;端口聚合是一种将连接到同一台交换机的多个物理端口捆绑在一起&#xff0c;形成一个逻辑端口的技术。通过端口聚合&…

在 Spring Boot 中集成 MinIO 对象存储

MinIO 是一个开源的对象存储服务器&#xff0c;专注于高性能、分布式和兼容S3 API的存储解决方案。本文将介绍如何在 Spring Boot 应用程序中集成 MinIO&#xff0c;以便您可以轻松地将对象存储集成到您的应用中。 安装minio 拉取 minio Docker镜像 docker pull minio/minio创…

解决 .csv 文件上传到 pgsql 的字符报错问题

目录 背景问题解决办法 背景 上传 .csv 文件进行数据导入到 pg 时&#xff0c;报错显示如下&#xff1a; ods.tbl_inp_fee_detail.csv数据上传失败 报错信息:org.postgresql.util.PSQLException: ERROR: invalid byte sequence for encoding "UTF8": 0x00 Where: C…

多维时序 | Matlab实现GRU-Adaboost和GRU多变量时间序列预测对比

多维时序 | Matlab实现GRU-Adaboost和GRU多变量时间序列预测对比 目录 多维时序 | Matlab实现GRU-Adaboost和GRU多变量时间序列预测对比预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 多维时序 | Matlab实现GRU-Adaboost和GRU多变量时间序列预测对比 模型描述 M…

【python爬虫】10.指挥浏览器自动工作(selenium)

文章目录 前言selenium是什么怎么用设置浏览器引擎获取数据解析与提取数据自动操作浏览器 实操运用确认目标分析过程代码实现 本关总结 前言 上一关&#xff0c;我们认识了cookies和session。 分别学习了它们的用法&#xff0c;以及区别。 还做了一个项目&#xff1a;带着小…

Redis集群操作-----主从互换

一、将节点cluster1的主节点7000端口的redis关掉 [rootredis-cluster1 src]# ps -ef |grep redis 二、查看集群信息&#xff1a;

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

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

Centos 6.5 升级到Centos7指导手册

一、背景 某业务系统因建设较早&#xff0c;使用的OS比较过时&#xff0c;还是centos6.5的系统&#xff0c;因国产化需要&#xff0c;需将该系统升级到BClinux 8.6&#xff0c;但官方显示不支持centos 6.x升级到8&#xff0c;需先将centos6.5升级到centos7的最新版&#xff0c…

ZDH-权限模块

本次介绍基于ZDH v5.1.2版本 目录 项目源码 预览地址 安装包下载地址 ZDH权限模块 ZDH权限模块-重要名词划分 ZDH权限模块-菜单管理 ZDH权限模块-角色管理 ZDH权限模块-用户配置 ZDH权限模块-权限申请 项目源码 zdh_web: GitHub - zhaoyachao/zdh_web: 大数据采集,抽…

高频面试题:如何分别用三种姿势实现三个线程交替打印0到100

最近面试遇到的一道题&#xff0c;需要三个线程交替打印0-100&#xff0c;当时对多线程并不是很熟悉因此没怎么写出来&#xff0c;网上搜了之后得到现 synchronized wait/notifyAll 实现思路&#xff1a;判断当前打印数字和线程数的取余&#xff0c;不等于当前线程则处于等待…

ORB-SLAM3复现过程中遇到的问题及解决办法

在复现过程中遇到的问题的解决过程 1. 版本检查1.1 Opencv版本的检测1.2 Eigen版本的检测1.3 查看Python版本1.4 其他 2. 编译过程中遇到的问题及解决办法2.1 ./build.sh遇到的问题2.2 ./build_ros.sh遇到的问题 因为环境比较干净&#xff0c;所以遇到的问题相对少一些&#xf…

多线程的五种“打开”方式

1 概念 1.1 线程是什么&#xff1f;&#xff1f; 线程&#xff08;Thread&#xff09;是计算机科学中的一个基本概念&#xff0c;它是进程&#xff08;Process&#xff09;中的一个执行单元&#xff0c;负责执行程序的指令序列。线程是操作系统能够进行调度和执行的最小单位。…

MariaDB数据库服务器

目录 一、什么是数据库&#xff1f; 二、什么是关系型数据库&#xff1f; 三、数据库字符集和排序规则是什么&#xff1f; 四、常用数据类型 五、Mariadb数据库相关配置案例 一、什么是数据库&#xff1f; 数据库&#xff08;DB&#xff09;是以一定方式长期存储在计算机硬盘内…

PHP8内置函数中的数学函数-PHP8知识详解

php8中提供了大量的内置函数&#xff0c;以便程序员直接使用常见的内置函数包括数学函数、变量函数、字符串函数、时间和日期函数等。今天介绍内置函数中的数学函数。 本文讲到了数学函数中的随机数函数rand()、舍去法取整函数floor()、向上取整函数 ceil()、对浮点数进行四舍…

1.频偏估计算法

目录 整数倍频偏估计方法 小数倍频偏估计方法 使用CP进行频偏估计 使用SSB进行频偏估计 OFDM对频偏比较敏感&#xff0c;频偏会影响子载波的正交性&#xff0c;造成载波间干扰。频偏对PRACH相关计算峰值的影响本质上是子载波间干扰导致的。时域检测&#xff1a;首先对接收…

聚合多个电商API接口平台

API接口测试&#xff08;点击免费测试&#xff09; 随着数字化商业时代的到来&#xff0c;API接口已成为电商资源连接利器&#xff0c;也是全球传统互联网企业转型的基础。 2021年 Google Cloud 研究显示&#xff0c;全球互联网企业近3/4的企业持续投入数字化转型&#xff0c…