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

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 mapper
        PUBLIC "-//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)])

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

优化与注意事项

索引优化

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

数据完整性

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

设计扩展性

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

暂时小结

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


http://www.kler.cn/a/405543.html

相关文章:

  • 第 24 章 -Golang 性能优化
  • AI在虚拟展厅的应用有哪些?有何优势?
  • java基础概念37:正则表达式2-爬虫
  • 染色质重塑与心衰中的细胞间通讯机制:解读一篇Nature力作
  • 【电路笔记 TMS320F28335DSP】时钟+看门狗+相关寄存器(功能模块使能、时钟频率配置、看门狗配置)
  • 当产业经济插上“数字羽翼”,魔珐有言AIGC“3D视频创作大赛”成功举办
  • 前端知识点---rest(javascript)
  • 【代码随想录day38】【C++复健】322. 零钱兑换;279.完全平方数;139.单词拆分;卡码网56. 携带矿石资源
  • 力扣 LeetCode 257. 二叉树的所有路径(Day8:二叉树)
  • 泷羽sec-星河飞雪-shell-7
  • 演讲回顾丨杭州悦数 CTO 叶小萌:图数据库发展新航向——拥抱 GQL,融合 HTAP,携手 AI
  • git config 指令详解
  • C#开发基础之借用dotnet CLI命令行参数的设计了解命令行构建用法
  • Android 在Android.bp或Android.mk文件移除原生内置应用
  • 服务器数据恢复—raid5阵列热备盘上线失败导致EXT3文件系统不可用的数据恢复案例
  • Lumerical脚本——创建基本结构
  • comprehension
  • python文件对象方法
  • @PermitAll注解和@PreAuthorize注解
  • Next.js 开发教程(三):CSS 样式的完整指南
  • VLAN资源池(Java Python JS C++ C )
  • 如何在 React 项目中应用 TypeScript?应该注意那些点?结合实际项目示例及代码进行讲解!
  • 已解决centos7 yum报错:cannot find a valid baseurl for repo:base/7/x86_64的解决方案
  • 【c++笔试强训】(第十六篇)
  • JAVA八股与代码实践----接口与抽象类的区别和用法
  • 利用KDJ指标显示多空K线(附带源码)