MyBatis中至关重要的关系映射----全方面介绍

news2024/12/23 14:32:51

目录

一 对于映射的概念

1.1 三种关系映射

1.2 resultType与resultMap的区别

resultType:

resultMap:

二,一对一关联查询

2.1 嵌套结果集编写

2.2 案例演示

三,一对多关联查询

3.1 嵌套结果集编写

 3.3 案例演示

四,多对多关联查询 

4.1 嵌套结果集编写

 4.2 案例演示

一 对于映射的概念

     在关系型数据库中,表与表之间存在着三种关联映射关系,分别为一对一关系、一对多关系和多对多关系。  那在 MyBatis 中,通过 association 元素来处理对象与对象之间关联关系,association 元素提供了一系列属性用于维护数据表之间的关系。association 元素是 resultMap元素的子元素,它有两种配置方式,嵌套查询方式和嵌套结果集方式。

1.1 三种关系映射

一对一关联映射:

      这种关系表示两个实体类之间存在唯一的对应关系,通常通过在表之间使用外键来建立连接。在 MyBatis 中可以使用 association 元素来实现一对一关联映射

一对多关联映射:

     这种关系表示一个实体类关联多个其他实体类的实例。例如,在数据库中,一个文章可以对应多个评论。在 MyBatis 中可以使用 collection 元素来实现一对多关联映射

多对多关联映射:

         这种关系表示两个实体类之间存在多对多的关系,通常通过中间表来实现。例如,一个用户可以拥有多个角色,一个角色也可以被多个用户拥有。在 MyBatis 中可以使用中间表和联合查询来实现多对多关联映射。

1.2 resultType与resultMap的区别

resultType:

使用 resultType,我们直接指定了查询结果的类型,它通常用于简单的查询语句,不需要复杂的映射关系。优点是简单直观,缺点是不能进行复杂的映射操作(实体类没有该属性的情况)。

resultMap:

    而使用 resultMap,我们可以更加灵活地映射查询结果到任意类型的 Java 对象上。通过定义一个 resultMap,我们可以指定每个查询结果列与 Java 对象属性之间的映射关系。优点是功能强大,可以进行各种复杂的映射操作,缺点是需要编写更多的 XML 配置代码

二,一对一关联查询

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

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

OrderitemVo:

public class OrderitemVo extends Orderitem {
    private Order order;
 
    public Order getOrder() {
        return order;
    }
 
    public void setOrder(Order order) {
        this.order = order;
    }

2.1 嵌套结果集编写

<resultMap id="OrderitemvoMap" type="com.Bing.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.Bing.model.Order">
      <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>

2.2 案例演示

接口类并实现

接口Biz编写:

public interface OrderitemBiz {
    OrderitemVo selectByOiid(Integer oiid);
}

实现类Impl类继承Biz:

@Service
public class OrderitemImpl implements OrderitemBiz {
    @Autowired
    private OrderitemMapper OrderitemMapper;
 
    @Override
    public OrderitemVo selectByOiid(Integer oiid) {
        return OrderitemMapper.selectByOiid(oiid);
    }
}

Test类编写:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})
public class OrderitemImplTest {
    @Autowired
    private OrderitemBiz OrderitemBiz;
 
    @Test
    public void selectByOiid() {
        OrderitemVo orderitemVo = OrderitemBiz.selectByOiid(27);
        System.out.println(orderitemVo);
        System.out.println(orderitemVo.getOrder());
    }
}

测试运行结果:

三,一对多关联查询

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

注意:要使用list集合

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;
    }
 
    @Override
    public String toString() {
        return "OrderVo{" +
                "orderitems=" + orderitems +
                '}';
    }
}

3.1 嵌套结果集编写

 <resultMap id="OrderMap" type="com.Bing.vo.OrderVo" >
    <result column="order_id" property="orderId"></result>
    <result column="order_no" property="orderNo"></result>
    <collection property="orderitems" ofType="com.Bing.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="byOid" 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.3 案例演示

接口类并实现

接口Biz编写:

public interface OrderBiz {
    OrderVo byOid(Integer id);
}

实现Impl类继承Biz:

@Service
public class OrderBizImpl implements OrderBiz {
    @Autowired
    private OrderMapper orderMapper;
    @Override
    public OrderVo byOid(Integer id) {
        return orderMapper.byOid(id);
    }
}

Test类编写:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})
public class OrderBizImplTest {
@Autowired
private OrderBiz orderBiz;
    @Test
    public void byOid() {
        OrderVo orderVo = orderBiz.byOid(7);
        System.out.println(orderVo);
        orderVo.getOrderitems().forEach(System.out::println);
    }
}

测试类运行结果:

四,多对多关联查询 

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

HbookVo:

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

4.1 嵌套结果集编写

<resultMap id="HbookVo" type="com.Bing.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.Bing.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>

 4.2 案例演示

接口类并实现

接口Biz编写:

public interface HBookBiz {
    HbookVo selectByBid(Integer bid);
}

实现类Impl类继承Biz:

@Service
public class HBookBizImpl implements HBookBiz {
    @Autowired
    private HBookMapper hbookMapper;
 
    @Override
    public HbookVo selectByBid(Integer bid) {
        return hbookMapper.selectByBid(bid);
    }
}

Test类编写:

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

Test类运行结果:

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

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

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

相关文章

使用命令行创建仓库

如果你还没有任何代码&#xff0c;可以通过命令行工具创建一个全新的Git仓库并初始化到本项目仓库中。 git clone https://e.coding.net/***/neurosens.git cd neurosens echo "# neurosens" >> README.md git add README.md git commit -m "first commi…

Springboot使用hikari连接池进行Kerberos认证访问Impala

springboot-kerberos-hikari-impala Springboot使用hikari连接池并进行Kerberos认证访问Impala的演示项目 Springboot使用hikari连接池并进行Kerberos认证访问Impala的demo地址:https://github.com/Raray-chuan/springboot-kerberos-hikari-impala 修改后的Hikari源码地址:h…

详解4种类型的爬虫技术

聚焦网络爬虫是“面向特定主题需求”的一种爬虫程序&#xff0c;而通用网络爬虫则是捜索引擎抓取系统&#xff08;Baidu、Google、Yahoo等&#xff09;的重要组成部分&#xff0c;主要目的是将互联网上的网页下载到本地&#xff0c;形成一个互联网内容的镜像备份。 增量抓取意…

sqli-labs闯关

less-01: less-08: less-11: less-18: less-19: less-20: Sqli-labs项目地址—Github 使用HackBar插件 less-01: Sqli-labs前20关均为数字型注入 Sqli-labs前四关较为类似以less-01为模板 将网址导入HackBar中&#xff1a; 1.根据提示&#xff0c;输入http://127.0.0.…

laragon 为 php 安装 Xdebug 扩展

众所周知&#xff0c;php 自带的 var_dump() 输出格式很不直观 而 laragon 作为很好的 windos 下开发环境很受欢迎&#xff0c;本文就介绍如何快速为 laragon 的 php 安装 Xdebug&#xff0c;方便开发调试 一&#xff1a;启动开发环境&#xff0c;在任意可访问 php 页面中输出 …

Matlab中fdatool结合STM32F4设计滤波器

数字滤波器的原理 1.从功能上分&#xff1b;低通、带通、高通、带阻。滤波器口诀&#xff1a;低通滤高频&#xff1b;高通滤低频&#xff1b;带通滤两边&#xff1b;带阻阻中间&#xff1b; 2.从实现方法上分:FIR、IIR 3.从设计方法上来分&#xff1a;Chebyshev(切比雪夫&…

哪家证券公司能做股票的量化交易?

一般证券公司都是能做股票的量化交易的&#xff0c;证券公司主流使用的量化软件一般是P-trade或QMT。其中P-trade普通版更适合没有太多编程经验的投资者使用&#xff0c;可以直接应用软件中现成的程序进行交易&#xff0c;QMT适合专业的投资者&#xff0c;有一定学编程语言基础…

34k*16 薪,3年自动化测试历经3轮面试成功拿下字节Offer....

前言 转眼过去&#xff0c;距离读书的时候已经这么久了吗&#xff1f;&#xff0c;从18年5月本科毕业入职了一家小公司&#xff0c;到现在快4年了&#xff0c;前段时间社招想着找一个新的工作&#xff0c;前前后后花了一个多月的时间复习以及面试&#xff0c;前几天拿到了字节…

国产信创替代迫在眉睫,如何选择合适的信创文件传输系统?

当今世界正经历着百年未有之大变局&#xff0c;随着时代发展进步&#xff0c;党的二十大也对于加快建设数字中国做出了重要部署。只有牵制住自主创新这么一个关键点&#xff0c;以关键核心技术突破推动实现高水平科技自立自强&#xff0c;才能牢牢掌握数字经济发展的主动权。自…

手写Mybatis:第11章-流程解耦,封装结果集处理器

文章目录 一、目标&#xff1a;结果集处理器二、设计&#xff1a;结果集处理器三、实现&#xff1a;结果集处理器3.1 工程结构3.2 结果集处理器关系图3.3 出参参数处理3.3.1 结果映射Map3.3.2 结果映射封装3.3.3 修改映射器语句类3.3.4 映射构建器助手3.3.5 语句构建器调用助手…

Java“牵手”京东商品评论数据接口方法,京东商品评论接口,京东商品评价接口,行业数据监测,京东API实现批量商品评论内容数据抓取示例

京东平台商品评论数据接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取京东商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片、评论内容、评论日期、评论图片、追评内容等详细信息 。 获取商品评论接口API是一种用于获取…

无涯教程-JavaScript - DCOUNTA函数

描述 DCOUNTA函数返回列表或数据库中符合您指定条件的列中非空白单元格的计数。 此函数与DCOUNT函数相似,不同之处在于DCOUNTA函数对所有非空白单元进行计数。 DCOUNT函数仅计算包含数值的单元格。 语法 DCOUNTA (database, field, criteria)争论 Argument描述Required/Op…

参编三大金融国标,奇富科技以技术促行业规范化演进

近期&#xff0c;由中国互联网金融协会领导制定的《互联网金融智能风险防控技术要求》《互联网金融个人网络消费信贷信息披露》《互联网金融个人身份识别技术要求》三项国家标准颁布&#xff0c;由国家市场监督管理总局、国家标准化管理委员会发布&#xff0c;奇富科技作为核心…

sqli-labs例题复现

less-1.1 在源码中$id$_GET[id];之后加入如下代码&#xff1a; if(preg_match(/select\b[\s\S]*\bfrom/is,$id)){die(SQL Injection); }; 1.分析正则 第一个\b匹配select单词边界&#xff0c;\s\S匹配到所有字符&#xff0c;最后一个\b匹配到from单词边界。 select...from…

超详细!80个Python入门实例,代码清晰拿来即用,学习提升必备

对于大部分Python学习者来说&#xff0c;核心知识基本已经掌握了&#xff0c;但"纸上得来终觉浅,绝知此事要躬行"&#xff0c;要想完全掌握Python&#xff0c;还得靠实践应用。 今天给大家分享80个Python入门实例&#xff0c;都是基础实例&#xff0c;经典实用&…

问道管理:什么是大盘?大盘股又是什么?

聊到股市就免不了聊到大盘&#xff0c;有些新进场的投资者对此或许带有疑问&#xff0c;什么是大盘&#xff1f;我们所说的大盘股又是什么&#xff1f;关于这些&#xff0c;问道管理为我们准备了以下参考内容。 什么是大盘&#xff1f; 大盘&#xff0c;主要是指股市的整体行情…

最新secureCRT成功安装教程含资源链接

下载压缩包解压&#xff0c;如下双击安装&#xff1a; 打开按步骤导入就可以了 secureCRT 正常打开连上ubuntu的效果&#xff1a; 界面还没配置&#xff0c;还需根据个人爱好配置一下。 时间就是金钱&#xff0c;按下面链接操作完会自动弹出下载窗口&#xff0c;下载大概要三四…

算法leetcode|76. 最小覆盖子串(rust重拳出击)

文章目录 76. 最小覆盖子串&#xff1a;样例 1&#xff1a;样例 2&#xff1a;样例 3&#xff1a;提示&#xff1a;进阶&#xff1a; 分析&#xff1a;在这里插入图片描述 题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a; 76.…

动态贴纸、美颜SDK与AR:创造独特的互动体验

目前&#xff0c;动态贴纸、美颜SDK、增强现实&#xff08;AR&#xff09;等技术是比较热门的话题&#xff0c;它们所结合的新兴玩法更是收到大家推崇&#xff0c;正潜移默化的改变我们与数字世界互动的方式。 一、动态贴纸&#xff1a;个性化互动的开始 动态贴纸&#xff0c…

智能聊天机器人,帮你排解烦恼!

在繁忙的生活中&#xff0c;你是否曾经感到压力和烦恼无处宣泄&#xff1f;现在&#xff0c;我们为你带来了一款全新的智能聊天机器人&#xff0c;它能够倾听你的心声&#xff0c;理解你的情绪&#xff0c;为你提供安慰和支持&#xff0c;让你告别烦恼&#xff0c;重拾快乐生活…