学会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 {@Autowiredprivate HOrderItemMapper horderItemMapper;@Overridepublic 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 {@Autowiredprivate HOrderItemBiz horderItemBiz;@Testpublic 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.oidand 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 {@Autowiredprivate HOrderMapper hOrderMapper;@Overridepublic 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 {@Autowiredprivate HOrderBiz hOrderBiz;@Testpublic 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*
FROMt_hibernate_book b,t_hibernate_book_category bc,t_hibernate_category c
WHEREb.book_id = bc.bidAND bc.cid = c.category_idAND 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 {@Autowiredprivate HBookMapper hBookMapper;@Overridepublic 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 {@Autowiredprivate HBookBiz hBookBiz;@Testpublic void selectByBid() {HbookVo hbookVo = hBookBiz.selectByBid(8);System.out.println(hbookVo);hbookVo.getHcategory().forEach(System.out::println);}
}

测试结果: 

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安防监控视频平台EasyCVR视频汇聚平台定制项目增加AI智能算法详细介绍

安防视频集中存储EasyCVR视频汇聚平台&#xff0c;可支持海量视频的轻量化接入与汇聚管理。平台能提供视频存储磁盘阵列、视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联、H.265自动转码等功能。为了便…

Java 中数据结构LinkedList的用法

LinkList 链表&#xff08;Linked list&#xff09;是一种常见的基础数据结构&#xff0c;是一种线性表&#xff0c;但是并不会按线性的顺序存储数据&#xff0c;而是在每一个节点里存到下一个节点的地址。 链表可分为单向链表和双向链表。 一个单向链表包含两个值: 当前节点…

react css 污染解决方法

上代码 .m-nav-bar {background: #171a21;.content {height: 104px;margin: 0px auto;} }import React from "react"; import styles from ./css.module.scssexport default class NavBar extends React.Component<any, any> {constructor (props: any) {supe…

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

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

ZigBee案例笔记 -- RFID卡片读写(模拟饭卡)

RFID模拟饭卡应用 RFID&#xff08;射频识别技术&#xff09;RFID通讯协议RFID发展历史RFID操作流程说明RFID卡片读写流程RFID寻卡RFID防碰撞RFID选卡RFID卡密验证RFID读卡RFID写卡读写数据流程 RFID饭卡模拟案例驱动代码串口协议饭卡操作案例结果优化建议 RFID&#xff08;射频…

前端需要理解的工程化知识

1 Git 1.1 Git 常见工作流程 Git 有4个区域&#xff1a;工作区&#xff08;workspace)、index&#xff08;暂存区&#xff09;、repository&#xff08;本地仓库&#xff09;和remote&#xff08;远程仓库&#xff09;&#xff0c;而工作区就是指对文件发生更改的地方&#xff…

MySQL中的索引事务(2)事务----》数据库运行的原理知识+面试题~

本篇文章建议读者结合&#xff1a;MySQL中的索引事务&#xff08;1&#xff09;索引----》数据库运行的原理知识面试题~_念君思宁的博客-CSDN博客此时&#xff0c;如果你根据name来查询&#xff0c;查到叶子节点得到的只是主键id&#xff0c;还需要通过主键id去主键的B树里面在…

Jmeter性能压测 —— 高并发思路

测试场景&#xff1a;模拟双11&#xff0c;百万级的订单量一个物流信息的查询接口。 条件&#xff1a;接口响应时间<150ms以内。10万并发量每秒。 设计性能测试方案 1、生产环境 ①10W/S--并发量&#xff08;架构师/技术负责人提供&#xff09; ②20台机器&#xff08;…

leetcode645. 错误的集合(java)

错误的集合 题目描述优化空间代码演示 题目描述 难度 - 简单 LC645 - 错误的集合 集合 s 包含从 1 到 n 的整数。不幸的是&#xff0c;因为数据错误&#xff0c;导致集合里面某一个数字复制了成了集合里面的另外一个数字的值&#xff0c;导致集合 丢失了一个数字 并且 有一个数…

chatgpt谈论日本排放污水事件

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 近日&#xff0c;世界发生了让人义愤填膺的时间——日本排放核污水。这件事情是那么的突然且不计后果&#xff0c;海洋是我们全人类共同的财产&#xff0c;而日本却想用自己一己私欲将全人类的安全置之度外&#xff0c…

C语言——指针基本语法

概述 内存地址 在计算机内存中&#xff0c;每个存储单元都有一个唯一的地址(内存编号)。 通俗理解&#xff0c;内存就是房间&#xff0c;地址就是门牌号 指针和指针变量 指针&#xff08;Pointer&#xff09;是一种特殊的变量类型&#xff0c;它用于存储内存地址。 指针的实…

python3.11教程2:基础数据类型(数字和字符串)、组合数据类型(集合、元组、列表、字典)

文章目录 五、基本数据类型5.1 整数和浮点数5.1.1 整数和浮点数的类型5.1.2 进制和进制转换5.1.3 round函数 5.2 运算符5.2.1 常用运算符、运算符函数和逻辑运算符5.2.2 位运算符5.2.3 运算符的优先级及其进阶使用5.2.4 海象运算符: 5.3 布尔类型5.4 字符串5.4.1 字符串的基本操…