mybatis 延迟加载 以及 二级缓存机制

一对一,多对一的延迟加载:

  Account对应的User对象在查询时先不加载,等用到了再进行加载

首先在主配置文件里要设置两个选项

<!--配置参数-->
    <settings>
        <!--开启mybatis支持延迟加载-->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!--关闭调用任意方法立即加载,每个属性按需加载-->
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>

配置IAccountDao.xml

<!--用于延迟加载的map-->
    <resultMap id="accountUserLazyMap" type="com.itheima.domain.Account">
        <id property="id" column="aid"></id>
        <result property="uid" column="uid"></result>
        <result property="money" column="money"></result>
        <!--select属性指定的内容:查询用户的唯一标识,即根据column对应列提供的值作为参数,调用select指定的方法去查询
            ,column:User根据id查询时,所需要的id的值-->
        <association property="user" column="uid" javaType="com.itheima.domain.User"
            select="com.itheima.dao.IUserDao.findById">
        </association>
    </resultMap>

 同时,sql语句里不要涉及有关user表的列名,不然也会进行加载

 

一对多,多对多的延迟加载:每次加载User对象,其包含的Account集合进行懒加载

在IUserDao.xml里进行配置:

<!--一对多查询Account并延迟加载的map-->
    <resultMap id="userAccountLazyMap" type="com.itheima.domain.User">
        <id property="id" column="id"></id>
        <result property="username" column="username"></result>
        <result property="address" column="address"></result>
        <result property="sex" column="sex"></result>
        <result property="birthday" column="birthday"></result>
        <!--配置user对象中accounts集合的映射,ofType:集合中元素的类型-->
        <collection property="accounts" ofType="com.itheima.domain.Account"
            column="id" select="com.itheima.dao.IAccountDao.findAccountByUid">
        </collection>
    </resultMap>


    <!--配置查询所有-->
    <select id="findAll" resultMap="userAccountLazyMap">
        select * from user
    </select>

collection中,select调用一个方法

com.itheima.dao.IAccountDao.findAccountByUid

以User.id为参数,寻找所有相关联的account,那么就到IAccountDao.xml里配置一下

<!--根据User的id查询Account集合-->
    <select id="findAccountByUid" parameterType="int" resultType="com.itheima.domain.Account">
        select * from account where uid = #{uid}
    </select>

现在User就可以进行一对多的懒加载了

 

缓存机制

一级缓存是session默认开启的,使用无需配置

要使用二级缓存首先要在主配置文件里开启二级缓存

<!--配置参数-->
    <settings>
        <!--开启mybatis支持延迟加载-->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!--关闭调用任意方法立即加载,每个属性按需加载-->
        <setting name="aggressiveLazyLoading" value="false"/>
        <!--设置二级缓存-->
        <setting name="cacheEnabled" value="true"/>
    </settings>

在IUserDao.xml里也要配置

    <!--开启user支持二级缓存-->
    <cache/>

使用缓存

/*
    * 测试缓存
    *   一级缓存是session自带的,在session进行增删改,commit,close之后消失
    *   二级缓存是同一个SqlSessionFactory创建的所有session共享缓存
    *       但里面存的是数据(散装数据),不是对象
    * */
    @Test
    public void testCache(){
        SqlSession session1 = factory.openSession();
        IUserDao dao1 = session1.getMapper(IUserDao.class);
        User user1 = dao1.findById(41);
        System.out.println(user1);
        session1.close();//一级缓存消失

        SqlSession session2 = factory.openSession();
        IUserDao dao2 = session2.getMapper(IUserDao.class);
        User user2 = dao2.findById(41);
        System.out.println(user2);
        session2.close();

        System.out.println(user1==user2);
    }

 

posted on 2020-03-28 22:47  zsben  阅读(162)  评论(0编辑  收藏  举报

导航