zoukankan      html  css  js  c++  java
  • 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);
        }
  • 相关阅读:
    C++primer拾遗(第五章:语句)
    每日编程-20170315
    C++primer拾遗(第四章:表达式)
    C++primer拾遗(第三章:字符串、向量和数组)
    每日编程-20170314
    C++primer拾遗(第二章:变量和基本类型)
    每日编程-20170313
    每日编程-20170310
    每日编程-20170309
    C++primer拾遗(第一章:开始)
  • 原文地址:https://www.cnblogs.com/zsben991126/p/12590012.html
Copyright © 2011-2022 走看看