MyBatis多表
摘要:本文介绍了MyBatis中的多表关联查询和延迟加载机制。重点讲解了一对一关联查询的实现方式,通过association标签将班级信息映射到学生对象。同时详细阐述了延迟加载的三种模式:直接加载、侵入式延迟和深度延迟,并提供了全局和局部配置方法。通过设置lazyLoadingEnabled和aggressiveLazyLoading参数,可以灵活控制SQL查询时机,优化数据库性能。文章还给出了具
一、多表结构
二、一对一
一个学生只属于一个班级。
查询:id name age gender banjiName
<select id="selectStudentBanjiInfo" resultMap="studentMap">
SELECT s.id,s.name,s.age,s.gender,b.id AS banjiId,b.name AS banjiName
FROM student AS s INNER JOIN banji AS b
ON s.banji_id=b.id
</select>
<!-- resultMap最终将结果映射到Student类上-->
<resultMap id="studentMap" type="Student">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<result column="gender" property="gender"/>
<result column="banji_id" property="banjiId"/>
<association property="banji" javaType="Banji">
<id column="banjiId" property="id"/>
<result column="banjiName" property="name"/>
</association>
</resultMap>
MyBatis中使用association标签解决一对一关联查询,association标签可以使用的属性如下:
- property:对象属性的名称
- javaType:对象属性的类型
- column:数据库中字段的名称(也可能是起的别名)
测试类
@Test
public void testOne2One(){
SqlSession sqlSession = MyBatisUtil.getSqlSession();
List<Student> list = sqlSession.selectList("student.selectStudentBanjiInfo");
for (Student student : list) {
System.out.println(student);
}
}
二、一对多
四、懒加载(延迟加载)
1.什么是懒加载
顾名思义,懒加载就是懒得加载,只有使用的时候才进行加载。其实,懒加载也叫延迟加载,主要以应用与Mybatis的关联查询,按照设置的延迟规则,推迟对延迟对关联对象的select查询,例如,我们在用Mybatis进行一对多的时候,先查询出一方,当程序需要多方数据时,mybatis会再次发出sql语句进行查询,减轻了对我们数据库的压力。Mybatis的延迟加载,只对关联对象有延迟设置。
MyBatis关联查询加载时机
1.直接加载:执行完主对象的查询后,马上执行对关联对象的查询语句
2.侵入式延迟:执行完对主对象对查询后,不会执行对关联对象的查询,但当访问主对象的属性详情事,就会执行关联对象的查询
3.深度延迟:只有当真正访问关联对象的详情时,才会执行查询语句
2.全局延迟配置
在MyBatis核心配置类中添加标签
<settings>
<!-- 延迟加载总开关 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 侵入式延迟加载开关 -->
<setting name="aggressiveLazyLoading" value="true"/>
</settings>
(1.直接加载
直接加载:执行完主对象的查询后,马上执行对关联对象的查询语句
默认情况的延迟加载
<!-- 延迟加载总开关 -->
<setting name="lazyLoadingEnabled" value="false"/>
<!-- 侵入式延迟加载开关 -->
<setting name="aggressiveLazyLoading" value="true"/>
延迟加载的默认设置是直接加载
延迟加载默认情况下是关闭状态(false),延迟加载相当于总闸,总闸是关闭的那么侵入式延迟加载即使是true也不会起作用。
(2.侵入式延迟加载
侵入式延迟:执行完对主对象对查询后,不会执行对关联对象的查询,但当访问主对象的属性详情时,就会执行关联对象的查询
<!-- 延迟加载总开关 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 侵入式延迟加载开关 -->
<setting name="aggressiveLazyLoading" value="true"/>
未访问主对象属性
@Test
public void testSelectAll() throws IOException {
SqlSession sqlSession = MyBatisUtils.getSqlSession();
List<Student> list = sqlSession.selectList("student.selectAll");
for (Student student : list) {
//System.out.println(student);
//student.getName();
}
}
访问主对象属性
@Test
public void testSelectAll() throws IOException {
SqlSession sqlSession = MyBatisUtils.getSqlSession();
List<Student> list = sqlSession.selectList("student.selectAll");
for (Student student : list) {
//System.out.println(student);
student.getName();
}
}
(3.深度延迟加载
只有当真正访问关联对象的详情时,才会执行查询语句
<!-- 延迟加载总开关 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 侵入式延迟加载开关 -->
<setting name="aggressiveLazyLoading" value="false"/>
@Test
public void testSelectAll() throws IOException {
SqlSession sqlSession = MyBatisUtils.getSqlSession();
List<Student> list = sqlSession.selectList("student.selectAll");
for (Student student : list) {
//System.out.println(student);
student.getName();
//student.getBanji().getName();//访问关联对象的属性
}
}
没有访问关联对象的属性://student.getBanji().getName();
访问关联对象的属性:student.getBanji().getName();
3.部分延迟配置(在局部配置起作用)
在关联查询collection、association标签上添加 fetchType 属性,lazy表示延迟加载,eager表示立即加载,指定属性后,将在映射中忽略全局配置参数 lazyLoadingEnabled,使用属性的配置
<resultMap id="studentMap" type="Student">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<result column="gender" property="gender"/>
<result column="banji_id" property="banjiId"/>
<!--<association property="banji" javaType="Banji">
<id column="banjiId" property="id"/>
<result column="banjiName" property="name"/>
</association>-->
<association property="banji" column="banji_id" fetchType="lazy"
select="banji.selectById" javaType="Banji"/>
</resultMap>

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐
所有评论(0)