注:延迟加载的条件是:多表单独查询,多表关联查询不能使用延迟加载。
aggressiveLazyLoading的默认值为false,当aggressiveLazyLoading
的值为true时,延迟加载为侵入式延迟加载,当值为false时,延迟加载为深度延迟加载
直接加载与侵入式延迟加载与深度延迟加载的区别:
1、直接加载
在调用dao的方法时,主查询与关联查询一起全部执行
2、侵入式延迟加载
不管调用dao的方法查询的内容在主查询查到还是在关联查询中查到,都会先执行主查询,再执行关联查询
3、深度延迟加载
如果调用dao的方法查询的内容在主查询就中就能查到,就不再执行关联查询,如果查不到就执行关联查询
1、mybatis.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>
<!-- 加载jdbc.properties文件 -->
<properties resource="jdbc.properties"/>
<!-- 全局参数配置 -->
<settings>
<!-- 延迟加载总开关 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- aggressiveLazyLoading的默认值为false,当aggressiveLazyLoading
的值为true时,延迟加载为侵入式延迟加载,当值为false时,
延迟加载为深度延迟加载 -->
<setting name="aggressiveLazyLoading" value="true"/>
</settings>
<!-- 配置运行环境 -->
<environments default="mysqlEM">
<environment id="mysqlEM">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<mapper resource="com/dao/mapper.xml"/>
</mappers>
</configuration>
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.dao.ICountryDao">
<!-- 方式1
<resultMap type="com.beans.Country" id="countryMapper">
<id column="cid" property="cid"/>
<result column="cname" property="cname"/>
<collection property="ministers" ofType="com.beans.Minister">
<id column="mid" property="mid"/>
<result column="mname" property="mname"/>
</collection>
</resultMap>
<select id="selectCountryById" resultMap="countryMapper">
SELECT CID,CNAME,MID,MNAME FROM COUNTRY,MINISTER
WHERE CID = COUNTRYID AND CID = #{CID}
</select>
-->
<select id="selectMinisterByCountry" resultType="com.beans.Minister">
SELECT MID, MNAME FROM MINISTER WHERE COUNTRYID = #{CID}
</select>
<resultMap type="com.beans.Country" id="countryMapper">
<id column="cid" property="cid"/>
<result column="cname" property="cname"/>
<collection property="ministers" ofType="com.beans.Minister"
select="selectMinisterByCountry" column="cid"/>
</resultMap>
<select id="selectCountryById" resultMap="countryMapper">
SELECT CID,CNAME FROM COUNTRY
WHERE CID = #{CID}
</select>
</mapper>
3、MyTest
package com.test;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Test;
import com.beans.Country;
import com.dao.ICountryDao;
import com.utils.SqlSessionUtils;
public class MyTest {
private ICountryDao dao;
private SqlSession sqlSession;
@org.junit.Before
public void before() {
sqlSession = SqlSessionUtils.getSqlSession();
dao = sqlSession.getMapper(ICountryDao.class);
}
@After
public void After() {
if (sqlSession != null) {
sqlSession.close();
}
}
@Test
public void test01() {
Country country = dao.selectCountryById(1);
System.out.println(country.getCname());
}
}