mybatis:延迟加载

mybatis延迟加载的实现

使用这个里面的数据库表来讲解https://blog.csdn.net/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一次性直接读取,加重了内存的存储负担,但是提高了读取效率,只需要读取一次数据库。

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

发布了53 篇原创文章 · 获赞 0 · 访问量 4144

猜你喜欢

转载自blog.csdn.net/qq_36453423/article/details/103613964