做联合查询是查处首层实体对象,具体实体对象内部的关联对象只有用到的时候才去查询使用。

首先在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();
        }
    }
    

 

posted on 2018-05-10 19:02  lonske  阅读(260)  评论(0编辑  收藏  举报