延迟加载
什么是延迟加载?
延迟加载也叫懒加载、惰性加载,使用延迟加载可以提高程序的运行效率。
它是针对于数据持久层的操作,在某些特定的情况下去访问特定的数据库,在其他情况下可以不访问某些表,从一定程度上减少了Java应用与数据库的交互次数。
例如在查询学生和班级的时,学生和班级是两张不同的表,如果当前的需求只需要获取学生的信息,那么查询学生单表即可,如果需要通过学生获取对应的班级信息,则必须查询两张表。
不同的业务需求,需要查询不同的表,根据具体的业务需求来动态减少数据表查询的工作就是延迟加载。
使用延迟加载
-
在 config.xml 中开启延迟加载
<settings> <!-- 打印sql --> <setting name="logImpl" value="STDOUT_LOGGING"/> <!-- 开启延迟加载 --> <setting name="lazyLoadingEnabled" value="true"/> </settings>
-
将多表关联查询拆分成多个单表查询
接口文件 StudentRepository.java 中加入方法
public Student findByIdLazy(long id);
在StudentRepository.xml 中的 mapper 标签下添加
<select id="findByIdLazy" parameterType="long" resultMap="studentMapLazy"> SELECT * FROM student where id = #{id} </select> <resultMap id="studentMapLazy" type="com.mybatistest.entity.Student"> <id column="id" property="id"></id> <result column="name" property="name"></result> <association property="classes" javaType="com.mybatistest.entity.Classes" select="com.mybatistest.repository.ClassesRepository.findByIdLazy" column="cid"></association> </resultMap>
接口文件 ClassesRepository.java 中加入方法
public Classes findByIdLazy(long id);
在ClassesRepository.xml 中的 mapper 标签下添加
<select id="findByIdLazy" parameterType="long" resultType="com.mybatistest.entity.Classes"> SELECT * from classes where id = #{id} </select>
-
自此可实现延迟加载,此后,查询学生班级的信息会先后查询两张表,而查询学生姓名只会查询一张表