Mybatis中延迟加载和二级缓存和注解开发学习

本文使用的案例是出自该博客的多对多查询>>>>>> Mybatis中连表查询的学习

1.延迟加载(按需加载)

  • 使用场景:

如果只是处理登录请求,有关于用户的订单之类的其他信息,属于无用的数据,加载这些数据造成了资源浪费,有些时候,有些数据需要要求我们做选择,选择性的加载,按照需要加载,这种方式按需加载(延迟加载)

  • 简单来说就是我们查询数据有的时候没有必要一次性将全部关联数据查询出来.
  • Mybatis如何使用按需加载?
方式一局部延迟加载
方式二全局延迟加载配置

使用局部延迟加载:

  • 我们如果不想把用户的订单信息全部查询出来,只是查询其用户信息怎么办,这里使用到< collection >标签的属性:fetchType,其有两个值,一个为lazy延迟加载,一个为eager立即加载
  • 代码实现:
 <resultMap id="newMap1" type="com.offcn.pojo.Customer" extends="baesMap">
        <collection property="orders" ofType="com.offcn.pojo.Orders"
                    column="cid" select="com.offcn.mapper.OrdersMapper.queryByid" fetchType="lazy">
        </collection>
    </resultMap>

    <select id="queryByidLazy" parameterType="int" resultMap="newMap1">
      select * from customer where cid=#{cid};
    </select>

使用全局延迟加载:

  • 在Mybatis核心配置文件中设置:
 <settings>
        <setting name="lazyLoadingEnabled" value="true"/>
    </settings>

总结:

第一点全局延迟加载优先级低于局部设置
第二点延迟加载开启需要关联查询的方式为嵌套查询

2.二级缓存

  • 目的:

降低服务器请求次数,减少服务器压力

第一种一级缓存
第二种二级缓存

一级缓存:

  • SqlSession级别的缓存,默认开启,不可关闭.
  • 具体实现场景:当我们使用相同映射对象执行方法,并且条件相同,那么当第一次执行结束后,第二次执行不会调用sql语句执行,而是从一级缓存中读取.
  • 代码实现:
 @Test
    public void testQueryByCnum() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = build.openSession();
        CardMapper mapper = sqlSession.getMapper(CardMapper.class);
        Card card = mapper.queryByCnum("111111");
        System.out.println("---------");
        Card card1 = mapper.queryByCnum("111111");
        System.out.println(card1);
        System.out.println(card);
        sqlSession.close();


    }
  • 结果:
    在这里插入图片描述
  • 可以看到执行了两次.
  • 如果想再次手动获取,需要清理缓存,这里有三种方式:
第一种clearCache
第二种commit
第三种close
  • 我们修改上面代码,实现清除缓存:
@Test
    public void testQueryByCnum() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = build.openSession();
        CardMapper mapper = sqlSession.getMapper(CardMapper.class);
        Card card = mapper.queryByCnum("111111");
        System.out.println("---------");
        sqlSession.clearCache();
        Card card1 = mapper.queryByCnum("111111");
        System.out.println(card1);
        System.out.println(card);
        sqlSession.close();


    }
  • 结果:
    在这里插入图片描述

二级缓存:

  • 可以理解为SqlSessionFactory级别的缓存.

  • 画张图片来理解:
    在这里插入图片描述

  • 我们可以类比JSP的域对象,此时mapper对象好比request对象,范围是一次请求,而SqlSessionFactory就是session对象的作用范围.

  • 二级缓存默认关闭,接下来如何使用呢?

  • 第一步:全局配置文件中开启二级缓存:

<settings>
        <setting name="cacheEnabled" value="true"></setting>
    </settings>
  • 第二步:在需要开启缓存的映射文件中设置:
    在这里插入图片描述
  • 对于局部禁用缓存,我们使用useCache属性为false即可
  • 对于可以使用缓存的实体类需要实现序列化接口.

3.Mybatis使用注解开发

  • Mybatis支持使用注解来快速实现sql语句的实现.

1.使用注解完成单表的增删改查:

在这里插入图片描述

2.使用注解完成一对一连表查询:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值