JAVA全系列 教程
3762个小节阅读:7092.7k
目录
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
在MyBatis多表查询中,使用连接查询时一个Sql语句就可以查询出所有的数据。如:
xxxxxxxxxx
# 查询班级时关联查询出学生
select *
from classes
left join student
on student.classId = classes.cid
也可以使用分解式查询,即将一个连接Sql语句分解为多条Sql语句,如:
xxxxxxxxxx
# 查询班级时关联查询出学生
select * from classes;
select * from student where classId = 1;
select * from student where classId = 2;
这种写法也叫N+1查询。
连接查询:
- 优点:降低查询次数,从而提高查询效率。
- 缺点:如果查询返回的结果集较多会消耗内存空间。
N+1查询:
- 优点:结果集分步获取,节省内存空间。
- 缺点:由于需要执行多次查询,相比连接查询效率低。
我们以查询班级时关联查询出学生为例,使用N+1查询:
xxxxxxxxxx
public interface ClassesMapper {
// 查询所有班级
List<Classes> findAll();
}
public interface StudentMapper {
// 根据班级Id查询学生
List<Student> findByClassId(int classId);
}
xxxxxxxxxx
<select id="findAll" resultType="com.itbaizhan.pojo.Classes">
select * from classes
</select>
<select id="findByClassId" resultType="com.itbaizhan.pojo.Student" parameterType="int">
select * from student where classId = ${classId}
</select>
xxxxxxxxxx
<!-- 自定义映射关系 -->
<resultMap id="MyClassesMapper" type="com.itbaizhan.pojo.Classes">
<id property="cid" column="cid"></id>
<result property="className" column="className"></result>
<!-- select:从表查询调用的方法 column:调用方法时传入的参数字段 -->
<collection property="studentList"
ofType="com.itbaizhan.pojo.Student" select="com.itbaizhan.mapper2.StudentMapper2.findByClassId"
column="cid">
</collection>
</resultMap>
<select id="findAll" resultMap="MyClassesMapper">
select * from classes
</select>
xxxxxxxxxx
@Test
public void testFindAllClasses2(){
ClassesMapper2 classesMapper2 = session.getMapper(ClassesMapper2.class);
List<Classes> all = classesMapper2.findAll();
all.forEach(System.out::println);
}
我们可以看到在控制台打印出了多条Sql语句
1.N+1查询的优点是:
A 节省内存空间
B 降低查询次数
C 提高查询效率
D 加快查询速度
1=>A