做联合查询是查处首层实体对象,具体实体对象内部的关联对象只有用到的时候才去查询使用。
首先在mybatis核心配置文件中配置:
lazyloadingEnable:true使用延迟加载,false禁用延迟加载。默认为true。
aggressiveLazyLoading:true启用时不使用延迟加载,false使用延迟加载
在SQLMapConfig.xml中<configuration>标签下添加
<settings> <!-- 延迟加载的总开关 --> <setting name="lazyLoadingEnabled" value="true"/> <!-- aggressiveLazyLoading设置成false才是启用延迟加载 --> <setting name="aggressiveLazyLoading" value="false"/> </settings>
范例:根据PersonId查订单,使用延迟加载效果
在personMap.xml写:
<!-- ============延迟加载============ --> <!-- column:主sql查出来的某一列作为参数传递给子sql select:子sql的位置,只有id不行,前面还要加上命名空间 --> <resultMap type="xxx.x.Person" id="selectPersonByIdLazyRM" extends="BaseResultMap"> <collection property="orderList" column="person_id" select="xxx.x.mapper.OrdersMapper.selectOrdersByIdLazy"> </collection> </resultMap> <!-- 主sql: --> <select id="selectPersonByIdLazy" parameterType="int" resultMap="selectPersonByIdLazyRM"> select * from person t where t.person_id = #{personId} </select>
在OrdersMap.xml写:
<select id="selectOrdersByIdLazy" parameterType="int" resultMap="BaseResultMap"> select * from orders t where t.person_id = #{personId} </select>
在java中写:
SqlSessionFactory sessionFactory; public void selectPersonByIdLazy() { // 创建SqlSession SqlSession session = sessionFactory.openSession(); try { //发出主sql Person person = session.selectOne("xxx.x.mapper.PersonMapper.selectPersonByIdLazy", 1); //发出子sql System.out.println(person.getOrderList()); } catch (Exception e) { e.printStackTrace(); session.rollback(); } finally { session.close(); } }