Mybatis的关联关系映射以及自定义resultMap三种映射关系

目录

经典面试题:

一,关联关系映射

二,具体步骤:

总结


前言:

今天我们来学习Mybatis的关联关系映射以及自定义resultMap三种映射关系,希望这篇博客可以帮助大家的学习工作!!!

 

经典面试题:

问 :在Mybatis中的表之间的关系是如何映射处理的?

答:

在MyBatis中,表与表之间的关系主要通过两种方式进行映射:一对一(One-to-One)和一对多(One-to-Many)关系。

对于一对一关系,可以使用两个表之间的外键进行映射。在MyBatis的映射文件中,可以使用<resultMap>标签定义一个结果映射对象,并使用<association>标签进行关联映射。

对于一对多关系,可以使用一个表的外键与另一个表的主键进行映射。在MyBatis的映射文件中,可以使用<resultMap>标签定义一个结果映射对象,并使用<collection>标签进行集合映射。

需要注意的是,在映射文件中,可以使用<resultMap>标签来定义表字段与Java对象属性之间的映射关系。

准备:将具有一对一,一对多的表导入mysqll数据库中去。

一,关联关系映射

关联关系映射在Mybatis中主要通过三种方式实现:一对一关联和一对多关联及多对多关联。

一,一对一

例如:一个用户(User)与一个地址(Address)之间的关系。

二,一对多

例如: 订单表的id对应多个订单详情表

三,多对多

例如:一本书对应多种类型,一种类型对应多本书

二,具体步骤:

一,一对一

2.1创建名为 t_hibernate_book (书籍表) 数据表

创建名为 t_hibernate_book_category (书籍类别表) 数据表 

其中名为 bid 的属性字段为 t_hibernate_book (书籍表) 的 bid(主键) 的外键

其中名为 cid 的属性字段为 t_hibernate_category (类别表) 的 category_id (主键) 的外键

创建名为 t_hibernate_category (类别表) 数据表 

 

t_hibernate_order (订单表) 数据表

 t_hibernate_order_item (订单详情表) 数据表

修改 generatorConfig.xml 的配置文件 

 

代码:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
<generatorConfiguration><!-- 引入配置文件 --><properties resource="jdbc.properties"/><!--指定数据库jdbc驱动jar包的位置--><classPathEntry location="D:\\temp\\mvn_repository\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/><!-- 一个数据库一个context --><context id="infoGuardian"><!-- 注释 --><commentGenerator><property name="suppressAllComments" value="true"/><!-- 是否取消注释 --><property name="suppressDate" value="true"/> <!-- 是否生成注释代时间戳 --></commentGenerator><!-- jdbc连接 --><jdbcConnection driverClass="${jdbc.driver}"connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/><!-- 类型转换 --><javaTypeResolver><!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) --><property name="forceBigDecimals" value="false"/></javaTypeResolver><!-- 01 指定javaBean生成的位置 --><!-- targetPackage:指定生成的model生成所在的包名 --><!-- targetProject:指定在该项目下所在的路径  --><javaModelGenerator targetPackage="com.CloudJun.model"targetProject="src/main/java"><!-- 是否允许子包,即targetPackage.schemaName.tableName --><property name="enableSubPackages" value="false"/><!-- 是否对model添加构造函数 --><property name="constructorBased" value="true"/><!-- 是否针对string类型的字段在set的时候进行trim调用 --><property name="trimStrings" value="false"/><!-- 建立的Model对象是否 不可改变  即生成的Model对象不会有 setter方法,只有构造方法 --><property name="immutable" value="false"/></javaModelGenerator><!-- 02 指定sql映射文件生成的位置 --><sqlMapGenerator targetPackage="com.CloudJun.mapper"targetProject="src/main/java"><!-- 是否允许子包,即targetPackage.schemaName.tableName --><property name="enableSubPackages" value="false"/></sqlMapGenerator><!-- 03 生成XxxMapper接口 --><!-- type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象 --><!-- type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象 --><!-- type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口 --><javaClientGenerator targetPackage="com.CloudJun.mapper"targetProject="src/main/java" type="XMLMAPPER"><!-- 是否在当前路径下新加一层schema,false路径com.oop.eksp.user.model, true:com.oop.eksp.user.model.[schemaName] --><property name="enableSubPackages" value="false"/></javaClientGenerator><!-- 配置表信息 --><!-- schema即为数据库名 --><!-- tableName为对应的数据库表 --><!-- domainObjectName是要生成的实体类 --><!-- enable*ByExample是否生成 example类 --><!--<table schema="" tableName="t_book" domainObjectName="Book"--><!--enableCountByExample="false" enableDeleteByExample="false"--><!--enableSelectByExample="false" enableUpdateByExample="false">--><!--&lt;!&ndash; 忽略列,不生成bean 字段 &ndash;&gt;--><!--&lt;!&ndash; <ignoreColumn column="FRED" /> &ndash;&gt;--><!--&lt;!&ndash; 指定列的java数据类型 &ndash;&gt;--><!--&lt;!&ndash; <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> &ndash;&gt;--><!--</table>--><table schema="" tableName="t_hibernate_book" domainObjectName="HBook"enableCountByExample="false" enableDeleteByExample="false"enableSelectByExample="false" enableUpdateByExample="false"></table><table schema="" tableName="t_hibernate_category" domainObjectName="Category"enableCountByExample="false" enableDeleteByExample="false"enableSelectByExample="false" enableUpdateByExample="false"></table><table schema="" tableName="t_hibernate_book_category" domainObjectName="HBookCategory"enableCountByExample="false" enableDeleteByExample="false"enableSelectByExample="false" enableUpdateByExample="false"></table><table schema="" tableName="t_hibernate_order" domainObjectName="Order"enableCountByExample="false" enableDeleteByExample="false"enableSelectByExample="false" enableUpdateByExample="false"></table><table schema="" tableName="t_hibernate_order_item" domainObjectName="OrderItem"enableCountByExample="false" enableDeleteByExample="false"enableSelectByExample="false" enableUpdateByExample="false"></table></context>
</generatorConfiguration>

自动生成实体

创建一个 名为 OrderItemVo 的类,继承OrderItem类,及属性有Order对象

<!--  resultMap的映射--><resultMap id="OrderVoMap" type="com.lya.vo.OrderVo" ><result column="order_id" property="orderId"></result><result column="order_no" property="orderNo"></result><!--    一个对应多个--><collection property="orderItems" ofType="com.lya.model.OrderItem"><result column="order_id" property="orderId"></result><result column="order_no" property="orderNo"></result><result column="order_id" property="orderId"></result><result column="order_no" property="orderNo"></result></collection></resultMap><select id="byoid" resultMap=" " parameterType="java.lang.Integer" >select * from t_hibernate_order o ,t_hibernate_order_item ot where o.order_id = ot.oidand o.order_id = #{oid}</select>

在自动生成的 OrderItemMapper 接口中进行增加以下代码

 OrderItemVo selectByBiid(@Param("oiid") Integer oiid);

 

创建一个接口名为 : OrderItemBiz 接口

package com.lya.biz;import com.lya.vo.OrderItemVo;/*** @author 程序猿-小李哥* @site www.xiaolige.com* @company 猪八戒有限集团* @create 2023-09-04-9:38*/
public interface OrderItemBiz {OrderItemVo selectByBiid(Integer oiid);}

创建一个实现了名为 OrderItemBizImpl 

package com.lya.biz.impl;import com.lya.biz.OrderItemBiz;
import com.lya.mapper.OrderItemMapper;
import com.lya.model.OrderItem;
import com.lya.vo.OrderItemVo;
import org.springframework.beans.factory.annotation.Autowired;/*** @author 程序猿-小李哥* @site www.xiaolige.com* @company 猪八戒有限集团* @create 2023-09-04-9:40*/
public class OrderItemBizImpl implements OrderItemBiz {@Autowiredprivate OrderItemMapper orderItemMapper;@Overridepublic OrderItemVo selectByBiid(Integer oiid) {return orderItemMapper.selectByBiid(oiid);}
}

测试:

 

二,一对多

创建一个 名为 OrdeVo 的类,继承Order

package com.lya.vo;import com.lya.model.Order;
import com.lya.model.OrderItem;import java.util.ArrayList;
import java.util.List;/*** @author 程序猿-小李哥* @site www.xiaolige.com* @company 猪八戒有限集团* @create 2023-08-26-16:57*/
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;}
}

在自动生成的 OrderMapper.xml 配置文件中增加以下配置

  <resultMap id="OrderVoMap" type="com.lya.vo.OrderVo"><result column="order_id" property="orderId" ></result><result column="order_no" property="orderNo" ></result><collection property="orderItems" ofType="com.lya.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><select id="selectByOid" resultMap="OrderVoMap" parameterType="java.lang.Integer" >SELECT * FROMt_hibernate_order o ,t_hibernate_order_item oiWHERE o.order_id = oi.oidAND o.order_id = #{oid}</select>

在自动生成的 OrderMapper接口中进行增加以下代码

OrderVo selectByOid(@Param("oid") Integer oid);

创建一个接口名为 : OrderBiz 接口

package com.lya.biz;import com.lya.vo.OrderVo;/*** @author 程序猿-小李哥* @site www.xiaolige.com* @company 猪八戒有限集团* @create 2023-09-04-10:04*/
public interface OrderBiz {OrderVo selectByOid(Integer oid);
}

创建一个实现类,名为 OrderBizImpl 

package com.lya.biz.impl;import com.lya.biz.OrderBiz;
import com.lya.mapper.OrderMapper;
import com.lya.vo.OrderVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** @author 程序猿-小李哥* @site www.xiaolige.com* @company 猪八戒有限集团* @create 2023-09-04-10:05*/
@Service
public class OrderBizImpl implements OrderBiz {@Autowiredprivate OrderMapper orderMapper;@Overridepublic OrderVo selectByOid(Integer oid) {return orderMapper.selectByOid(oid);}
}

测试:

    @Autowiredprivate OrderBiz orderBiz;@Testpublic void selectByOid() {OrderVo orderVo = orderBiz.selectByOid(7);System.out.println(orderVo);orderVo.getOrderItems().forEach(System.out::println);}

三,多对多

在自动生成的 HBookMapper.xml 配置文件中增加以下配置

  <resultMap id="HBookVoMap" type="com.lya.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.lya.model.Category"><result column="category_id" property="categoryId"></result><result column="category_name" property="categoryName"></result></collection></resultMap><select id="selectByBookId" resultMap="HBookVoMap" parameterType="java.lang.Integer" >SELECT * FROMt_hibernate_book b,t_hibernate_book_category bc ,t_hibernate_category cWHERE b.book_id = bc.bidAND bc.cid = c.category_idAND b.book_id = #{bid}</select>

在自动生成的 HBookMapper 接口 中增加以下方法

  HBookVo selectByBookId(@Param("bid") Integer bid);

创建一个接口名为 HBookBiz 

package com.lya.biz;import com.lya.vo.HBookVo;
import org.apache.ibatis.annotations.Param;/*** @author 程序猿-小李哥* @site www.xiaolige.com* @company 猪八戒有限集团* @create 2023-09-04-10:13*/
public interface HBookBiz {HBookVo selectByBookId(@Param("bid") Integer bid);}

创建一个实现类,名为 HBookBizImpl 

package com.lya.biz.impl;import com.lya.biz.HBookBiz;
import com.lya.mapper.HBookMapper;
import com.lya.vo.HBookVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** @author 程序猿-小李哥* @site www.xiaolige.com* @company 猪八戒有限集团* @create 2023-09-04-10:13*/
@Service
public class HBookBizImpl implements HBookBiz {@Autowiredprivate HBookMapper hBookMapper;@Overridepublic HBookVo selectByBookId(Integer bid) {return hBookMapper.selectByBookId(bid);}
}

测试

    @Autowiredprivate HBookBiz hbookBiz;@Testpublic void selectByBookId() {HBookVo hBookVo = hbookBiz.selectByBookId(8);System.out.println(hBookVo);hBookVo.getCategories().forEach(System.out::println);}

总结

学习Mybatis的关联关系映射可以带来以下收获和认识:

1. 数据库关系的抽象:学习MyBatis的关联关系映射可以有助于我们理解数据库中表与表之间的关系,如一对一和一对多关系。这可以提升我们对数据模型的理解和设计能力。

2. 对象关系映射(ORM)的学习:MyBatis采用了ORM的思想,通过映射配置将数据库表与Java对象进行关联。学习MyBatis的关联关系映射可以帮助我们掌握ORM的基本原理和实践技巧。

3. 数据库操作的灵活性:MyBatis的关联关系映射使得数据库操作更加灵活,能够方便地进行多表查询或关联查询。这有助于我们优化数据库访问性能,并提供更好的数据查询和操作能力。

4. 代码重用和维护性:通过MyBatis的关联关系映射,我们可以将一对一或一对多关系的查询逻辑封装成可复用的SQL语句或映射文件片段,提高代码的重用性和可维护性。

5. 高效的数据库访问:MyBatis的关联关系映射能够有效地利用数据库的连接和查询优化,减少不必要的数据库访问,提高数据库操作的效率。

这些收获和认识将帮助我们更好地应对实际项目中的数据库操作需求,并提升我们作为Java程序员的能力和竞争力。

 

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

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

相关文章

uniapp里textarea多行文本输入限制数量

uniapp里textarea多行文本域实现输入计数 <template><view class"inputs"><textarea class"text1" maxlength50 placeholder请输入... input"sumfontnum"></textarea><text class"text2">{{fontNum}}/…

对时序数据进行分类与聚类

我在最近的工作中遇到了一个问题&#xff0c;问题是我需要根据银行账户在一定时间内的使用信息对该账户在未来的一段时间是否会被销户进行预测。这是一个双元值的分类问题&#xff0c;只有两种可能&#xff0c;即会被销户和不会被销户。针对这个问题一般来说有两种解决策略。 …

【算法刷题-栈与队列篇】

目录 1.leetcode-232. 用栈实现队列2.leetcode-225. 用队列实现栈3.leetcode-20. 有效的括号&#xff08;1&#xff09;代码1&#xff08;2&#xff09;代码2 4.leetcode-1047. 删除字符串中的所有相邻重复项5.leetcode-150. 逆波兰表达式求值6.leetcode-239. 滑动窗口最大值7.…

2023高教社杯 国赛数学建模A题思路 - 定日镜场的优化设计

1 赛题 A 题 定日镜场的优化设计 构建以新能源为主体的新型电力系统&#xff0c; 是我国实现“碳达峰”“碳中和”目标的一项重要 措施。塔式太阳能光热发电是一种低碳环保的新型清洁能源技术[1]。 定日镜是塔式太阳能光热发电站(以下简称塔式电站)收集太阳能的基本组件&…

卡牌类游戏推荐,卡牌类三国手游排行榜

以下是小编要推荐给大家的关于卡牌类三国手游排行榜的内容。这里有来自各个历史阶段的名将和美女&#xff0c;让你体验最真实的三国战役。你可以将各种战略思维运用到其中&#xff0c;感受步步为营的喜悦&#xff0c;最终赢得战火纷飞的三国&#xff0c;如果想了解每个游戏的具…

【Leetcode刷题】哈希

本篇文章为 LeetCode 哈希模块的刷题笔记&#xff0c;仅供参考。 哈希表是一种使用哈希函数组织数据&#xff0c;以支持快速插入和搜索的数据结构。哈希表通过哈希函数通过将任意类型的数据映射到固定大小的数据&#xff0c;以实现快速查找和存储数据。C 中的无序容器 unorder…

YOLOv5改进算法之添加CA注意力机制模块

目录 1.CA注意力机制 2.YOLOv5添加注意力机制 送书活动 1.CA注意力机制 CA&#xff08;Coordinate Attention&#xff09;注意力机制是一种用于加强深度学习模型对输入数据的空间结构理解的注意力机制。CA 注意力机制的核心思想是引入坐标信息&#xff0c;以便模型可以更好地…

iOS App上架新规解析:如何进行App备案

摘要 本文将以iOS技术博主的身份&#xff0c;解析iOS App上架新规中的App备案要求。通过探讨备案对开发者和市场的影响&#xff0c;介绍备案流程和所需材料&#xff0c;帮助开发者了解如何进行App备案。 引言 近年来&#xff0c;移动应用市场蓬勃发展&#xff0c;但同时也存…

索尼 toio™应用创意开发征文|一步两步三步模拟浇花系统

目录 1.toio™介绍 2、创意分析 2.1 创意设计 2.2 创意落地 3、创意实现 3.1 环境安装 3.2 核心玩法 总结 1.toio™介绍 索尼的toio™是一款启发创意的机器人产品&#xff0c;旨在通过与真实世界的互动&#xff0c;为各年龄段的用户提供娱乐体验。这款产品具有高度的灵…

回归预测 | MATLAB实现PCA-BP主成分降维结合BP神经网络多输入单输出回归预测

回归预测 | MATLAB实现PCA-BP主成分降维结合BP神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现PCA-BP主成分降维结合BP神经网络多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 MATLAB实现PCA-BP主成分降维算法结合BP神经网络多输入单输出回…

【完整代码】2023数学建模国赛C题代码--蔬菜类商品的自动定价与补货决策

C 题 蔬菜类商品的自动定价与补货决策 在生鲜商超中&#xff0c;一般蔬菜类商品的保鲜期都比较短&#xff0c;且品相随销售时间的增加而变差&#xff0c; 大部分品种如当日未售出&#xff0c;隔日就无法再售。因此&#xff0c;商超通常会根据各商品的历史销售和需 求情况每天进…

Webpack5入门到原理

Webpack5学习 尚硅谷Webpack5新版视频教程 B站直达&#xff1a;https://www.bilibili.com/video/BV14T4y1z7sw 百度网盘&#xff1a;https://pan.baidu.com/s/114lJRGua2uHBdLq_iVLOOQ 提取码&#xff1a;yyds 阿里云盘&#xff1a;https://www.aliyundrive.com/s/UMkmCzdWsGh&…

如何免费获取CDH集群技术支持

CDH拥有全球70% 的Hadoop用户&#xff0c;在国内也拥有庞大的用户群体。由于Cloudera 和Hortonworks 合并后厂商政策调整&#xff0c;不再更新、不再免费、不再提供服务&#xff0c;众多企业用户生产集群面临着进退两难的窘境和未知的技术风险。 社区版不再更新。Cloudera所有…

移动硬盘或U盘无法弹出的解决方法

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 最近在红米本win11中总遇到“该设备正在使用中”而无法弹出硬盘的问题。 解法该问题的思路&#xff1a;先定位占用该设备的进程&#xff0c;然后结束该进程。 定位进程 既然设备被占用&#xff0c;那肯定…

ubuntu下Anaconda安装与使用教程

前言 好久没用anaconda了&#xff0c;还记得之前用anaconda的欢乐时光。pytorch和paddlepaddle(飞浆)&#xff0c;怀念&#xff0c;可生活&#xff08;换了ubuntu系统之后&#xff09;教会了我残忍&#xff08;可能很难有机会再用windows的anaconda了&#xff09;。找个时间&a…

Java高并发系列: 使用wait - notify实现高效异步方法

1. 背景 在项目开发中, 通常会有异步执行操作, 例如: 提交一个异步清空一系列数据库中ID ${_id} 的记录, 这个时候通常的做法是主线程将任务添加到一个异步队列中, 后台维护一个线程不断地循环扫描这个队列, 如果有需要执行的任务, 则执行相应的逻辑. 如下图所示: 2. 一个简…

qt day 6

登录界面 #include "window.h" #include<QDebug> #include<QIcon> Window::Window(QWidget *parent) //构造函数的定义: QWidget(parent) //显性调用父类的构造函数 {//判断数据库对象是否包含了自己使用的数据库Student.dbif(!db.contains(&…

Spring Cloud--从零开始搭建微服务基础环境【二】

&#x1f600;前言 本篇博文是关于Spring Cloud–从零开始搭建微服务基础环境【二】&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;…

以antd为例 React+Typescript 引入第三方UI库

本文 我们来说说 第三方UI库 其实应用市场上的 第三方UI库都是非常优秀的 那么 react 我们比较熟的肯定还是 antd 我们还是来用它作为演示 这边 我们先访问他的官网 https://3x.ant.design/index-cn 点击开始使用 在左侧 有一个 在 TypeScript 中使用 通过图标我们也可以看出…

1000元订金?华为折叠屏手机MateX5今日开始预订,售价尚未公布

华为最新款折叠屏手机Mate X5今日在华为商城开始预订&#xff0c;吸引了众多消费者的关注。预订时需交纳1000元的订金&#xff0c;而具体售价尚未公布。据华为商城配置表显示&#xff0c;Mate X5预计将搭载Mate 60系列同款麒麟9000S处理器&#xff0c;或可能搭载麒麟9100处理器…