MyBatis关系映射

news2024/11/18 11:37:50

文章目录

  • 前言
  • 一、一对一映射
    • 1.1 创建实体
    • 1.2 xml配置
  • 二、一对多映射
    • 2.1 创建实体
    • 2.2 resultMap配置
    • 2.3 测试
  • 三、 多对多映射
    • 3.1 创建实体
    • 3.2 resultMap配置
    • 3.3 测试

前言

MyBatis是一个Java持久化框架,它提供了一种将数据库表和Java对象之间进行关系映射的方式。这种关系映射可以通过XML配置文件或注解来定义。

在MyBatis中,关系映射是通过Mapper接口和SQL语句来实现的。Mapper接口定义了数据库操作的方法,而SQL语句则定义了具体的数据库操作。

在关系映射中,MyBatis提供了一些注解和XML配置来实现对象和数据库表之间的映射关系。例如,@Table注解可以用于指定Java对象对应的数据库表,@Column注解可以用于指定Java对象属性对应的数据库字段。

此外,MyBatis还支持一对一、一对多、多对一和多对多等复杂的关系映射。通过配置关联关系,可以在查询时自动加载相关联的对象。

一、一对一映射

一对一映射是指数据库中的两个表之间存在一对一的关系,即一个记录在一个表中只对应一个记录在另一个表中的情况。

1.1 创建实体

假设我们有两个表:student(学生表)和 id_card(身份证表)。每个学生只有一个身份证,而每个身份证只属于一个学生。

public class Student {
    private int id;
    private String name;
    private IdCard idCard;

    // 省略构造函数和getter/setter方法
}

public class IdCard {
    private int id;
    private String number;
    private Student student;

    // 省略构造函数和getter/setter方法
}

1.2 xml配置

使用XML配置的方式,可以在Student类对应的中使用标签来定义关联关系:

<resultMap id="studentResultMap" type="com.xqx.model.Student">
    <!-- 省略其他映射配置 -->
    <association property="idCard" javaType="com.xqx.model.IdCard">
        <id property="id" column="id_card_id"/>
        <result property="number" column="id_card_number"/>
    </association>
</resultMap>

通过以上配置,我们可以在查询学生信息时,自动加载关联的身份证信息。

二、一对多映射

一对多映射是指数据库中的两个表之间存在一对多的关系,即一个记录在一个表中对应多个记录在另一个表中的情况。例如,一个订单(Oeder)与一个订单详情(OrderItem)之间的关系。假设我们有以下表结构:
在这里插入图片描述

2.1 创建实体

建立一个OrderVo。OrderVo 类用于表示一个订单及其关联的订单项。

package com.xqx.vo;
 
import com.xqx.model.Order;
import com.xqx.model.OrderItem;
import lombok.Data;
 
import java.util.ArrayList;
import java.util.List;
 
@Data
public class OrderVo extends Order {
    private List<OrderItem> orderItems = new ArrayList<>();
} 

2.2 resultMap配置

    <resultMap id="OrderVoMap" type="com.xqx.vo.OrderVo">
        <result column="order_id" property="orderId"></result>
        <result column="order_no" property="orderNo"></result>
        //多关系使用collection
        <collection property="orderItems" ofType="com.xqx.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>

2.3 测试

OrderMapper

package com.xqx.mapper;
 
import com.xqx.model.Order;
import com.xqx.vo.OrderVo;
import org.springframework.stereotype.Repository;
 
@Repository
public interface OrderMapper {
    
     OrderVo selectbyOid(Integer boid);
 
}

OrderBiz

package com.xqx.biz;
 
import com.xqx.vo.OrderVo;
 
 
public interface OrderBiz {
    OrderVo selectbyOid(Integer boid);
}

OrderBizImpl


package com.xqx.biz;
 
import com.xqx.mapper.OrderMapper;
import com.xqx.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 boid) {
        return OrderMapper.selectbyOid(boid);
    }
}

Junit测试

package com.xqx.biz;
 
import com.xqx.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;
 

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:Spring-context.xml"})
public class OrderBizImplTest {
    @Autowired
    private OrderBiz OrderBiz;
 
    @Test
    public void selectbyOid() {
        OrderVo orderVO = OrderBiz.selectbyOid(7);
        System.out.println(orderVO);
        orderVO.getOrderItems().forEach(System.out::println);
    }
}

测试结果
在这里插入图片描述

三、 多对多映射

多对多映射是指多个对象与多个对象具有多对多的关系。以根据书籍id查找关联属性类别为例
在这里插入图片描述

3.1 创建实体

vo对象

package com.xqx.vo;
 
import com.xqx.model.BookCategory;
import com.xqx.model.Book;
import lombok.Data;
import java.util.List;

@Data
public class BookVo extends Book {
    private List<BookCategory> bookc = new ArrayList<>();
}

3.2 resultMap配置

  <resultMap id="BookVoMap" type="com.xqx.vo.BookVo" >
    <result column="book_id" property="bookId"></result>
    <result column="book_name" property="bookName"></result>
    <result column="price" property="price"></result>
    <collection property="bookc" ofType="com.xqx.model.Category">
      <result column="category_id" property="categoryId"></result>
      <result column="category_name" property="categoryName"></result>
    </collection>
  </resultMap>
 
  <!--根据书籍的id查询书籍的信息及所属属性-->
  <select id="selectByBookId" resultMap="BookVoMap" parameterType="java.lang.Integer">
    SELECT
      *
    FROM
      t_hibernate_book b,
      t_hibernate_category c,
      t_hibernate_book_category bc
    WHERE
      b.book_id = bc.bid
      AND c.category_id = bc.bcid
      AND b.book_id = #{bid}
  </select>

3.3 测试

BookMapper

package com.xqx.mapper;
 
import com.xqx.model.Book;
import com.xqx.vo.BookVo;
import org.springframework.stereotype.Repository;
 
@Repository
public interface BookMapper {
   
    HbookVo selectByBid(Integer bid);
 
}

BookBiz

package com.xqx.biz;
 
import com.xqx.vo.BookVo;
 

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

BookBizImpl

package com.xqx.biz;
 
import com.xqx.mapper.BookMapper;
import com.xqx.vo.BookVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 

@Service
public class BookBizImpl implements BookBiz {
    @Autowired
    private BookMapper BookMapper;
 
    @Override
    public BookVo selectByBid(Integer bid) {
        return BookMapper.selectByBid(bid);
    }
}

junit测试

package com.xqx.biz;
 
import com.xqx.vo.BookVo;
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;
 

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:Spring-context.xml"})
public class BookBizImplTest {
    @Autowired
    private BookBiz BookBiz;
 
    @Test
    public void selectByBid() {
        BookVo bookVo = BookBiz.selectByBid(8);
        System.out.println(bookVo);
        BookVo.getHcategory().forEach(System.out::println);
    }
}

在这里插入图片描述

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

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

相关文章

安全基础 --- js的闭包和this属性

js闭包 简介 一个函数和对其周围状态&#xff08;lexical exviroment&#xff0c;词法环境&#xff09;的引用捆绑在一起&#xff08;或者说函数被引用包围&#xff09;&#xff0c;这样的组合就是闭包&#xff08;closure&#xff09; 在js中&#xff0c;通俗来讲&#xff0c…

计算机毕设 大数据商城人流数据分析与可视化 - python 大数据分析

文章目录 0 前言课题背景分析方法与过程初步分析&#xff1a;总体流程&#xff1a;1.数据探索分析2.数据预处理3.构建模型 总结 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到…

【9月比赛合集】9场可报名的「创新应用」、「数据分析」和「程序设计」大奖赛,任君挑选!

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 创新应用赛&#xff08;2场比赛&#xff09;程序设计赛&#…

openGauss学习笔记-60 openGauss 数据库管理-逻辑存储结构

文章目录 openGauss学习笔记-60 openGauss 数据库管理-逻辑存储结构 openGauss学习笔记-60 openGauss 数据库管理-逻辑存储结构 openGauss的数据库节点负责存储数据&#xff0c;其存储介质也是磁盘&#xff0c;本节主要从逻辑视角介绍数据库节点都有哪些对象&#xff0c;以及这…

无锡布里渊——厘米级分布式光纤-锅炉安全监测解决方案

无锡布里渊——厘米级分布式光纤-锅炉安全监测解决方案 厘米级分布式光纤-锅炉安全监测解决方案 1、方案背景与产品简介&#xff1a; 1.1&#xff1a;背景简介&#xff1a; 锅炉作为一种把煤、石油或天燃气等化石燃料所储藏的化学能转换成水或水蒸气的热能的重要设备&#xff…

音频基础知识

文章目录 前言一、音频基本概念1、音频的基本概念①、声音的三要素②、音量与音调③、几个基本概念④、奈奎斯特采样定律 2、数字音频①、采样②、量化③、编码④、其他相关概念<1>、采样位数<2>、通道数<3>、音频帧<4>、比特率&#xff08;码率&#…

uniapp从零到一的学习商城实战

涵盖的功能&#xff1a; 安装开发工具HBuilder&#xff1a;HBuilderX-高效极客技巧 创建项目步骤&#xff1a; 1.右键-项目&#xff1a; 2.选择vue2和默认模板&#xff1a; 3.完整的项目目录&#xff1a; 微信开发者工具调试&#xff1a; 1.安装微信开发者工具 2.打开…

改变金融贷款市场营销方式 ---- 运营商大数据精准获客

与传统的企业网络营销相比&#xff0c;最常见的是网络推广和硬广告推广。一些企业无法找到可靠准确的数据来源&#xff0c;也无法找到一些未知的总数据。这些数据大多存在持续时间长、准确性差的缺点&#xff0c;企业在将这些数据信息应用于商品在线营销时往往会遇到不足。 在…

什么是RPA机器人?RPA机器人能做什么?RPA机器人的应用场景

什么是RPA机器人&#xff1f; RPA机器人是一种使用软件机器人来模拟和执行人类操作的技术。RPA代表Robotic Process Automation&#xff08;机器人流程自动化&#xff09;。它是一种自动化技术&#xff0c;可以使用预定规则和预定流程来执行重复性、繁琐或规定任务的工作。 RP…

进程的状态与组织

进程的5种状态分别为创建态、就绪态、运行态、阻塞态、终止态。在PCB中&#xff0c;会有一个state变量来记录进程此时所处的状态。 操作系统会根据各种进程的不同状态来组织管理进程&#xff0c;有链接组织方式和索引组织方式。

使用 Linux 相关知识部署博客系统

目录 ​编辑一、认识 Linux 二、如何拥有 Linux 环境 三、常见的 Linux 命令 1、目录相关命令 &#xff08;1&#xff09;ls &#xff08;2&#xff09;pwd &#xff08;3&#xff09;cd 2、文件操作相关命令 &#xff08;1&#xff09;touch &#xff08;2&#xf…

48、springboot 的国际化之让用户在程序界面上弄个下拉框,进行动态选择语言

上一篇是直接改浏览器的支持语言。 在浏览器上面直接改国际化语言 这次要实现的功能是直接在程序界面动态选择语言。 Locale 代表语言、国家。 ★ 在界面上动态改变语言 应用之所以能动态呈现不同的语言界面&#xff0c;其实关键在于如何确定客户端的Locale&#xff08;代…

springboot实战(五)之sql业务日志输出,重要

目录 环境&#xff1a; 一、mybatis-plus之sql分析日志输出 1.配置 2.验证 3.高级输出方式 二、业务日志输出到文件 1.添加log4j2依赖 2.排除logback依赖 3.新增log4j2的配置文件 4.添加配置 5.启动测试 6.给日志请求加个id 6.1、过滤器filter实现 6.2、测试 6.3、…

Linux之基于HTTPS的静态网站

目录 Linux之基于HTTPS的静态网站 定义 SSL协议 使用Apachemod_ssl组件的加密认证网站 mod_ssl模组 安装 配置文件 ssl配置文件的主要参数 案例 案例1 --- 搭建HTTPSSL的加密认证的web服务器 案例2 --- 组建多个子目录的网站www.joker.com&#xff0c;该网站下有2个子…

Android开发中的各种零碎知识点

折叠屏 折叠屏为什么需要适配 折叠屏在视觉效果来说就是&#xff0c;屏幕变大了&#xff0c;手机变平板。这样就需要我们的app在可折叠设备展开时&#xff0c;当前应用页面必须无缝延续到另一个屏幕&#xff0c;并可自动调整大小匹配新的布局&#xff0c;也就是说&#xff0c;应…

护航数字政府建设,美创科技成为“数字政府建设赋能计划”成员单位

近日&#xff0c;“2023软博会-软件驱动数字政府创新发展论坛”顺利召开&#xff0c;本次论坛由中国信息通信研究院、中国通信标准化协会承办&#xff0c;中国通信标准化协会云计算标准和开源推进委员会、数字政府建设赋能计划支持。 天津市工业和信息化局总经济师杨冬梅、中国…

OpenHarmony 使用 ArkUI Inspector 分析布局

● 摘要&#xff1a;视图的嵌套层次会影响应用的性能&#xff0c;开发者应该移除多余的嵌套层次&#xff0c;缩短组件刷新耗时。本文会介绍如何使用 ArkUI Inspector 工具分析布局&#xff0c;提示应用响应性能。 ● 关键字&#xff1a;列举本文相关的关键字&#xff1a;OpenH…

springboot找不到注册的bean

1、错误描述 A component required a bean named ‘fixedAssetsShareMapper’ that could not be found.Action:Consider defining a bean named ‘fixedAssetsShareMapper’ in your configuration.2、问题分析 1、该错误提示表明在你的应用程序中有一个组件&#xff08;可能…

【技术分享】RK Android11系统SD卡启动方法

本文基于Purple Pi OH 3566主板&#xff0c;介绍Android11源码的修改&#xff0c;获得可从SD卡启动的Android11系统镜像。 Purple Pi OH作为一款兼容树莓派的开源主板&#xff0c;采用瑞芯微RK3566 (Cortex-A55) 四核64位超强CPU,主频最高达1.8 GHz,算力高达1Tops&#xff0c;…

stable diffusion实践操作-大模型介绍-SDXL1大模型

系列文章目录 大家移步下面链接中&#xff0c;里面详细介绍了stable diffusion的原理&#xff0c;操作等&#xff08;本文只是下面系列文章的一个写作模板&#xff09;。 stable diffusion实践操作 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生…