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一次性直接读取,加重了内存的存储负担,但是提高了读取效率,只需要读取一次数据库。
因此我们要根据实际情况来选择我们的技术!