MyBatis的延迟加载(懒加载)
所谓的延迟加载是 相对立即加载的说法。 延迟加载: 只有使用到该数据(该对象)时,才会从数据库中查询出来该数据。
好处:避免频繁访问数据库,减少数据库的压力,节约资源。
缺点:因为只有在使用该数据时,才会发送查询数据库SQL,如果有大批量数据需要查询时,因为查询本身也会消耗时间,造成用户等待时间过长,体验度下降。
通过代码来进行演示
通过查询查询员工所有信息,来演示延迟加载
创建员工和部门实体类,并建立多对一的关系
员工映射文件EmployyeeMapper.xml
主要在该配置文件中
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace:命名空间,用于指定当前mapper文件中操作的SQL属于哪一个接口类下面的方法-->
<mapper namespace="com.hp.mybatis.mapper.EmployeeMapper">
<resultMap id="base_map" type="employee">
<id property="id" column="id"></id>
<result property="name" column="name"></result>
<!--建立和部门关系-->
<association property="dept" javaType="dept" column="dept_id"
select="com.hp.mybatis.mapper.DeptMapper.findById"></association>
</resultMap>
<!--根据id查询员工,级联查询部门
不使用左外链接,因为左外链接不会出现延迟加载情况
-->
<select id="findById" parameterType="int" resultMap="base_map">
select id,dept_id,name from employee where id = #{emId}
</select>
</mapper>
部门映射文件DeptMapper.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace:命名空间,用于指定当前mapper文件中操作的SQL属于哪一个接口类下面的方法-->
<mapper namespace="com.hp.mybatis.mapper.DeptMapper">
<select id="findById" parameterType="int" resultType="dept">
select * from dept where id = #{id}
</select>
</mapper>
流程:在测试类中:调用EmployeeMapper接口中的findById方法,通过sqlMapConfig.xml文件找到EmployeeMapper.xml执行select查询语句,但结果集中含有部门信息需要resultMap去解析结果集,解析过程中association会引用员工的部门id去DeptMapper.xml的select查询该部门信息。查询结果如左连接一样
(当我们不需要查询该员工的部门信息时,即出现了延迟加载,默认延迟加载是禁用的,会查询出该员工的所有信息不包括部门信息)。
sqlMapConfig.xml配置
<?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读取外部文件,注意:上下顺序-->
<properties resource="com/db.properties"></properties>//数据库配置
<!--配置开启延迟加载-->
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="lazyLoadTriggerMethods" value="clone"/>
</settings>
<!--别名配置-->
<typeAliases>
<!--指定包名,指定后,别名默认就是包下的类名-->
<package name="com.hp.mybatis.bean"/>
</typeAliases>
<!--配置环境-->
<environments default="abc">
<!--环境中定义了,要访问的数据库连接池,事务管理类型-->
<environment id="abc">
<transactionManager type="JDBC"></transactionManager>
<!--数据库连接池-->
<dataSource type="POOLED">
<property name="driver" value="${db.driverName}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--当前包需要和mapper接口类所在包同名,并且当前包需要一级一级创建-->
<package name="com.hp.mybatis.mapper"/>
</mappers>
</configuration>
第一次看可能有点迷茫,多看看黄色字体的文字就可以简单理解。