在我的上篇博客中Mybatis的关联映射_三思守心的博客-优快云博客我用了连表查询和分步查询两种方法来实现两个表的关联映射。为什么,一种方法就可以实现的东西,我们要用两步来实现呢?
原因很简单:大家可以发现如果我们把他们连在一起那么他们就是一个多表查询语句,如果不放在一起执行,那就是单独一个表的查询语句。但是这需要我们设置mybatis的延迟加载(懒加载)
分步查询的优点:可以实现延迟加载,但是必须在核心配置文件中设置全局配置信息
lazyLoadingEnabled:延迟加载的全局开关,当开启所有的关联对象都要延迟加载
aggressiveLazyLoading:当开启时,任何方式的调用都会加载该对象的所有属性。否则,该属性会按需加载
此时就可以实现按需加载,需要获取的数据是什么,就只会执行相应的sql.此时会通过association和collection中的fetchType属性设置当前的分步查询是否使用懒加载
fetchType=“lazy(延迟加载) | eager(立即加载)”
1、在主配置文件中设置延迟加载和日志
<settings>
<setting name="logImpl" value="STDOUT_LOGGING" />
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
2、在studentDao.xml 当中设置分步查询
<select id = "getStudent" resultMap="StudentTeacher">
select * from student;
</select>
<!--结果映射集-->
<resultMap id="StudentTeacher" type="com.qcby.entity.Student">
<result property="id" column="id"/>
<result property="Sname" column="Sname"/>
<result property="sex" column="sex"/>
<result property="age" column="age"/>
<result property="t_id" column="t_id"/>
<!-- select="getTeacher" :调用下一个查询语句 -->
<!-- select="com.qcby.dao.TeacherDao.getTeacher" :调用下一个查询语句 -->
<association property="teacher" column="t_id" javaType="com.qcby.entity.Teacher"
select="com.qcby.dao.TeacherDao.getTeacher" fetchType="lazy"/><!--fetchType="lazy”表示懒加载-->
</resultMap>
3.在TeacherDao.xml当中设置关于教师的查询
<select id="getTeacher" resultType="com.qcby.entity.Teacher" parameterType="java.lang.Integer">
select * from teacher where id = #{t_id}; <!-- #{id}; 可以写任何东西,因为会自动匹配 t_id -->
</select>
4.配置TeacherDao
Teacher getTeacher(Integer id);
5、当我们再次执行程序时,他会只执行select * from student不会执行select * from teacher where id = #{t_id}
6、但是在一些情况下我们不希望他们分开执行,但是我们已经在主配置文件里面设置了懒加载了,我们就需要,将我们希望一起加载的SQL语句标注上fetchType="eager",例如:
<select id = "getStudent" resultMap="StudentTeacher">
select * from student;
</select>
<!--结果映射集-->
<resultMap id="StudentTeacher" type="com.qcby.entity.Student">
<result property="id" column="id"/>
<result property="Sname" column="Sname"/>
<result property="sex" column="sex"/>
<result property="age" column="age"/>
<result property="t_id" column="t_id"/>
<!-- select="com.qcby.dao.TeacherDao.getTeacher" :调用下一个查询语句 -->
<!-- column="t_id" 两个表的关联字段-->
<!--fetchType="eager" 立即加载-->
<association property="teacher" column="t_id" javaType="com.qcby.entity.Teacher"
select="com.qcby.dao.TeacherDao.getTeacher" fetchType="eager"/>
</resultMap>