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

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

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

在这里插入图片描述

目前已经更新到了:

  • MyBatis(正在更新)

一对一

数据库中的 1对1 模型

在数据库设计中,1对1模型(One-to-One Relationship)是一种实体关系,用于表示两张表之间一条记录只能关联另一张表中的一条记录的关系。

1对1关系的特点

  • 唯一性:表A中的每一行记录只能与表B中的一行记录关联,反之亦然。
  • 严格的映射:两张表的数据关系是一一对应的。
  • 逻辑层面:通常用于将一个实体的不同属性分离存储。

常见的应用场景

  • 数据拆分:用于将经常访问的字段和不经常访问的字段分离,以优化性能。例如,用户的基本信息和敏感信息可以分表存储。表1:用户信息(如用户名、邮箱)、表2:用户敏感信息(如身份证号、密码)
  • 权限控制:例如,存储一个用户及其角色权限配置,用户和权限之间通常是一对一关系。
  • 扩展功能:将一个主表的扩展数据存储到另一张表,以便灵活扩展数据结构。

优点分析

  • 模块化设计:将数据分成不同表,便于维护和管理。
  • 安全性提升:敏感信息可以单独存储并设置更高的权限控制。
  • 性能优化:分表存储减少单表的数据量,提升查询效率。

缺点分析

  • 查询复杂性增加:需要进行表的连接查询(JOIN),可能增加性能开销。
  • 维护难度加大:需要严格设计和维护表之间的关系,避免数据不一致。
  • 事务管理成本:跨表操作需要在事务中处理,以确保数据一致性。

查询模型

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户,此时查询一个订单,与此同时查询出改订单的所属用户。
在这里插入图片描述

创建表

CREATE TABLE `wzk_orders` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`ordertime` varchar(255) DEFAULT NULL,`total` double DEFAULT NULL,`uid` int(11) DEFAULT NULL,![请添加图片描述](https://i-blog.csdnimg.cn/direct/2ca17a1cb011482d922a9c970d8dff81.png)PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;CREATE TABLE `wzk_user` (`id` int(11) NOT NULL,`username` varchar(255) DEFAULT NULL,`password` varchar(255) DEFAULT NULL,`birthday` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;

插入数据

wzk_user 表数据如下:
在这里插入图片描述
wzk_orders 表数据如下:
在这里插入图片描述

查询语句

对应的 SQL 语句如下:

select * from wzk_orders o, wzk_user u where o.uid=u.id

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

创建类

WzkOrder

@Data
@AllArgsConstructor
@NoArgsConstructor
public class WzkOrder {private int id;private Date ordertime;private double total;private WzkUser user;
}

WzkUser

@Data
@AllArgsConstructor
@NoArgsConstructor
public class WzkUser {private int id;private String username;private String password;private Date birthday;
}

OrderMapper

public interface OrderMapper {List<WzkOrder> findAll();}

OrderMapper.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.OrderMapper"><!-- 写法一 --><resultMap id="orderMap" type="icu.wzk.model.WzkOrder"><result column="uid" property="user.id"></result><result column="username" property="user.username"></result><result column="password" property="user.password"></result><result column="birthday" property="user.birthday"></result></resultMap><!-- 写法二 -->
<!--    <resultMap id="orderMap" type="icu.wzk.model.WzkOrder">-->
<!--        <result property="id" column="id"></result>-->
<!--        <result property="ordertime" column="ordertime"></result>-->
<!--        <result property="total" column="total"></result>-->
<!--        <association property="user" javaType="icu.wzk.model.WzkUser">-->
<!--            <result column="uid" property="id"></result>-->
<!--            <result column="username" property="username"></result>-->
<!--            <result column="password" property="password"></result>-->
<!--            <result column="birthday" property="birthday"></result>-->
<!--        </association>-->
<!--    </resultMap>--><select id="findAll" resultMap="orderMap">select * from wzk_orders o, wzk_user u where o.uid=u.id</select>
</mapper>

sqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><properties><property name="driverClass" value="com.mysql.cj.jdbc.Driver"/><property name="jdbcUrl" value="jdbc:mysql://172.16.1.130:3306/wzk-mybatis?characterEncoding=utf-8"/><property name="user" value="hive"/><property name="password" value="hive@wzk.icu"/></properties><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driverClass}"/><property name="url" value="${jdbcUrl}"/><property name="username" value="${user}"/><property name="password" value="${password}"/></dataSource></environment></environments><mappers><mapper resource="mapper.xml"/><!-- 新增的 OrderMapper --><mapper resource="OrderMapper.xml"/></mappers>
</configuration>

编写代码

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

编写的代码如下图所示:
在这里插入图片描述

运行结果

运行之后,对应的控制台输出结果如下:

24/11/12 16:51:34 DEBUG OrderMapper.findAll: <==      Total: 3
WzkOrder(id=1, ordertime=Mon Nov 11 00:00:00 CST 2024, total=100.0, user=WzkUser(id=1, username=wzk, password=icu, birthday=Mon Nov 11 00:00:00 CST 2024))
WzkOrder(id=2, ordertime=Mon Nov 11 00:00:00 CST 2024, total=200.0, user=WzkUser(id=1, username=wzk, password=icu, birthday=Mon Nov 11 00:00:00 CST 2024))
WzkOrder(id=3, ordertime=Sun Nov 10 00:00:00 CST 2024, total=150.0, user=WzkUser(id=2, username=wzk2, password=icu2, birthday=Mon Nov 11 00:00:00 CST 2024))

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

注意事项

  • 数据一致性:必须确保表A和表B之间的引用完整性,避免孤立记录(Orphan Records)。
  • 索引设计:为外键列创建索引,以提升连接查询性能。
  • 场景适配:如果没有明显的1对1关系需求,建议尽量避免使用,以简化设计。

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

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

相关文章

css使用弹性盒,让每个子元素平均等分父元素的4/1大小

css使用弹性盒&#xff0c;让每个子元素平均等分父元素的4/1大小 原本&#xff1a; ul {padding: 0;width: 100%;background-color: rgb(74, 80, 62);display: flex;justify-content: space-between;flex-wrap: wrap;li {/* 每个占4/1 */overflow: hidden;background-color: r…

佛山三水戴尔R740服务器黄灯故障处理

1&#xff1a;佛山三水某某大型商场用户反馈一台DELL PowerEdge R740服务器近期出现了黄灯警告故障&#xff0c;需要冠峰工程师协助检查故障灯原因。 2&#xff1a;工程师协助该用户通过笔记本网线直连到服务器尾部的IDRAC管理端口&#xff0c;默认ip 192.168.0.120 密码一般在…

视频对接rtsp协议学习

RTSP协议在视频平台中的应用‌ RTSP&#xff08;Real Time Streaming Protocol&#xff09;是一种基于TCP/IP的应用层协议&#xff0c;主要用于控制流媒体数据的传输和播放。它通过定义一系列命令和请求&#xff0c;实现对流媒体服务器的远程控制&#xff0c;但不传输媒体数据…

[ 应急响应进阶篇-1 ] Windows 创建后门并进行应急处置(后门账户\计划任务后门\服务后门\启动项后门\粘贴键后门)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

力扣 LeetCode 513. 找树左下角的值(Day8:二叉树)

解题思路&#xff1a; 方法一&#xff1a;递归法&#xff08;方法二更好理解&#xff0c;个人更习惯方法二&#xff09; 前中后序均可&#xff0c;实际上没有中的处理 中左右&#xff0c;左中右&#xff0c;左右中&#xff0c;实际上都是左在前&#xff0c;所以遇到的第一个…

基于web的教务系统的实现(springboot框架 mysql jpa freemarker)

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

深度学习(1)

一、torch的安装 基于直接设备情况&#xff0c;选择合适的torch版本&#xff0c;有显卡的建议安装GPU版本&#xff0c;可以通过nvidia-smi命令来查看显卡驱动的版本&#xff0c;在官网中根据cuda版本&#xff0c;选择合适的版本号&#xff0c;下面是安装示例代码 GPU&#xff…

vue学习11.21

vue特点&#xff1a; 采用组件化开发&#xff0c;提高代码复用率和维护 声明式编码&#xff0c;不需要直接操作DOM元素 使用diff算法&#xff0c;把虚拟DOM变成真实DOM&#xff0c; 如果两个容器都用vue的实例&#xff0c;只选最上面的容器。 一个容器使用两个vue实例也不行…

【数据分享】中国汽车工业年鉴(1986-2023)

本年鉴是由工业和信息化部指导&#xff0c;中国汽车技术研究中心有限公司与中国汽车工业协会联合主办。《年鉴》是全面、客观记载中国汽车工业发展与改革历程的重要文献&#xff0c;内容涵盖汽车产业政策、标准、企业、市场以及全国各省市汽车工业发展情况&#xff0c;并调查汇…

Java项目实战II基于微信小程序的南宁周边乡村游平台(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着城市化…

深入理解Redis(七)----Redis实现分布式锁

基于Redis的实现方式 1、选用Redis实现分布式锁原因&#xff1a; &#xff08;1&#xff09;Redis有很高的性能&#xff1b; &#xff08;2&#xff09;Redis命令对此支持较好&#xff0c;实现起来比较方便 2、使用命令介绍&#xff1a; &#xff08;1&#xff09;SETNX SETNX …

在 CentOS 7 上安装 MinIO 的步骤

在 CentOS 7 上安装 MinIO 的步骤 在 CentOS 7 上安装 MinIO 的步骤1. 更新系统2. 安装依赖3. 下载 MinIO4. 赋予执行权限5. 移动 MinIO 到系统路径6. 创建 MinIO 用户7. 创建数据目录8. 创建 MinIO 服务文件9. 启动 MinIO 服务10. 设置开机自启11. 访问 MinIO12. 配置防火墙&a…

汽车资讯新视角:Spring Boot技术革新

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

如何创建一个项目用于研究element-plus的原理

需求&#xff1a;直接使用element-plus未封装成组件的源码&#xff0c;创建一个项目&#xff0c;可以使用任意的element-plus组件&#xff0c;可以深度研究组件的运行。例如研究某一个效果&#xff0c;如果直接在node_modules修改elment-plus打包之后的那些js、mjs代码&#xf…

SQL进阶技巧:如何进行数字范围统计?| 货场剩余货位的统计查询方法

目录 0 场景描述 1 剩余空位区间和剩余空位编号统计分析 2 查找已用货位区间 3 小结 0 场景描述 这是在做一个大型货场租赁系统时遇到的问题&#xff0c;在计算货场剩余存储空间时&#xff0c;不仅仅需要知道哪些货位是空闲的&#xff0c;还要能够判断出哪些货位之间是连…

【React 进阶】掌握 React18 全部 Hooks

一、数据更新驱动 1. useState 1. 基础介绍 useState主要用于声明和操作状态变量&#xff0c;可以使函数组件像类组件一样拥有state const [state, setState] useState(initialState);state&#xff1a;状态&#xff0c;作为渲染视图的数据源 setState&#xff1a;改变st…

Kotlin的data class

在 Kotlin 中&#xff0c;data class 是一种专门用来存储数据的类。与普通类相比&#xff0c;data class 提供了简化数据存储的语法&#xff0c;并且自动生成了一些常用的方法&#xff0c;例如 toString()、equals()、hashCode() 和 copy()。 1. 定义 data class data class …

菜鸟驿站二维码/一维码 取件识别功能

特别注意需要引入 库文 ZXing 可跳转&#xff1a; 记录【WinForm】C#学习使用ZXing.Net生成条码过程_c# zxing-CSDN博客 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static System.Net.…

2024年亚太地区数学建模大赛D题-探索量子加速人工智能的前沿领域

量子计算在解决复杂问题和处理大规模数据集方面具有巨大的潜力&#xff0c;远远超过了经典计算机的能力。当与人工智能&#xff08;AI&#xff09;集成时&#xff0c;量子计算可以带来革命性的突破。它的并行处理能力能够在更短的时间内解决更复杂的问题&#xff0c;这对优化和…

教程 - 在 Creo Elements/Pro 中使用 Mechanica 分析杆的 von-mises 应力?

这是教程。 步骤1&#xff1a; 在“零件”模式下启动 Creo Elements/Pro。 步骤2&#xff1a; 草绘>>顶平面并绘制一个直径为 20mm 的圆。 步骤3&#xff1a; 将其挤出 200 毫米。 步骤4&#xff1a; 应用>>机械. 步骤5&#xff1a; 单击“确定”&…