立即加载:
在一对一的关系中一般采用立即加载,只要一调用就立即发起加载。举例:一个用户有100个账户,查询账户时有必要把用户信息也显示出来。
延时加载:
在一对多,或多对多中中一般采用延时加载,延时加载就是指,真正使用数据时才发起查询,不用的时候不查询,按需加载(懒加载)。举例:一个用户有100个账户,查询用户时没必要把所有账户信息都显示,所以采用延时加载
Mybatis配置文件中的settings标签中通过两个属性lazyLoadingEnabled和aggressiveLazyLoading来控制延迟加载和按需加载。
lazyLoadingEnabled:是否启用延迟加载,mybatis默认为false,不启用延迟加载。lazyLoadingEnabled属性控制全局是否使用延迟加载,特殊关联关系也可以通过嵌套查询中fetchType属性单独配置(fetchType属性值lazy或者eager)。
aggressiveLazyLoading:是否按需加载属性,默认值false,lazyLoadingEnabled属性启用时只要加载对象,就会加载该对象的所有属性;关闭该属性则会按需加载,即使用到某关联属性时,实时执行嵌套查询加载该属性。
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
在一对多的情况下使用延时加载:
在IUserDao.xml中 使用account的与user的关联外键 uid ,将数据查询出来
<?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.qst.dao.IUserDao">
<resultMap id="UserAndAcc" type="com.qst.domain.User">
<id column="id" property="id" ></id>
<result column="username" property="username"></result>
<result column="gender" property="gender"></result>
<result column="email" property="email"></result>
<result column="did" property="did"></result>
<collection property="accounts" column="id" ofType="com.qst.domain.Account" select="com.qst.dao.IAccountDao.findallByuid"></collection>
</resultMap>
<select id="findAlls" resultMap="UserAndAcc">
select * from employee
</select>
</mapper>
IAccountDao.xml 在这里主要使用findallByuid 这个方法通过uid查找信息
<?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.qst.dao.IAccountDao">
<!--查询所有-->
<select id="findallByuid" resultType="com.qst.domain.Account">
select * from account where uid=#{uid}
</select>
</mapper>
最后进行测试
@Test
public void findAlls() {
List<User> users = userDao.findAlls();
for(User user : users){
System.out.println(user);
}
}
会了一对多 的延时加载 一对一的也就差不多了 只不过实在collection标签上加上select属性
<collection property="accounts" ofType="com.qst.domain.Account" select="com.qst.dao.IUserDao.findall"></collection>