当前位置: 首页 > news >正文

Java-07 深入浅出 MyBatis - 一对多模型 SqlMapConfig 与 Mapper 详细讲解测试

点一下关注吧!!!非常感谢!!持续更新!!!

大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html

在这里插入图片描述

目前已经更新到了:

  • MyBatis(正在更新)

一对多

基本介绍

在数据库设计中,一对多(One-to-Many)的关系是最常见的关系模型之一。它通常用于表示一个实体(表中的一条记录)可以与另一个实体的多条记录相关联的情况。
一对多关系表示一个实体(父表中的一条记录)可以关联到多个实体(子表中的多条记录),而子表中的每条记录只能与父表中的一条记录关联。

一对多优点

数据清晰,关系明确。
数据完整性可以通过外键约束强制维护。
查询灵活,通过关联表可以获取丰富的数据。

一对多缺点

对于复杂查询,可能涉及多次连接(JOIN),性能稍差。
数据模型耦合较紧,当表结构发生变更时,影响范围较大。

查询模型

在这里插入图片描述
用户表和订单表的关系为:一个用户有多个订单,一个订单只属于一个用户,一对多查询的需求:查询一个用户,与此同时查询出该用户具有的订单。

实现方式

数据库约束

外键约束(FOREIGN KEY)确保子表的外键值必须是主表中存在的主键值。

级联操作

ON DELETE CASCADE:如果删除主表中的记录,子表中的相关记录也会被删除。
ON UPDATE CASCADE:如果主表中的主键被更新,子表中的外键也会相应更新。

对应特点

  • 单向性:一侧是“一个”,另一侧是“多个”。
  • 关联约束:多的一侧的每条记录只能关联到一的一侧的一条记录,但一的一侧可以关联多条记录。
  • 典型场景:用户与订单(一个用户可以有多个订单)、学校与学生(一所学校可以有多个学生)。

创建表

表之前已经创建出来了。这里跳过了。

插入数据

数据之前已经写入。这里跳过了。

查询语句

select *,o.id oid from wzk_user u left join wzk_orders o on u.id=o.uid;

执行结果如下所示:
在这里插入图片描述

创建类

实体类已经创建了,这里跳过。
但是需要进行修改。

WzkUser

@Data
@AllArgsConstructor
@NoArgsConstructor
public class WzkUser {private int id;private String username;private String password;private Date birthday;private List<WzkOrder> orderList;
}

对应的截图如下所示:
在这里插入图片描述

UserMapper

public interface UserMapper {List<WzkUser> findAll();
}

对应的截图如下所示:
在这里插入图片描述

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="icu.wzk.mapper.UserMapper"><resultMap id="userMap" type="icu.wzk.model.WzkUser"><result column="id" property="id"></result><result column="username" property="username"></result><result column="password" property="password"></result><result column="birthday" property="birthday"></result><collection property="orderList" ofType="icu.wzk.model.WzkOrder"><result column="oid" property="id"></result><result column="ordertime" property="ordertime"></result><result column="total" property="total"></result></collection></resultMap><select id="findAll" resultMap="userMap">select *,o.id oid from wzk_user u left join wzk_orders o on u.id=o.uid;</select>
</mapper>

对应的截图如下所示:
在这里插入图片描述

sqlMapConfig.xml

现在注意,记得修改sqlMapConfig 文件。

<mappers><mapper resource="mapper.xml"/><mapper resource="OrderMapper.xml"/><mapper resource="UserMapper.xml"/>
</mappers>

对应的截图如下所示:
在这里插入图片描述

编写代码

public class WzkIcu09 {public static void main(String[] args) throws IOException {InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);List<WzkUser> dataList = userMapper.findAll();dataList.forEach(System.out::println);sqlSession.close();}
}

编写的代码截图如下所示:
在这里插入图片描述
运行结果
控制台运行结果如下所示:

24/11/12 17:12:41 DEBUG UserMapper.findAll: <==      Total: 3
WzkUser(id=1, username=wzk, password=icu, birthday=Mon Nov 11 00:00:00 CST 2024, orderList=[WzkOrder(id=1, ordertime=Mon Nov 11 00:00:00 CST 2024, total=100.0, user=null), WzkOrder(id=2, ordertime=Mon Nov 11 00:00:00 CST 2024, total=200.0, user=null)])
WzkUser(id=2, username=wzk2, password=icu2, birthday=Mon Nov 11 00:00:00 CST 2024, orderList=[WzkOrder(id=3, ordertime=Sun Nov 10 00:00:00 CST 2024, total=150.0, user=null)])

对应的控制台如下所示:
在这里插入图片描述

优化与注意事项

索引优化

为外键字段添加索引以提高查询性能。

数据完整性

外键约束确保数据一致性,但在高并发场景下可能降低性能,因此可以选择通过程序逻辑维护。

设计扩展性

考虑未来是否会转变为多对多关系(例如:一个订单包含多个商品),在设计时预留扩展空间。

暂时小结

总结来说,一对多模型是关系型数据库中最基本、最常用的关系之一,它清晰地表达了实体间的层级关系。通过合理设计表结构、优化查询和索引,可以高效管理和操作这些数据关系。

相关文章:

Java-07 深入浅出 MyBatis - 一对多模型 SqlMapConfig 与 Mapper 详细讲解测试

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…...

用CAXA CAD电子图板导入图框、标题栏并导出pdf的方法

1.导入图框&#xff1a; 点击调入图框->出现读入图框文件 一个一个点击&#xff0c;选择合适的图框 然后点击导入 2.导入标题栏&#xff1a; 调入标题栏->出现读入标题栏文件 一个一个点击&#xff0c;选择合适的标题栏&#xff0c;然后点击导入 3.导出pdf&#x…...

深入了解 Linux htop 命令:功能、用法与示例

文章目录 深入了解 Linux htop 命令&#xff1a;功能、用法与示例什么是 htop&#xff1f;htop 的安装htop的基本功能A区&#xff1a;系统资源使用情况B区&#xff1a;系统概览信息C区&#xff1a;进程列表D区&#xff1a;功能键快捷方式 与 top 的对比常见用法与示例实际场景应…...

JDK1.8新增特性

新特性&#xff1a; Lambda表达式: &#xff08;语法三要素&#xff1a;参数、箭头、代码&#xff09; JDK1.8引入的一种新语法Lambda表达式,它简化了匿名内部类的使用和提高代码的可读性。 /**正常写法创建Runable**/ Runnable runnable new Runnable() {Overridepublic voi…...

环境背景文本到语音转换

目录 概述演示效果核心逻辑使用方式 概述 本文所涉及的所有资源的获取方式&#xff1a;https://www.aspiringcode.com/content?id100000000027&uid2f1061526e3a4548ab2e111ad079ea8c 论文标题&#xff1a; 本文提出了 VoiceLDM&#xff0c;这是一种旨在生成准确遵循两种…...

后端数据增删改查基于Springboot+mybatis mysql 时间根据当时时间自动填充,数据库连接查询不一致,mysql数据库连接不好用

目录 后端数据增删改查Springboot 实体&#xff08;entity&#xff09;类引进添加UserMapper接口 创建对用的UserController注意数据库查询不一致新增数据更新删除postman测试 后端数据增删改查 基于之前构建系统&#xff0c;实现用户数据的CRUD。 打开navicat16&#xff0c;…...

《Python编程实训快速上手》第九天--调试技巧

一、抛异常 异常类型分为两类&#xff0c;第一类是Python自带的异常类型&#xff08;见《Python编程快速上手》第一天---前三章打基础&#xff09;&#xff0c;第二类是自定义异常。 面对自定义异常类型&#xff0c;使用raise抛异常&#xff0c;类型值默认为Exception&#x…...

html5复习一

目标 1、html5介绍及开发工具 2、html5标签 3、文本样式 4、图片标签和超链接标签 知识点&#xff1a; 万维网的构成&#xff1a; 1、url:统一资源定位器 2、http/https:超文本传输协议 3、html&#xff1a;超文本标记语言 html的后缀名&#xff1a; .html 和 .htm html基本…...

SSL/TLS,SSL,TLS分别是什么

SSL/TLS&#xff0c;SSL&#xff0c;TLS分别是什么 SSL&#xff08;Secure Sockets Layer&#xff0c;安全套接层&#xff09; 定义与发展历程&#xff1a; SSL 是一种早期的网络安全协议&#xff0c;旨在为网络通信提供保密性、数据完整性和身份验证等安全保障。它最初由网景…...

css iframe标签使用

<iframe> 标签用于在网页中嵌入另一个 HTML 页面。它非常灵活&#xff0c;可用于嵌入内容&#xff0c;比如其他网站、视频、地图等。以下是有关 <iframe> 的详细介绍及使用方法&#xff1a; 基本语法 <iframe src"URL" width"宽度" height…...

API的妙用

我们都知道&#xff0c;通过使用API可以快速开发部署应用&#xff0c;不需要从头开始收集处理数据。能够很好地提高效率。 一、加速应用程序开发和部署 通过调用API接口&#xff0c;可以快速获取数据、实现功能或整合其他服务&#xff0c;无需从零开始编写大量的代码&#xf…...

HTML5超酷响应式视频背景动画特效(六种风格,附源码)

文章目录 1.设计来源1.1 大气蓬勃动态背景界面效果1.2 星空闪闪动态背景界面效果1.3 眼神深眸动态背景界面效果1.4 星空银河动态背景界面效果1.5 花开花落动态背景界面效果1.6 海底世界动态背景界面效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开…...

Spire.PDF for .NET【页面设置】演示:打开 PDF 时自动显示书签或缩略图

用户打开 PDF 文档时&#xff0c;他们会看到 PDF 的初始视图。默认情况下&#xff0c;打开 PDF 时不会显示书签面板或缩略图面板。在本文中&#xff0c;我们将演示如何设置文档属性&#xff0c;以便每次启动文件时都会打开书签面板或缩略图面板。 Spire.PDF for .NET 是一款独…...

算法中常用到的数学知识:埃拉托色尼筛法(获取质数)、欧几里得算法(求两个数最大公因数)

不管是在项目中还是面试时&#xff0c;一定的算法能力都是极其重要的。大多数算法只要有一定的基础&#xff0c;给足够的时间是可以写出来的&#xff0c;然而有一类算法&#xff0c;说难也不难&#xff0c;说简单也不简单&#xff0c;这种算法通常涉及到某种数学知识&#xff0…...

实战OpenCV之人脸识别

基础入门 随着计算机视觉技术和深度学习的发展,人脸识别已经成为一项广泛应用的技术,涵盖了从安全监控、身份验证、智能家居到大型公共安全项目等多个领域。 人脸识别技术通常包括以下几个主要步骤。 图像采集:通过摄像头或其他图像采集设备,捕获包含人脸的图像或视频帧。 …...

图像预处理之图像滤波

目录 图像滤波概览 均值滤波&#xff08;Mean Filter&#xff09; 中值滤波&#xff08;Median Filter&#xff09; 高斯滤波&#xff08;Gaussian Filter&#xff09; 双边滤波&#xff08;Bilateral Filter&#xff09; 方框滤波&#xff08;Box Filter&#xff09; S…...

【通俗理解】隐变量的变分分布探索——从公式到应用

【通俗理解】隐变量的变分分布探索——从公式到应用 关键词提炼 #隐变量 #变分分布 #概率模型 #公式推导 #期望最大化 #机器学习 #变分贝叶斯 #隐马尔可夫模型 第一节&#xff1a;隐变量的变分分布的类比与核心概念【尽可能通俗】 隐变量的变分分布就像是一场“捉迷藏”游戏…...

PyTorch 分布式并行计算

0. Abstract 使用 PyTorch 进行多卡训练, 最简单的是 DataParallel, 仅仅添加一两行代码就可以使模型在多张 GPU 上并行地计算. 但它是比较老的方法, 官方推荐使用新的 Distributed Data Parallel, 更加灵活与强大: 1. Distributed Data Parallel (DDP) 从一个简单的非分布…...

[cg] vulkan external_memory

最近在写硬件编码的代码&#xff0c;渲染器渲染出的RT需要给到编码器做硬编&#xff0c;有两种方法能做。 一是通过 map的方式&#xff0c;把显存里的数据读到cpu&#xff0c;拷贝一份cpu data给编码器&#xff0c;但这种方式会有内存拷贝的开销。所以&#xff0c;我们思考是否…...

如何使用Python代码实现给GPU预加热

如何使用Python代码实现给GPU预加热 一、引言二、使用深度学习框架进行预加热2.1 TensorFlow预加热2.2 PyTorch预加热三、使用CUDA进行预加热四、预加热的效果评估与优化五、结论与展望在高性能计算和深度学习领域,GPU(图形处理器)已经成为不可或缺的加速工具。然而,在实际…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...