延迟加载(懒加载)
先举一个列子:
一个订单列表中有商品信息,等用户需要查看订单列表中的商品信息的时候,才再去加载商品信息。
延迟加载大概就是这个思想吧
实现步骤
1、在配置文件中打开延迟加载开关
<settings>
<setting name="lazyloaddingEnabled" value="true"/>
<setting name="aggressivelazyLoading" value="false"/>
</settings>
2、配置mapper.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">
<mapper namespace="com.etime.dao.SysRoleMapper">
<resultMap type="com.etime.pojo.SysRole" id="sysRoleMap">
<!-- id定义的是表的主键
column:数据库的字段
property:pojo对象的属性
主要解决的问题是字段名和实体属性不一致的问题
-->
<id column="roleid" property="roleid"/>
<result column="rolename" property="rolename"/>
<result column="roledesc" property="roledesc"/>
<result column="rolestate" property="rolestate"/>
</resultMap>
<resultMap type="com.etime.dto.SysRoleDto" id="roleUserMap2" extends="sysRoleMap">
<collection property="userlist" ofType="com.etime.pojo.SysUser" column="roleid"
select="selectUserByRoleid"/>
</resultMap>
<!-- sql片段 -->
<sql id="sql_sysrole">
roleid,rolename,rolestate,roledesc
</sql>
<select id="selectRolelist2" resultMap="roleUserMap2">
select
<include refid="sql_sysrole"></include>
from sysrole
</select>
<!-- 一对多 -->
<select id="selectRoleUser" resultMap="roleUserMap2" >
select a.roleid,rolename,rolestate,roledesc,b.userid,b.username,b.usertruename
from sysrole a inner join sysuser b on a.roleid = b.roleid
</select>
</mapper>
3、测试结果
public class Test01 {
public static void main(String[] args) throws IOException {
//读取MyBatis的核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
//创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sessionFactoryBuilder = new SqlSessionFactoryBuilder();
//通过SqlSessionFactoryBuilder对象去解析配置文件获取sqlSessionFactory对象
SqlSessionFactory sessionFactory = sessionFactoryBuilder.build(resourceAsStream);
//通过SqlSessionFactory对象创建SqlSession对象,openSession(boolean):true:自动提交;false:手动提交
SqlSession sqlSession = sessionFactory.openSession();
//懒加载测试
List<SysRoleDto> selectList = sqlSession.selectList("com.etime.dao.SysRoleMapper.selectRolelist2");
for(SysRoleDto sysrole : selectList) {
System.out.println(sysrole.getUserlist());
}
}
}
总结
延迟加载感觉作用不是很大,但是还是要体会这种思想,用到了再去加载,没用到就不用加载出来。