Mybatis10:多对一处理

本文详细介绍了在数据库设计中如何处理多对一的关系,包括学生与老师之间的关系建模,通过MyBatis进行查询映射,以及在MySQL中实现多对一查询的具体方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

10、多对一处理

多对一:

在这里插入图片描述

  • 多个学生,对应一个老师

  • 对于学生而言:关联,多个学生关联一个老师

  • 对于老师而言:集合,一个老师,有很多学生

在这里插入图片描述

INSERT INTO teacher(`id`, `name`) VALUES (1, '秦老师');

CREATE TABLE `student` (
`id` INT(10) NOT NULL,
`name` VARCHAR(30) DEFAULT NULL,
`tid` INT(10) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fktid` (`tid`),
CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8


INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('1', '小明', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('2', '小红', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('3', '小张', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('4', '小李', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('5', '小王', '1');

SHOW TABLES;

SELECT * FROM student;

10.1、测试环境搭建

  1. 导入Lombok

  2. 新建实体类:Student、Teacher

  3. 建立Mapper接口

  4. 建立Mapper.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="cn.edu.cxtc.dao.TeacherMapper">
    
    </mapper>
    
  5. 在核心配置文件中注册绑定我们的Mapper接口或者接口的配置文件 -->三种方式

    <!--绑定配置文件-->
    <!--<mappers>-->
    <!--<mapper resource="cn/edu/cxtc/dao/StudentMapper.xml"></mapper>-->
    <!--<mapper resource="cn/edu/cxtc/dao/TeacherMapper.xml"></mapper>-->
    <!--</mappers>-->
    
    <!-- 将包内的映射器接口实现全部注册为映射器 -->
    <mappers>
        <package name="cn.edu.cxtc.dao"></package>
    </mappers>
    
  6. 测试查询是否能能够成功

10.2、按照查询嵌套处理

<resultMap id="StudentTeacher" type="student">
	<result property="id" column="id"/>
	<result property="name" column="name"/>
	<!--复杂的属性,我们需要单独处理,association:对象 collection:集合-->
	<association property="teacher" column="tid" javaType="teacher" select="getTeacher"/>
</resultMap>

<select id="findAll" resultMap="StudentTeacher">
	select * from mybatisdb.student;
</select>

<select id="getTeacher" resultType="teacher">
	select * from mybatisdb.teacher;
</select>
//在resultMap中,property是实体类中的属性,column是数据库中的字段属性
<resultMap id="StudentTeacher" type="student">
	<result property="id" column="id"/>
	<result property="name" column="name"/>
</resultMap>

10.3、mysql中多对一的查询方式

  • 子查询

    select id, name, tid from student where tid = (select tid from teacher where id = ?);
    
  • 连表查询

    select id, name, tid from student s, teacher t where s.tid = t.id;
    
### 什么是脏数据 脏数据指的是在一个事务取到了其他并发事务尚未提交的数据,这可能导致取到的数据并不准确或有效[^1]。具体来说,在分布式系统或数据库环境中,当两个或多个进程试图同时访问并修改相同的数据项时,如果没有适当的控制机制,则可能出现这种情况。 对于Redis这样的内存缓存系统而言,脏数据通常指其内部存储的内容与底层持久化数据库之间的状态不同步所造成的差异。例如,由于网络延迟或其他因素影响,使得某些更新未能及时同步至所有副本节点上,从而引发一致性问题[^2]。 ### 如何脏数据 在默认情况下,大多数关系型数据库管理系统(RDBMS),如MySQL,默认采用可重复隔离级别来防止现象的发生。然而,在较低级别的隔离模式下——比如已提交(Read Committed)或者更宽松的情况下,应用程序确实有可能遇到的情况。这意味着如果一个事务正在对某条记录做更改但还未提交,另一个查询该记录的事务就可能看到这些未确认的变化[^3]。 为了模拟这种场景,可以通过设置特定的会话参数降低事务隔离度来进行测试: ```sql SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT * FROM table_name WHERE id = specific_id; ``` 上述命令将允许当前连接下的后续查询以最低限度的安全保障运行,即它们能够查看任何其它正在进行中的变更,即使那些变更是由未完成的事物引起的。 请注意,这样做仅用于实验目的;生产环境应始终遵循最佳实践指南配置合适的隔离等级。 ### 脏数据产生的原因 脏数据主要源于以下几个方面的原因: - **缺乏有效的锁定策略**:当多个客户端尝试在同一时间点写入同一份资源而没有实施必要的排他性措施时,很容易发生冲突,进而产生脏数据。 - **高并发环境下竞争条件的存在**:尤其是在多线程或多服务器架构里,如果不采取适当手段协调各参与者的行为顺序,那么极短时间内发生的交错操作也可能破坏整体的一致性和准确性。 - **异步复制过程中的不确定性**:像Redis这类支持主从结构的服务端软件,在主节点向备份数量传播新版本的信息过程中,难免会出现短暂的时间窗口期,在此期间内部分实例间存在信息差,这就是所谓的“最终一致性”。 ### 解决方案 针对以上提到的各种成因,有如下几种常见的应对办法: - **提高事务隔离级**:通过调整SQL语句前缀`SET SESSION TRANSACTION ISOLATION LEVEL ...`指定更高的隔离标准,可以有效地减少乃至杜绝的风险。不过需要注意的是,增强安全性往往伴随着性能上的牺牲,因此需权衡利弊做出合理抉择。 - **引入乐观/悲观锁机制**:这两种不同的并发控制模型各有优劣,前者适用于低争用率的应用场合,后者则更适合于频繁发生互斥请求的情形。无论是哪种方式都能很好地保护共享对象免受非法篡改的危害。 - **优化缓存刷新频率及失效策略**:特别是面对诸如Redis之类的高速缓冲层时,应当精心设计相应的淘汰算法以及过期标记规则,确保每次获取的结果都是最新的且可靠的。此外还可以考虑启用双写回填技术,即每当检测到潜在风险信号便立即触发强制同步流程,以此快速修复偏差状况.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值