点一下关注吧!!!非常感谢!!持续更新!!!
大数据篇正在更新!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 leftjoin wzk_orders o on u.id=o.uid;
执行结果如下所示:
创建类
实体类已经创建了,这里跳过。
但是需要进行修改。
WzkUser
@Data@AllArgsConstructor@NoArgsConstructorpublicclassWzkUser{privateint id;privateString username;privateString password;privateDate birthday;privateList<WzkOrder> orderList;}
对应的截图如下所示:
UserMapper
publicinterfaceUserMapper{List<WzkUser>findAll();}
对应的截图如下所示:
UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="icu.wzk.mapper.UserMapper"><resultMapid="userMap"type="icu.wzk.model.WzkUser"><resultcolumn="id"property="id"></result><resultcolumn="username"property="username"></result><resultcolumn="password"property="password"></result><resultcolumn="birthday"property="birthday"></result><collectionproperty="orderList"ofType="icu.wzk.model.WzkOrder"><resultcolumn="oid"property="id"></result><resultcolumn="ordertime"property="ordertime"></result><resultcolumn="total"property="total"></result></collection></resultMap><selectid="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><mapperresource="mapper.xml"/><mapperresource="OrderMapper.xml"/><mapperresource="UserMapper.xml"/></mappers>
对应的截图如下所示:
编写代码
publicclassWzkIcu09{publicstaticvoidmain(String[] args)throwsIOException{InputStream resourceAsStream =Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory =newSqlSessionFactoryBuilder().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)])
对应的控制台如下所示:
优化与注意事项
索引优化
为外键字段添加索引以提高查询性能。
数据完整性
外键约束确保数据一致性,但在高并发场景下可能降低性能,因此可以选择通过程序逻辑维护。
设计扩展性
考虑未来是否会转变为多对多关系(例如:一个订单包含多个商品),在设计时预留扩展空间。
暂时小结
总结来说,一对多模型是关系型数据库中最基本、最常用的关系之一,它清晰地表达了实体间的层级关系。通过合理设计表结构、优化查询和索引,可以高效管理和操作这些数据关系。
版权归原作者 武子康 所有, 如有侵权,请联系我们删除。