mybatis多对一和一对多查询数据处理解读(下)

简介: mybatis多对一和一对多查询数据处理解读(下)

一对多

问题的引出

假设我们要去查一个班级的信息,包括班级的名字,班号以及这个班级的的所有学生。这就是一对多,一个班级对应多个学生。这个需求的话我们在mysql中查询的语句如下:

1. SELECT * FROM  t_clazz 
2. LEFT JOIN t_student 
3. ON t_clazz.`cid`=t_student.`cid`
4. WHERE t_clazz.`cid`=2101

查询结果:

这个时候就要在Clazz类中添加List<Student> stus 属性。

1. @Data
2. public class Clazz {
3. private  Long cid;
4. private  String cname;
5.     List<Student> stus;
6. }

collection处理

ClazzMappe编写r接口

1. /**
2.      * 根据班级编号查询班级信息。同时班级中所有的学生信息也要查询。
3.      * @param cid
4.      * @return
5.      */
6.     Clazz selectClazzAndStusByCid(@Param("cid") Long cid);

ClazztMapper.xml中实现

1. <resultMap id="clazzResultMap" type="com.study.pojo.Clazz">
2. <id property="cid" column="cid"></id>
3. <result property="cname" column="cname"></result>
4. <collection property="stus" ofType="com.study.pojo.Student">
5. <id property="sid" column="sid"></id>
6. <result property="sname" column="sname"></result>
7. </collection>
8. </resultMap>
9. <select id="selectClazzAndStusByCid" resultMap="clazzResultMap">
10.         SELECT * FROM  t_clazz
11.         LEFT JOIN t_student
12.         ON t_clazz.`cid`=t_student.`cid`
13.         WHERE t_clazz.`cid`=#{cid}
14. </select>

测试代码

1. @Test
2. public void test01(){
3. SqlSession session = SqlSessionUtil.openSession();
4. ClazzMapper mapper = session.getMapper(ClazzMapper.class);
5. Clazz clazz = mapper.selectClazzAndStusByCid(2101L);
6.         System.out.println(clazz);
7.     }

分步查询

这个过程同样可以分为俩步:

第一步根据cid在班级表中查询cname

第二步根据cid在学生表中查询每个学生的sid sname

具体实施

ClazzMapper.xml中修改

1. <resultMap id="clazzResultMap" type="com.study.pojo.Clazz">
2. <id property="cid" column="cid"></id>
3. <result property="cname" column="cname"></result>
4. <collection property="stus"
5. select="com.study.mapper.StudentMapper.selectByCid"
6. column="cid">
7. </collection>
8. </resultMap>
9. 
10. <select id="selectClazzAndStusByCid" resultMap="clazzResultMap">
11.         select  * from t_clazz where cid=#{cid}
12. </select>

StudentMapper接口

1. /**
2.      * 根据班级编号获取所有的学生。
3.      * @param cid
4.      * @return
5.      */
6.     List<Student> selectByCid(@Param("cid") Long cid);

StudentMapper.xml

1. <select id="selectByCid" resultType="com.study.pojo.Student">
2.         select * from t_student where cid=#{cid}
3. </select>

延迟加载解读

什么是延迟加载?

 延迟加载也称为懒加载、惰性加载,使用延迟加载可以提高程序的运行效率,针对数据持久层的操作,在某些特定查询的情况下去访问特定的数据库,在其他情况下可以不访问某些数据表,尽量减少 SQL 的执行,从而达到提高速度的目的,是对数据库操作的一种优化。

说明:延迟加载只存在于分步查询

在mybatis中怎么开启延迟加载呢?

局部开启:

在association或者collection标签中添加fetchType="lazy"。

   注意:默认是没有开启延迟加载的,而且这种在association或者collection中设置

   延迟加载的方式,是局部的设置,只针对当前association或者collection所关联的SQL语句起作用。

测试代码

1. @Test
2. public void test01(){
3. SqlSession session = SqlSessionUtil.openSession();
4. ClazzMapper mapper = session.getMapper(ClazzMapper.class);
5. Clazz clazz = mapper.selectClazzAndStusByCid(2101L);
6. //没有用到stus属性
7.         System.out.println(clazz.getCid());
8.         System.out.println(clazz.getCname());
9.     }

运行结果

我们可以很明显的看到延迟加载以后,只执行了一条sql语句

全局开启:

可以在mybatis核心配置文件中开启全局设置

在开发中大部分情况是需要用到延迟加载的,所以建议开启全局的延迟加载机制

在mybatis核心配置文件中添加<setting name="lazyLoadingEnabled" value="true"/>

实际中的开发模式:

   把全局延迟加载打开。

   如果某一步不需要延迟加载,设置fetchType="eager"。

相关文章
|
2月前
|
Java 数据库连接 数据库
mybatis查询数据,返回的对象少了一个字段
mybatis查询数据,返回的对象少了一个字段
152 8
|
9天前
|
SQL 安全 Java
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
10 1
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
|
14天前
|
SQL Java 数据库连接
mybatis如何仅仅查询某个表的几个字段
【10月更文挑战第19天】mybatis如何仅仅查询某个表的几个字段
18 1
|
2月前
|
SQL XML Java
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
文章介绍了MyBatis中高级查询的一对多和多对一映射处理,包括创建数据库表、抽象对应的实体类、使用resultMap中的association和collection标签进行映射处理,以及如何实现级联查询和分步查询。此外,还补充了延迟加载的设置和用法。
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
|
1月前
|
SQL XML Java
Mybatis中一对一和一对多的处理
这篇文章讲解了在Mybatis中如何处理一对一和一对多的关系映射,包括使用association和collection标签的具体方法。
19 1
|
3月前
|
Java 数据库连接 mybatis
后端框架的学习----mybatis框架(9、多对一处理和一对多处理)
这篇文章介绍了在MyBatis框架中如何处理多对一和一对多的关联查询,通过定义`<resultMap>`和使用`<association>`与`<collection>`元素来实现对象间的关联映射。
|
26天前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
81 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
26天前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
44 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
1月前
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
229 1
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
|
26天前
|
SQL Java 数据库连接
mybatis使用二:springboot 整合 mybatis,创建开发环境
这篇文章介绍了如何在SpringBoot项目中整合Mybatis和MybatisGenerator,包括添加依赖、配置数据源、修改启动主类、编写Java代码,以及使用Postman进行接口测试。
15 0
mybatis使用二:springboot 整合 mybatis,创建开发环境