mybatis:延迟加载

本文介绍了MyBatis的延迟加载实现,通过配置文件和示例代码展示其工作原理。在获取所有学生后再获取成绩时,MyBatis会在需要时才从数据库加载,从而节省内存但可能降低效率。对比内连接查询,延迟加载和内连接各有优劣,需根据实际场景选择合适的方法。

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

mybatis延迟加载的实现

使用这个里面的数据库表来讲解https://blog.youkuaiyun.com/qq_36453423/article/details/103604632

在这里插入图片描述

2.scores.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">
<!-- namespace:命名空间,做sql隔离 -->
<mapper namespace="net.dfrz.mapper.ScoresMapper">

	<!-- 查询 -->
	
	<!-- 获取所有的学生 -->
	<select id="getScoresBystuID" parameterType="string"
		resultType="scores" >
		select t_scores.id,t_scores.math		
		from t_scores
		<if test="value!=null">
			 where t_scores.stuID = #{stuID}
		 </if>
	</select>
</mapper>

3.student.xml

<resultMap id="studentScoresMap2" type="student">
	<id property="stuID" column="stuID"/>
	<result property="name" column="name" />
	<result property="birthday" column="birthday" />
	<result property="sex" column="sex" />
	<association property="scoresSet" column="stuID" select="net.dfrz.mapper.ScoresMapper.getScoresBystuID">
	</association>
</resultMap>
	<!-- 获取所有的学生 -->
<select id="getStudents" parameterType="map"
	resultMap="studentScoresMap2" >
	select
	<include refid="all"></include>
	from t_student
	<if test="stuID!=null">
		 where t_student.stuID = #{stuID}
	 </if>
</select>

4.配置文件config.xml

重点是这两句

<settings>
	<setting name="lazyLoadingEnabled" value="true"/>
	<setting name="aggressiveLazyLoading" value="false"/>
</settings>

完整的配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	
	<!-- 引入外部资源文件 -->
	<properties resource="mybatis/db/mysql.properties"></properties>
	
	<!-- 延迟加载配置 -->
	<settings>
		<setting name="lazyLoadingEnabled" value="true"/>
		<setting name="aggressiveLazyLoading" value="false"/>
	</settings>
	
	<!-- 设置entity\bean包扫描,包下的所有entity类默认首字母小写后调用 -->
	<typeAliases>
	<!-- 下面两个都可以对应mapper/Student.xml的student这个类 -->
		<!-- <typeAlias type="net.dfrz.entity.Student"/> -->
		<package name="net.dfrz.entity" />
	</typeAliases>
	
	<!-- 分页的第三方插件 -->
	<plugins>
		<plugin interceptor="com.github.pagehelper.PageHelper">
			<property name="dialect" value="mysql" />
			<property name="offsetAsPageNum" value="false" />
			<property name="rowBoundsWithCount" value="true" /><!-- rowBoundsWithCount:若为TRUE,会查询总item数目 -->
			<property name="pageSizeZero" value="true" />
			<property name="reasonable" value="true" /><!-- reasonable:若为TRUE,用户输入页码小于1会定位到第一页,大于最大页数会定位到最后一页。 -->
			<property name="supportMethodsArguments" value="false" />
			<property name="returnPageInfo" value="none" />
		</plugin>
	</plugins>

	<!-- 配置信息 -->
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<!-- 配置连接信息 -->
				<property name="driver" value="${jdbc.driverClass}" />
				<property name="url"
					value="${jdbc.url}" />
				<property name="username" value="${jdbc.username}" />
				<property name="password" value="${jdbc.password}" />
			</dataSource>
		</environment>
	</environments>

	<!-- 配置映射文件:用来配置SQL语句和结果及类型等 -->
	<mappers>
		<mapper resource="mybatis/mapper/Student.xml" />
		<mapper resource="mybatis/mapper/Scores.xml" />
	</mappers>
</configuration>

最后进行测试,先获取所有学生。然后再获取学生的考试成绩。就会发现在你需要用到学生成绩的时候,mybaits才会去数据库拿对应的数据。但是延迟加载也会出现N+1的问题,当你的学生数量足够的大的时候,访问的次数势必很大,那么效率就会变低,也就是说

延迟加载节省了内存的空间的同时,一定几率降低了读取效率。

而直接使用inner join一次性直接读取,加重了内存的存储负担,但是提高了读取效率,只需要读取一次数据库。

因此我们要根据实际情况来选择我们的技术!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值