点一下关注吧!!!非常感谢!!持续更新!!!
大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html
目前已经更新到了:
- MyBatis(正在更新)
一对多
基本介绍
在数据库设计中,一对多(One-to-Many)的关系是最常见的关系模型之一。它通常用于表示一个实体(表中的一条记录)可以与另一个实体的多条记录相关联的情况。
一对多关系表示一个实体(父表中的一条记录)可以关联到多个实体(子表中的多条记录),而子表中的每条记录只能与父表中的一条记录关联。
一对多优点
数据清晰,关系明确。
数据完整性可以通过外键约束强制维护。
查询灵活,通过关联表可以获取丰富的数据。
一对多缺点
对于复杂查询,可能涉及多次连接(JOIN),性能稍差。
数据模型耦合较紧,当表结构发生变更时,影响范围较大。
查询模型
用户表和订单表的关系为:一个用户有多个订单,一个订单只属于一个用户,一对多查询的需求:查询一个用户,与此同时查询出该用户具有的订单。
实现方式
数据库约束
外键约束(FOREIGN KEY)确保子表的外键值必须是主表中存在的主键值。
级联操作
ON DELETE CASCADE:如果删除主表中的记录,子表中的相关记录也会被删除。
ON UPDATE CASCADE:如果主表中的主键被更新,子表中的外键也会相应更新。
对应特点
- 单向性:一侧是"一个",另一侧是"多个"。
- 关联约束:多的一侧的每条记录只能关联到一的一侧的一条记录,但一的一侧可以关联多条记录。
- 典型场景:用户与订单(一个用户可以有多个订单)、学校与学生(一所学校可以有多个学生)。
创建表
表之前已经创建出来了。这里跳过了。
插入数据
数据之前已经写入。这里跳过了。
查询语句
sql
select *,o.id oid from wzk_user u left join wzk_orders o on u.id=o.uid;
执行结果如下所示:
创建类
实体类已经创建了,这里跳过。
但是需要进行修改。
WzkUser
java
@Data
@AllArgsConstructor
@NoArgsConstructor
public class WzkUser {
private int id;
private String username;
private String password;
private Date birthday;
private List<WzkOrder> orderList;
}
对应的截图如下所示:
UserMapper
java
public interface UserMapper {
List<WzkUser> findAll();
}
对应的截图如下所示:
UserMapper.xml
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 文件。
xml
<mappers>
<mapper resource="mapper.xml"/>
<mapper resource="OrderMapper.xml"/>
<mapper resource="UserMapper.xml"/>
</mappers>
对应的截图如下所示:
编写代码
java
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();
}
}
编写的代码截图如下所示:
运行结果
控制台运行结果如下所示:
shell
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)])
对应的控制台如下所示:
优化与注意事项
索引优化
为外键字段添加索引以提高查询性能。
数据完整性
外键约束确保数据一致性,但在高并发场景下可能降低性能,因此可以选择通过程序逻辑维护。
设计扩展性
考虑未来是否会转变为多对多关系(例如:一个订单包含多个商品),在设计时预留扩展空间。
暂时小结
总结来说,一对多模型是关系型数据库中最基本、最常用的关系之一,它清晰地表达了实体间的层级关系。通过合理设计表结构、优化查询和索引,可以高效管理和操作这些数据关系。