“MyBatis中的关联关系配置与多表查询“

news2025/1/15 16:56:27

目录

  • 引言
    • 一、一对多关系配置
    • 二、一对一关系配置
    • 三、多对多关系配置
    • 总结

在这里插入图片描述

引言

在数据库应用开发中,经常会遇到需要查询多个表之间的关联关系的情况。MyBatis是一个流行的Java持久层框架,它提供了灵活的配置方式来处理多表查询中的一对多、一对一和多对多关系。本文将介绍如何在MyBatis中配置和使用这些关联关系。

一、一对多关系配置

在数据库中,一对多关系是指一个表的一条记录对应另一个表的多条记录。在MyBatis中,我们可以通过以下步骤来配置和使用一对多关系:

  1. 创建实体类
    首先,我们需要创建两个实体类,分别表示一对多关系中的一方和多方。例如,我们创建一个Order类和一个OrderItem类,其中一个订单可以对应多个订单项。

public class Order {
    private Long id;
    private String orderNo;
    private List<OrderItem> orderItems;
    // 省略getter和setter方法
}

public class OrderItem {
    private Long id;
    private String productName;
    // 省略getter和setter方法
}

package com.yuan.vo;

import com.yuan.model.Order;
import com.yuan.model.OrderItem;

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

/**
 * @author 叶秋
 * @site
 * @company 卓京公司
 * @create 2023-09-01 11:48
 */
public class OrderVO extends Order {
    private List<OrderItem> list = new ArrayList<>();

    public List<OrderItem> getList() {
        return list;
    }

    public void setList(List<OrderItem> list) {
        this.list = list;
    }
}

  1. 创建Mapper接口和XML文件
    接下来,我们需要创建Mapper接口和对应的XML文件来定义查询方法和SQL语句。在XML文件中,我们可以使用MyBatis的标签来配置一对多关系。



<!-- OrderMapper.xml -->
<mapper namespace="com.yuan.mapper.OrderMapper">
    <resultMap id="OrderVoMap" type="com.yuan.vo.OrderVO" >
    <result column="order_id" property="orderId"></result>
    <result column="order_no" property="orderNo"></result>
    <collection property="list" ofType="com.yuan.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="demo1" resultMap="OrderVoMap" parameterType="java.lang.Integer" >
    select * from t_hibernate_order o ,t_hibernate_order_item oit where o.order_id = oit.oid and o.order_id = #{oid}

  </select>
</mapper>
  1. 编写查询方法
    最后,我们在Mapper接口中定义查询方法,并在XML文件中配置对应的SQL语句。


package com.yuan.Biz;

import com.yuan.vo.OrderVO;

/**
 * @author 叶秋
 * @site
 * @company 卓京公司
 * @create 2023-09-01 13:08
 */
public interface OrderBiz {
    OrderVO demo1(Integer oid);
}

  1. 使用一对多关系查询
    现在,我们可以在代码中使用一对多关系查询了。
package com.yuan.Biz.Impl;

import com.yuan.Biz.OrderBiz;
import com.yuan.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
 * @company 卓京公司
 * @create 2023-09-01 13:13
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})

public class OrderBizImplTest {

    @Autowired
    private  OrderBiz orderBiz;

    @Test
    public void demo1() {
        OrderVO orderVO = orderBiz.demo1(7);
        System.out.println(orderVO);
        orderVO.getList().forEach(System.out::println);

    }
}

二、一对一关系配置

  1. 创建实体类
    首先,我们需要创建两个实体类,分别表示一对多关系中的一方和一方。例如,我们创建一个Order类和一个OrderItem类,其中一个订单可以对应一个订单项。

public class Order {
    private Long id;
    private String orderNo;
    private List<OrderItem> orderItems;
    // 省略getter和setter方法
}

public class OrderItem {
    private Long id;
    private String productName;
    // 省略getter和setter方法
}

package com.yuan.vo;

import com.yuan.model.Order;
import com.yuan.model.OrderItem;

/**
 * @author 叶秋
 * @site
 * @company 卓京公司
 * @create 2023-09-01 13:58
 */
public class OrderItemVo extends OrderItem {
   private Order order;

    public Order getOrder() {
        return order;
    }

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


  1. 创建Mapper接口和XML文件
    接下来,我们需要创建Mapper接口和对应的XML文件来定义查询方法和SQL语句。在XML文件中,我们可以使用MyBatis的标签来配置一对一关系。
 <resultMap id="OrderItemVoMap" type="com.yuan.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.yuan.model.Order">
      <result column="order_id" property="orderId"></result>
      <result column="order_no" property="orderNo"></result>
    </association>
  </resultMap>

  <select id="demo2" resultMap="OrderItemVoMap" parameterType="java.lang.Integer" >
    select * from t_hibernate_order o ,t_hibernate_order_item oit where o.order_id = oit.oid and oit.order_item_id = #{oiid}

  </select>
  1. 编写查询方法
    最后,我们在Mapper接口中定义查询方法,并在XML文件中配置对应的SQL语句。

package com.yuan.Biz;

import com.yuan.model.OrderItem;

/**
 * @author 叶秋
 * @site
 * @company 卓京公司
 * @create 2023-09-01 14:03
 */
public interface OrderItemBiz {
    OrderItem demo2( Integer oiid);
}


  1. 使用一对一关系查询
    现在,我们可以在代码中使用一对多关系查询了。
package com.yuan.Biz.Impl;

import com.yuan.Biz.OrderItemBiz;
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
 * @company 卓京公司
 * @create 2023-09-01 14:06
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})
public class OrderItemBizImplTest {

    @Autowired
    private OrderItemBiz orderItemBiz;

    @Test
    public void demo2() {
        System.out.println(orderItemBiz.demo2(27));
    }
}

三、多对多关系配置

在数据库中,多对多关系是指两个表之间存在多对多的关系。在MyBatis中,我们可以通过以下步骤来配置和使用多对多关系:

  1. 创建实体类
    首先,我们需要创建两个实体类,分别表示多对多关系中的两个表。例如,我们创建一个User类和一个Role类,一个用户可以拥有多个角色,一个角色也可以被多个用户拥有。
package com.yuan.model;

import lombok.ToString;

@ToString
public class HBook {
    private Integer bookId;

    private String bookName;

    private Float price;

    public HBook(Integer bookId, String bookName, Float price) {
        this.bookId = bookId;
        this.bookName = bookName;
        this.price = price;
    }

    public HBook() {
        super();
    }

    public Integer getBookId() {
        return bookId;
    }

    public void setBookId(Integer bookId) {
        this.bookId = bookId;
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public Float getPrice() {
        return price;
    }

    public void setPrice(Float price) {
        this.price = price;
    }
}


package com.yuan.model;

import lombok.ToString;

@ToString
public class HBookCategory {
    private Integer bcid;

    private Integer bid;

    private Integer cid;

    public HBookCategory(Integer bcid, Integer bid, Integer cid) {
        this.bcid = bcid;
        this.bid = bid;
        this.cid = cid;
    }

    public HBookCategory() {
        super();
    }

    public Integer getBcid() {
        return bcid;
    }

    public void setBcid(Integer bcid) {
        this.bcid = bcid;
    }

    public Integer getBid() {
        return bid;
    }

    public void setBid(Integer bid) {
        this.bid = bid;
    }

    public Integer getCid() {
        return cid;
    }

    public void setCid(Integer cid) {
        this.cid = cid;
    }
}

package com.yuan.model;

import lombok.ToString;

@ToString
public class HCategory {
    private Integer categoryId;

    private String categoryName;

    public HCategory(Integer categoryId, String categoryName) {
        this.categoryId = categoryId;
        this.categoryName = categoryName;
    }

    public HCategory() {
        super();
    }

    public Integer getCategoryId() {
        return categoryId;
    }

    public void setCategoryId(Integer categoryId) {
        this.categoryId = categoryId;
    }

    public String getCategoryName() {
        return categoryName;
    }

    public void setCategoryName(String categoryName) {
        this.categoryName = categoryName;
    }
}

package com.yuan.vo;

import com.yuan.model.HBook;
import com.yuan.model.HCategory;

import java.util.List;

/**
 * @author 叶秋
 * @site
 * @company 卓京公司
 * @create 2023-09-01 20:35
 */
public class HbookVo extends HBook {
    private List<HCategory> categories ;

    public List<HCategory> getCategories() {
        return categories;
    }

    public void setCategories(List<HCategory> categories) {
        this.categories = categories;
    }
}

  1. 创建Mapper接口和XML文件
    接下来,我们需要创建Mapper接口和对应的XML文件来定义查询方法和SQL语句。在XML文件中,我们可以使用MyBatis的标签来配置多对多关系。

 <resultMap id="HookVoMap" type="com.yuan.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.yuan.model.HCategory">
      <result column="category_id" property="categoryId"></result>
      <result column="category_name" property="categoryName"></result>
    </collection>
  </resultMap>

  <select id="demo3" resultMap="HookVoMap" 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>
  1. 编写查询方法
    最后,我们在Mapper接口中定义查询方法,并在XML文件中配置对应的SQL语句。

package com.yuan.Biz.Impl;

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

/**
 * @author 叶秋
 * @site
 * @company 卓京公司
 * @create 2023-09-01 21:23
 */
@Service
public class HBookBizImpl implements HBookBiz {

    @Autowired
    private HBookMapper hBookMapper;

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

}

  1. 使用多对多关系查询
    现在,我们可以在代码中使用多对多关系查询了。
package com.yuan.Biz.Impl;

import com.yuan.Biz.HBookBiz;
import com.yuan.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
 * @company 卓京公司
 * @create 2023-09-01 21:24
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})
public class HBookBizImplTest {
    @Autowired
    private HBookBiz hBookBiz;

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

总结

本文介绍了在MyBatis中配置和使用一对多和多对多关系的方法。通过合理的实体类设计、Mapper接口和XML文件的配置,我们可以方便地进行多表查询,并丰富了应用程序的功能和灵活性。
补充内容:在实际开发中,我们还可以使用MyBatis的动态SQL和缓存等特性来进一步优化查询性能和提高开发效率。希望本文对您在MyBatis中处理关联关系有所帮助。

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

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

相关文章

浅谈视频汇聚平台EasyCVR中AI中台的应用功能

AI中台是将人工智能技术如深度学习、计算机视觉、知识图谱、自然语言理解等模块化&#xff0c;集约硬件的计算能力、算法的训练能力、模型的部署能力、基础业务的展现能力等人工智能能力&#xff0c;结合中台的数据资源&#xff0c;封装成整体中台系统。 在EasyCVR视频共享融合…

windows的redis配置sentinel

1、先安装好redis主从&#xff0c;参考我的文章&#xff0c;链接如下 redis主从&#xff08;windows版本&#xff09;_rediswindows版本_veminhe的博客-CSDN博客 2、然后配置sentinel 参考在windows上搭建redis集群&#xff08;Redis-Sentinel&#xff09; 配置时&#xf…

520页(17万字)集团大数据平台整体解决方案word

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除&#xff0c;更多浏览公众号&#xff1a;智慧方案文库 1.1.1 系统总体逻辑结构 4-14系统总体逻辑结构图 参见上图&#xff0c;基于Hadoop构建的企业级数据仓库&#xff0c;包含…

文心一言全面开放,可能笑傲“AIGC”江湖?

8月31日凌晨&#xff0c;百度率先向全社会全面开放“文心一言”体验&#xff0c;所有用户可在AppStore或各大安卓应用市场下载“文心一言App或登录文心一言官网”体验。 这对早早关注人工智能领域的科技咖来说&#xff0c;是个好消息。 那么&#xff0c;AIGC、大模型、文心一…

uniapp 微信小程序添加隐私保护指引

隐私弹窗&#xff1a; <uni-popup ref"popup"><view class"popupWrap"><view class"popupTxt">在你使用【最美万年历】之前&#xff0c;请仔细阅读<text class"blueColor" click"handleOpenPrivacyContract…

港联证券|杭州亚运会概念崛起 杭州园林、杭州解百等涨停

杭州亚运会概念1日盘中大幅拉升&#xff0c;截至发稿&#xff0c;杭州园林、杭州解百、中装建造等涨停&#xff0c;万事利、曼卡龙涨超8%&#xff0c;三江购物、汉嘉设计、浙江建造等涨超6%&#xff0c;君亭酒店、电魂网络涨逾5%。 音讯面上&#xff0c;杭州亚运会将于2023年9…

MyBatis-Plus快速实现增删改[MyBatis-Plus系列]

师傅&#xff1a;徒儿&#xff0c;看你最近情绪波动很大呀&#xff0c;这是怎么了&#xff1f; ​ 悟纤&#xff1a;还不是感情的事情来着。 师傅&#xff1a;怎么说来着&#xff1f; 悟纤&#xff1a;感情中间产生了太多的误会了&#xff0c;乱的很&#xff0c;老天爷给设置…

3.(Python数模)整数规划问题

Python解决整数规划问题 在实际生活中&#xff0c;线性规划中的变量不可能都是连续的值&#xff0c;比如不可能计算出0.5个人&#xff0c;0.5只牛羊&#xff0c;往往需要根据题目需要或者实际问题来调整决策变量的变量类型 Continuous’ 表示连续变量&#xff08;默认值&…

使用axi_quad_spi操作spi_flash

文章目录 基本测试情况IP支持的命令 基本测试情况 有spi_flash需要访问&#xff0c;为简单计&#xff0c;选择使用axi_quad_spi进行操作。开始时&#xff0c;将IP配置成如下参数&#xff0c; 这样配置&#xff0c;是想着能够适应各家的FLASH&#xff08;实际使用的则是micron…

业务安全情报第二十一期 | 打击代抢票“黄牛”

目录 疯狂的演出票 博物馆门票也疯狂 “黄牛”们的代抢票是什么&#xff1f; 代抢“黄牛”的牟利方式 “黄牛”代抢票的危害 技术上防范“黄牛”的代抢 抢票&#xff0c;成为关键词2023年暑假。博物馆的门票需要抢&#xff0c;各个演唱会的门票也需要抢&#xff0c;甚至高…

2023年03月 C/C++(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;拼点游戏 C和S两位同学一起玩拼点游戏。有一堆白色卡牌和一堆蓝色卡牌&#xff0c;每张卡牌上写了一个整数点数。C随机抽取n张白色卡牌&#xff0c;S随机抽取n张蓝色卡牌&#xff0c;他们进行n回合拼点&#xff0c;每次两人各出一张卡牌&#xff0c;点数大者获…

浅谈云数据安全的重要性是什么

随着企业对云计算的广泛应用&#xff0c;云数据安全成为一项关键的挑战。由于企业将数据迁移到云端&#xff0c;保护这些数据的安全变得至关重要。那么&#xff0c;云数据安全的重要性是什么?下面&#xff0c;就一起来看看具体介绍吧! 一、云数据安全的重要性 1、保护敏感数据…

组态王、触摸屏、上位机三者区别这么大?

组态王、触摸屏和上位机是工业自动化领域中常见的三个概念&#xff0c;它们在控制系统中有不同的作用和功能&#xff0c;但彼此之间也存在一定的关联。组态王&#xff08;SCADA软件&#xff09;&#xff1a;组态王是一种常用的配置软件&#xff0c;用于设计和创建人机界面&…

Ansible-playbook循环学习

循环语句简介 我们在编写playbook的时候&#xff0c;不可避免的要执行一些重复性操作&#xff0c;比如指安装软件包&#xff0c;批量创建用户&#xff0c;操作某个目录下的所有文件等。正如我们所说&#xff0c;ansible一门简单的自动化语言&#xff0c;所以流程控制、循环语句…

VMware12.1.1安装Centos7

VMware12.1.1安装Centos7 1、下载相关软件 1.1 Centos7下载 官方下载链接&#xff1a; http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1511.iso 1.2 VMware Workstation下载 VMware Workstation 12.1.1官方原版下载&#xff1a; https://dow…

Vue组件之间进行传值的两种方式

在 Vue 中&#xff0c;组件之间传值是一个常见的操作&#xff0c;通常有两种方式来传递数据&#xff1a;props 和事件&#xff08;Event Bus&#xff09;。下面我将详细介绍这两种方式。 1. 通过 Props 传递数据 Props 是一种用于从父组件向子组件传递数据的方式。在子组件中…

ROS 2官方文档(基于humble版本)学习笔记(一)

ROS 2官方文档&#xff08;基于humble版本&#xff09;学习笔记&#xff08;一&#xff09; 一、安装ROS 2二、按教程学习1.CLI 工具配置环境使用turtlesim&#xff0c;ros2和rqt安装 turtlesim启动 turtlesim使用 turtlesim安装 rqt使用 rqt重映射关闭turtlesim 由于市面上专门…

java操作adb查看apk安装包包名【搬代码】

Testpublic static void findadb() throws InterruptedException {String apkip"E:\\需求\\2023\\gql_1.0.1.apk";String findname1"cmd /c cd E:\\appium\\android-sdk\\build-tools\\27.0.2";//没有进到这里String s1 Cmd.exeCmd(findname1);System.out…

微机原理 || 第2次测试:汇编指令(加减乘除运算,XOR,PUSH,POP,寻址方式,物理地址公式,状态标志位)(测试题+手写解析)

&#xff08;一&#xff09;测试题目&#xff1a; 1.数[X]补1111,1110B&#xff0c;则其真值为 2.在I/O指令中,可用于表示端口地址的寄存器 3. MOV AX,[BXSl]的指令中&#xff0c;源操作数的物理地址应该如何计算 4.执行以下两条指令后&#xff0c;标志寄存器FLAGS的六个状态…

InVEST模型+SolVES模型教程

详情点击公众号链接&#xff1a;基于当量因子法、InVEST、SolVES模型等多技术融合在生态系统服务功能社会价值评估中的应用及论文写作、拓展分析 前言 生态系统服务是人类从自然界中获得的直接或间接惠益&#xff0c;可分为供给服务、文化服务、调节服务和支持服务4类&#xf…