四. 将 aggressiveLazyLoading 设置为true 时
<!-- 控制懒加载的 --> <setting name="lazyLoadingEnabled" value="true"/> <setting name="aggressiveLazyLoading" value="true"/>
这个时候,测试运行 findByIdWithSelectF1Test()
发现,并没有延迟加载。 故需要将其字段设置为false 才可以。
五. 在关联处 设置是否延迟加载
有的时候,需要对同一个类 中的不同的属性分别进行设置 是否进行延迟加载, 如 查询员工时,把身份证信息查询出来,把部门延迟加载出来。 故在setting 的 lazyLoadingEnabled 设置总开头时,又设置了一个分开关。 fetchType , 默认为lazy, 延迟加载。 有两个值, lazy 延迟加载, eager 急切加载,即不延迟加载。
如分别设置 身份证为延迟加载, 部门为不延迟加载。
<association property="idCard" javaType="idCard" column="id" select="com.yjl.mapper.IdCardMapper.findByUserId" fetchType="lazy"> <association property="dept" javaType="dept" column="deptId" select="com.yjl.mapper.DeptMapper.getById" fetchType="eager"></association>
这个时候,执行 findByIdWithSelectF1Test() 方法。(aggressiveLazyLoading 已经设置为false 了。)
查询了部门的信息,没有查询身份证信息, 身份证信息被延迟加载了。
六. 部门查询员工的一对多加载
接口上面写过了。
DeptMapper.xml sql语句:
<resultMap type="dept" id="deptCollectionResultMapWithSelect"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="description" column="description"/> <!-- 用的是ofType的类型。 --> <collection property="allUser" ofType="user" column="id" select="com.yjl.mapper.UserMapper.findUserByDeptId"></collection> </resultMap> <select id="getAllInfoByIdWithSelect" parameterType="int" resultMap="deptCollectionResultMapWithSelect"> select * from dept where id=#{id} </select>
UserMapper.xml 语句:
<resultMap type="user" id="userResultMap"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="sex" column="sex"/> <result property="age" column="age"/> <result property="description" column="description"/> </resultMap> <select id="findUserByDeptId" parameterType="int" resultMap="userResultMap"> select * from user u where u.deptId=#{deptId} </select>
测试方法:
@Test public void getAllInfoByIdWithSelectTest(){ SqlSession sqlSession=SqlSessionFactoryUtils.getSession(); DeptMapper deptMapper=sqlSession.getMapper(DeptMapper.class); Dept dept=deptMapper.getAllInfoByIdWithSelect(1); System.out.println(dept); }
测试运行,发现只查询出了 部门的信息,并没有查询出员工的信息。
当使用员工集合时,才会查询。
@Test public void getAllInfoByIdWithSelectTest(){ SqlSession sqlSession=SqlSessionFactoryUtils.getSession(); DeptMapper deptMapper=sqlSession.getMapper(DeptMapper.class); Dept dept=deptMapper.getAllInfoByIdWithSelect(1); System.out.println(dept); List<User> allUser=dept.getAllUser(); allUser.forEach(n ->System.out.println(n)); }
在调用 getAllUser() 方法时才会查询。
debug 运行的话:
getAllUser() 时进行查询:
输出:
当然,如果想将其改成 不延迟加载,而是立即查询,只需要 fetchType 改成eager 即可。
<!-- 用的是ofType的类型。 --> <collection property="allUser" ofType="user" column="id" select="com.yjl.mapper.UserMapper.findUserByDeptId" fetchType="eager"></collection>
谢谢!!!