MyBatis中一对一、一对多和多对多关联关系的配置详解

news2024/11/24 17:20:55

MyBatis中一对一、一对多和多对多关联关系的配置详解

  • 引言
  • 一对一关联关系配置
  • 一对多关联关系配置
    • 结论
  • 多对多关联关系配置
    • 结论

引言

MyBatis是一款优秀的持久层框架,它提供了灵活且强大的关联关系配置功能。本文将介绍MyBatis中一对一、一对多和多对多关联关系的配置方法和实践经验,帮助读者更好地理解和应用这些关系。

一对一关联关系配置
一对一关联关系表示两个实体之间具有唯一对应关系。在MyBatis中配置一对一关联关系需要使用标签和标签。下面是一个示

一对一关联关系配置

例:

<resultMap id="OrderItemVoMap" type="com.niyin.vo.OrderltemVo">
  <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.niyin.model.Order">
    <result column="order_id" property="orderId"></result>
    <result column="order_no" property="orderNo"></result>
  </association>
</resultMap>
  
  
  
  <select id="selectByOrderItem" 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>

orderitemMap

package com.niyin.mapper;

import com.niyin.model.Orderitem;
import com.niyin.vo.OrderVo;
import com.niyin.vo.OrderltemVo;
import org.apache.ibatis.annotations.Param;

public interface OrderitemMapper {
    int deleteByPrimaryKey(Integer orderItemId);

    int insert(Orderitem record);

    int insertSelective(Orderitem record);

    Orderitem selectByPrimaryKey(Integer orderItemId);

    int updateByPrimaryKeySelective(Orderitem record);

    int updateByPrimaryKey(Orderitem record);

    OrderltemVo selectByOrderItem(@Param("oiid") Integer oiid);
}

biz

package com.niyin.biz;

import com.niyin.vo.OrderltemVo;
import org.apache.ibatis.annotations.Param;

public interface OrderItemBiz {
    OrderltemVo selectByOrderItem(Integer oiid);

}

impl

package com.niyin.biz.impl;

import com.niyin.biz.OrderItemBiz;
import com.niyin.mapper.OrderitemMapper;
import com.niyin.vo.OrderltemVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class OrderItemBizImpl implements OrderItemBiz {
    @Autowired
    private OrderitemMapper orderitemMapper;
    @Override
    public OrderltemVo selectByOrderItem(Integer oiid) {
        return orderitemMapper.selectByOrderItem(oiid);
    }
}

测试

package com.niyin.biz.impl;

import com.niyin.biz.Hboobiz;
import com.niyin.biz.HcategoryBiz;
import com.niyin.biz.OrderBiz;
import com.niyin.biz.OrderItemBiz;
import com.niyin.vo.CategoryVo;
import com.niyin.vo.HbookVo;
import com.niyin.vo.OrderVo;
import com.niyin.vo.OrderltemVo;
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;

import static org.junit.Assert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})
public class OrderBizImplTest {

    @Autowired
    private OrderBiz orderBiz;
@Autowired
private OrderItemBiz orderItemBiz;

@Autowired
private Hboobiz hboobiz;


@Autowired
private HcategoryBiz hcategoryBiz;
    @Test
    public void selectByOid() {
       OrderVo orderVo= orderBiz.selectByOid(7);
        System.out.println(orderVo);
        orderVo.getOrderitems().forEach(System.out::println);
    }

@Test
    public void selectByOItem() {
   OrderltemVo orderltemVo= orderItemBiz.selectByOrderItem(27);
    System.out.println(orderltemVo);
    System.out.println(orderltemVo.getOrder());
}
@Test
    public void selectBybook(){
    HbookVo hbookVo = this.hboobiz.selectByBookID(8);
hbookVo.getCategories().forEach(System.out::println);
}

    @Test
    public void selectBcid(){
        CategoryVo categoryVo = this.hcategoryBiz.selectBycategoryId(8);
        System.out.println(categoryVo);
        categoryVo.getBooks().forEach(System.out::println);
    }


    }

下面案列均用这个测试类
结果
在这里插入图片描述

上述代码中,定义了orderitem实体的映射规则,表示与User实体关联的Profile实体,通过property属性指定了关联属性的名称,通过javaType属性指定了关联属性的类型。在SQL查询语句中,可以通过JOIN操作获取关联实体的数据。

一对多关联关系配置

一对多关联关系表示一个实体与多个实体之间存在关联关系。在MyBatis中配置一对多关联关系需要使用标签和标签。下面是一个示例:

 <resultMap id="OrderVoMap" type="com.niyin.vo.OrderVo" >
   <result column="order_id" property="orderId"></result>
    <result column="order_no" property="orderNo"></result>
    <collection property="orderitems" ofType="com.niyin.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 * from t_hibernate_order o,
t_hibernate_order_item oi where o.order_id=oi.oid and o.order_id=#{oid}
</select>

vo

package com.niyin.vo;

import com.niyin.model.Order;
import com.niyin.model.Orderitem;

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

public class OrderVo extends Order {

private List<Orderitem> orderitems =new ArrayList<Orderitem>();

    public List<Orderitem> getOrderitems() {
        return orderitems;
    }
    public void setOrderitems(List<Orderitem> orderitems) {
        this.orderitems = orderitems;
    }

}

map

package com.niyin.mapper;

import com.niyin.model.Order;
import com.niyin.vo.OrderVo;
import org.apache.ibatis.annotations.Param;

public interface OrderMapper {
    int deleteByPrimaryKey(Integer orderId);

    int insert(Order record);

    int insertSelective(Order record);

    Order selectByPrimaryKey(Integer orderId);

    int updateByPrimaryKeySelective(Order record);

    int updateByPrimaryKey(Order record);

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

}

biz

package com.niyin.biz;


import com.niyin.vo.OrderVo;
import org.apache.ibatis.annotations.Param;

public interface OrderBiz  {
    OrderVo selectByOid(Integer oid);

}

impl

package com.niyin.biz.impl;

import com.niyin.biz.OrderBiz;
import com.niyin.mapper.OrderMapper;
import com.niyin.vo.OrderVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class OrderBizImpl implements OrderBiz {
@Autowired
private OrderMapper orderMapper;

    @Override
    public OrderVo selectByOid(Integer oid) {
        return orderMapper.selectByOid(oid);
    }
}

结果
在这里插入图片描述

结论

上述代码中,定义了Post实体的映射规则,表示与Post实体关联的Comment实体集合,通过property属性指定了关联属性的名称,通过ofType属性指定了集合中元素的类型。在SQL查询语句中,可以利用外键约束和嵌套查询等方式获取关联实体集合的数据。

多对多关联关系配置

多对多关联关系表示两个实体之间存在互相包含的关系。在MyBatis中配置多对多关联关系需要使用中间表和联合主键。下面是一个示例:

 <resultMap id="HbookMap" type="com.niyin.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.niyin.model.HCategory">

      <result column="category_id" property="categoryId"></result>
      <result column="category_name" property="categoryName"></result>
    </collection>

  </resultMap>

  <select id="selectByBookID" resultMap="HbookMap" 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>

vo

package com.niyin.vo;

import com.niyin.model.HBook;
import com.niyin.model.HCategory;

import java.util.List;

public class HbookVo extends HBook {


    private List<HCategory> categories;

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

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

map

package com.niyin.mapper;

import com.niyin.model.HBook;
import com.niyin.vo.HbookVo;
import org.apache.ibatis.annotations.Param;

public interface HBookMapper {
    int deleteByPrimaryKey(Integer bookId);

    int insert(HBook record);

    int insertSelective(HBook record);

    HBook selectByPrimaryKey(Integer bookId);

    int updateByPrimaryKeySelective(HBook record);

    int updateByPrimaryKey(HBook record);
    HbookVo selectByBookID(@Param("bid") Integer bid) ;
}

biz

package com.niyin.biz;

import com.niyin.vo.HbookVo;
import org.apache.ibatis.annotations.Param;

public interface Hboobiz {
    HbookVo selectByBookID( Integer bid) ;

}

impl

package com.niyin.biz;

import com.niyin.vo.HbookVo;
import org.apache.ibatis.annotations.Param;

public interface Hboobiz {
    HbookVo selectByBookID( Integer bid) ;

}

运行结果
在这里插入图片描述

示例2:

<resultMap id="categoryvoMap" type="com.niyin.vo.CategoryVo">
    <result column="category_id" property="categoryId"></result>
    <result column="category_name" property="categoryName"></result>
    <collection property="books" ofType="com.niyin.model.HBook">
      <result column="book_id" property="bookId"></result>
      <result column="book_name" property="bookName"></result>
      <result column="price" property="price"></result>
    </collection>
  </resultMap>
  
<select id="selectBycategoryId" resultMap="categoryvoMap" 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 c.category_id=#{cid}
</select>


vo

package com.niyin.vo;

import com.niyin.model.HBook;
import com.niyin.model.HCategory;

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

public class CategoryVo extends HCategory {
    private List<HBook>books=new ArrayList<>();

    public List<HBook> getBooks() {
        return books;
    }

    public void setBooks(List<HBook> books) {
        this.books = books;
    }
}

map

package com.niyin.mapper;

import com.niyin.model.HCategory;
import com.niyin.vo.CategoryVo;
import org.apache.ibatis.annotations.Param;

public interface HCategoryMapper {
    int deleteByPrimaryKey(Integer categoryId);

    int insert(HCategory record);

    int insertSelective(HCategory record);

    HCategory selectByPrimaryKey(Integer categoryId);

    int updateByPrimaryKeySelective(HCategory record);

    int updateByPrimaryKey(HCategory record);
    CategoryVo selectBycategoryId(@Param("cid") Integer cid);
}

biz

package com.niyin.biz;

import com.niyin.vo.CategoryVo;
import org.apache.ibatis.annotations.Param;

public interface HcategoryBiz {
    CategoryVo selectBycategoryId(Integer cid);

}

impl

package com.niyin.biz.impl;

import com.niyin.biz.HcategoryBiz;
import com.niyin.mapper.HCategoryMapper;
import com.niyin.vo.CategoryVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class HcategoryBizImpl implements HcategoryBiz {
    @Autowired
    private HCategoryMapper hCategoryMapper;
    @Override
    public CategoryVo selectBycategoryId(Integer cid) {
        return hCategoryMapper.selectBycategoryId(cid);
    }
}

结果
在这里插入图片描述

上述代码中,定义了User实体和Role实体的映射规则,并通过property属性指定了互相关联的属性名称。在SQL查询语句中,需要通过联合主键和中间表来获取两个实体之间的关联数据。

结论

本文介绍了MyBatis中一对一、一对多和多对多关联关系的配置方法和实践经验。在一对一关联关系中,使用标签配置关联属性映射;在一对多关联关系中,使用标签配置关联集合属性映射;在多对多关联关系中,需要通过中间表和联合主键来配置关联关系。通过灵活运用这些配置方法,可以轻松处理各种复杂的关联查询需求。

希望本文能够帮助读者更好地理解和应用MyBatis中的关联关系配置,并在实际项目中发挥作用。感谢阅读!

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

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

相关文章

SAP MTS案例教程AA固定资产后台配置

目录 本章介绍 2 AA通用后台配置 3 检查国家特殊的设置 3 创建折旧表 4 分配折旧表到公司代码 5 指定帐户确定 6 创建屏幕格式规则 7 定义号码范围间隔 8 定义资产分类 9 为资产类别分配总账科目 11 分配非税购置的进项税标识符 13 指定间隔和过帐规则 14 设置当前的折旧表 15…

使用Mybatis实现基本的增删改查------数据输入

创建一个空的Maven项目,删去src,用作存储pom的父项目 pom中存放下列依赖: <dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.11</version></dependency><de…

系列二、Nginx简介

一、概述 Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;处理高并发的能力十分强大&#xff0c;能够经受的住高负载的考验&#xff0c;有报告表明其能支持高达50000个并发连接数。 二、代理分类 2.1、正向代理 如果把局域网外的Internet想象成一个巨大的资源库&#x…

基于SSM的家居商城系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

算法-分治算法

文章来源&#xff1a; https://blog.csdn.net/weixin_45630258/article/details/126425400 欢迎各位大佬指点、三连 一、分治 1、定义&#xff1a;分治&#xff0c;也就是分而治之。 它的一般步骤是&#xff1a; ① 将原问题分解成若干个规模较小的子问题&#xff08;子问题…

【计算机网络】OSI七层网络模型概述及应用举例

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多计算机网络知识专栏&#xff1a;计算机网络&#x1f525; 给大家跳段…

Hadoop分布式模式配置

hadoop环境准备&#xff1a; hadoop下载地址&#xff1a;http://archive.apache.org/dist/hadoop/common/hadoop-3.1.3/hadoop-3.1.3.tar.gz hadoop集群的安装配置大致分为以下六个步骤&#xff1a; 选定一台机器作为master 在master节点上创建hadoop用户、安装ssh服务端、配…

春秋云镜 CVE-2016-0785

春秋云镜 CVE-2016-0785 S2-029 靶标介绍 2.3.28 之前的 Apache Struts 2.x 允许远程攻击者通过标签属性中的“%{}”序列执行任意代码。 启动场景 漏洞利用 工具利用 得到flag flag{a4c7fc9a-8e2d-49b8-9b09-22790fb2bfb6}

APO 载脂蛋白

Apolipoprotein E structure: insights into function-2006 Apolipoprotein E: Structural Insights and Links to Alzheimer Disease Pathogenesis APO-E 突变基因检测&#xff1b; APO-D, APO-M ; lipocalin ; APO-H CCP , 凝血诊断&#xff0c;狼疮抗凝物&#xff0…

Spring框架入门:构建你的第一个Web应用

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Matlab图像处理-多阈值分割

多阈值分割 在某些时候图像使用单独的阈值不能够对其实现有效地分割&#xff0c;例如在灰度直方图中有明显的三个峰时候&#xff0c;我们需要提取中间峰&#xff0c;这时我们使用双阈值分割会得到较好的分割效果。如下例子中生成灰度直方图中有两个峰&#xff0c;选择合适的两…

【strstr函数的介绍和模拟实现——超详细版】

strstr函数的介绍和模拟实现 strstr函数的介绍 资源来源于cplusplus网站 strstr函数声明&#xff1a; char *strstr( const char *str1, const char *str2 ); 它的作用其实就是&#xff1a; 在字符串str1中查找是否含有字符串str2&#xff0c;如果存在&#xff0c;返回str2在…

数据安全服务是什么意思?

数据安全服务是指为保护用户的数据免受未经授权的访问、修改、损坏或泄露的服务。随着信息化的发展&#xff0c;大量的个人和企业数据被存储在网络上&#xff0c;数据安全问题也日益受到关注。数据安全服务旨在帮助用户识别和应对各种潜在的数据安全风险&#xff0c;并提供相应…

支付宝沙箱调用错误

支付宝沙箱调用参数就三个APPID&#xff0c;用户私钥&#xff0c;支付宝公钥&#xff0c; 发送请求需要的配置 alipay: app_id: 2021000122636644 merchant_private_key: 用户私钥 alipay_public_key: 支付宝公钥 sign_type: RSA2 charset: utf-8 gatewayUrl: https://openap…

企业架构LNMP学习笔记30

1、upstream 中server的关键字&#xff1a;语法&#xff1a; upstream中的分发之后的几个关键字&#xff1a; 1&#xff09;backup 备 其他的没有backup标识的都不可用了&#xff0c;才分发到backup&#xff1b; 2&#xff09;down 此条配置&#xff0c;不会被分发到。 syst…

Android Studio实现一笔画完小游戏

文章目录 一、项目概述二、开发环境三、详细设计3.1、数据库设计3.2、普通模式3.3、随机模式3.4、关卡列表 四、运行演示五、项目总结六、源码获取 一、项目概述 Android一笔画完是一种益智游戏&#xff0c;玩家需要从起点开始通过一条连续的线&#xff0c;将图形中所有的方块…

谷歌浏览器书签位置及怎么导入书签

谷歌浏览器书签位置&#xff1f; 在谷歌浏览器地址栏输入chrome://version/ 按回车键打开谷歌浏览器安装信息在显示的个人资料路径查找到Bookmarks文件&#xff0c;及为谷歌浏览器书签文件 谷歌浏览器怎么导入书签&#xff1f; 将Bookmarks加入.html后缀在书签管理器中找到右…

可观测性在灰度发布中的应用

前言 随着云计算的发展、云原生时代的来临&#xff0c;企业数字化转型进程不断深入&#xff0c;应用开发也越来越多地基于微服务化模式&#xff0c;快速迭代的能力使得应用开发更高效、更灵活。同时&#xff0c;也不得不面临应用版本快速升级所带来的的巨大挑战。 传统的发布方…

【数据结构与算法系列3】有序数组的平方 (C++ Python)

给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10] 输出&#xff1a;[0,1,9,16,100] 解释&#xff1a;平方后&#xff0c;数组变为 …

Spring框架的未来:Spring 6的新特性预览

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…