1. 延迟策略

  • 在需要用到数据时在加载相关数据,常用于一对多关系,
  • 优点:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,
  • 缺点:当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗时间,所以可能造成用户等待时间变长,造成用户体验下降
  • 局部延迟,优先级最高,
    • 在association和collection标签中都有一个fetchType属性,设置为lazy 即懒加载,设置为eager即立即加载
    <collection property="orderList" ofType="order" column="id"
    select="com.lagou.dao.OrderMapper.findByUid" fetchType="lazy">
    </collection>
    • 在调用当前对象的equals、clone、hashCode、toString方法时也会触发关联对象的查询,因此需要在配置文件中使用lazyLoadTriggerMethods配置项覆盖掉上面四个方法。

      <settings>
      <!--所有方法都会延迟加载-->
      <setting name="lazyLoadTriggerMethods" value="toString()"/>
      </settings>
  • 全局延迟

    • 在Mybatis的核心配置文件中可以使用setting标签修改全局的加载策略
    <settings>
    <!--开启全局延迟加载功能-->
    <setting name="lazyLoadingEnabled" value="true"/>
    </settings>
    • 局部的加载策略优先级高于全局的加载策略
      

2.mybatis 缓存

  • 当用户频繁查询某些固定的数据时,第一次将这些数据从数据库中查询出来,保存在缓存中。当用户再次查询这些数据时,不用再通过数据库查询,而是去缓存里面查询。
  • 减少网络连接和数据库查询带来的损耗,从而提高我们的查询效率,减少高并发访问带来的系统性能问题
  • 一级缓存
    • SqlSession级别的缓存,是默认开启
    • 执行SqlSession的C(增加)U(更新)D(删除)操作,或者调用clearCache()、commit()、close()方法,都会清空缓存
    • 清空缓存
      <!-- 每次查询时,都会清除缓存 -->
      < select flushCache="true"></select>
  • 二级缓存
    • 映射语句文件中的所有select语句将会被缓存。
    • 映射语句文件中的所有insert、update和delete语句会刷新缓存。
    • 会产生脏读问题,需要使用第三方的缓存技术解决问题
    • mybatis的缓存,都不需要我们手动存储和获取数据。mybatis自动维护的。
    • mybatis开启了二级缓存后,那么查询顺序:二级缓存--》一级缓存--》数据库
    • namespace级别的缓存,需手动开启
    • 二级缓存的开启需要进行配置,实现二级缓存的时候,MyBatis要求返回的POJO必须是可序列化的,实现serializable接口
    • 配置核心配置文件
    • 配置mapper.xml
<settings>
<!--因为cacheEnabled的取值默认就为true,所以这一步可以省略不配置。
为true代表开启二级缓存;为false代表不开启二级缓存。
-->
<setting name="cacheEnabled" value="true"/>
</settings> <!--当前映射文件开启二级缓存-->
<cache></cache> public class User implements Serializable

3. 注解

  • @Insert:实现新增,代替了<insert></insert>
  • @Delete:实现删除,代替了<delete></delete>
  • @Update:实现更新,代替了<update></update>
  • @Select:实现查询,代替了<select></select>
  • @Result:实现结果集封装,代替了<result></result>
  • @Results:可以与@Result 一起使用,封装多个结果集,代替了<resultMap></resultMap>
  • @One:实现一对一结果集封装,代替了<association></association>
  • @Many:实现一对多结果集封装,代替了<collection></collection

  • 基于注解的二级缓存

    • 配置SqlMapConfig.xml文件开启二级缓存的支持
    <settings>
    <!--
    因为cacheEnabled的取值默认就为true,所以这一步可以省略不配置。
    为true代表开启二级缓存;为false代表不开启二级缓存。
    -->
    <setting name="cacheEnabled" value="true"/>
    </settings>
    • 在Mapper接口中使用注解配置二级缓存

      @CacheNamespace
      public interface UserMapper {...}
  • 基于注解的延迟加载
fetchType = FetchType.LAZY 表示懒加载
fetchType = FetchType.EAGER 表示立即加载
fetchType = FetchType.DEFAULT 表示使用全局配置
  • 注解开发和xml配置优劣分析

    • 注解开发和xml配置相比,从开发效率来说,注解编写更简单,效率更高。
    • 从可维护性来说,注解如果要修改,必须修改源码,会导致维护成本增加。xml维护性更强
 

mybatis 加载策略及注解开发的更多相关文章

  1. 抛开 Spring ,你知道 MyBatis 加载 Mapper 的底层原理吗?

    原文链接:抛开 Spring ,你知道 MyBatis 加载 Mapper 的底层原理吗? 大家都知道,利用 Spring 整合 MyBatis,我们可以直接利用 @MapperScan 注解或者 @ ...

  2. spring扫描classpath下特定package,并加载具有特定注解的接口

    spring扫描classpath下特定package,并加载具有特定注解的接口. 在框架平台的开发中,通常有很多的情况通过spring配置方式来实现某些功能会使得框架平台难以使用和扩展,我们通常的做 ...

  3. 【死磕 Spring】----- IOC 之 Spring 统一资源加载策略

    原文出自:http://cmsblogs.com 在学 Java SE 的时候我们学习了一个标准类 java.net.URL,该类在 Java SE 中的定位为统一资源定位器(Uniform Reso ...

  4. hibernate框架学习之数据抓取(加载)策略

    Hibernate获取数据方式 lHibernate提供了多种方式获取数据 •load方法获取数据 •get方法获取数据 •Query/ Criteria对象获取数据 lHibernate获取的数据分 ...

  5. hibernate框架学习第六天:QBC、分页查询、投影、数据加载策略、二级缓存

    QBC查询 1.简单查询 Criteria c = s.createCriteria(TeacherModel.class); 2.获取查询结果 多条:list 单挑:uniqueResult 3.分 ...

  6. Hibernate 加载策略得总结

    Hibernate 加载策略得总结 加载策略(优化查询): 策略种类: 延迟加载: 等到使用的时候才会加载数据. 立即加载: 不管使用不使用,都会立刻将数据加载. 策略的应用: 类级别的加载策略. 关 ...

  7. 【sping揭秘】6、IOC容器之统一资源加载策略

    Spring中的resource 我们先看看类之间的关系 注意我们的application是间接继承了resourceloader的,也就是说我们的application其实就是一个resourcel ...

  8. mybatis 加载配置文件的方法

    一.  使用sqlSessionFactory 的 mapperLocations 进行加载 <!-- SessionFactory --> <bean id="sqlSe ...

  9. ios资源加载策略

    做了好几个月的ios,大框架都是别人搭好的,自己只是实现逻辑,很是失落.慢慢开始整理学习一些概念类的东西吧,希望自己能提高点. cocos2d-x从cocos2d-2.0-x-2.0.2开始,考虑到自 ...

随机推荐

  1. CoSky-Mirror 就像一个镜子放在 Nacos、CoSky 中间,构建一个统一的服务发现平台

    CoSky 基于 Redis 的服务治理平台(服务注册/发现 & 配置中心) Consul + Sky = CoSky CoSky 是一个轻量级.低成本的服务注册.服务发现. 配置服务 SDK ...

  2. [leetcode] (周赛)869. 重新排序得到 2 的幂

    869. 重新排序得到 2 的幂 枚举排列,然后验证.比较暴力. 其实好一点的做法应该反过来,先把int范围下的2的N幂算出来,然后一个一个验证给出的数能不能拼成. class Solution { ...

  3. 在cuDNN中简化Tensor Ops

    在cuDNN中简化Tensor Ops 在Tesla V100 GPU中引入神经网络模型以来,神经网络模型已迅速利用NVIDIA Tensor Cores进行深度学习.例如,基于Tensor Core ...

  4. TensorFlow中的语义分割套件

    TensorFlow中的语义分割套件 描述 该存储库用作语义细分套件.目标是轻松实现,训练和测试新的语义细分模型!完成以下内容: 训练和测试方式 资料扩充 几种最先进的模型.轻松随插即用 能够使用任何 ...

  5. 保姆级尚硅谷SpringCloud学习笔记(更新中)

    目录 前言 正文内容 001_课程说明 002_零基础微服务架构理论入门 微服务优缺点[^1] SpringCloud与微服务的关系 SpringCloud技术栈 003_第二季Boot和Cloud版 ...

  6. Python 机器学习实战 —— 监督学习(上)

    前言 近年来AI人工智能成为社会发展趋势,在IT行业引起一波热潮,有关机器学习.深度学习.神经网络等文章多不胜数.从智能家居.自动驾驶.无人机.智能机器人到人造卫星.安防军备,无论是国家级军事设备还是 ...

  7. storage事件中的坑,storage.setItem()无法触发storage事件

    一.概述 众所周知,以下代码可以用来监听页面中localstorage和sessionstorage中属性值的变化 window.addEventListener('storage', event=& ...

  8. 【Azure 机器人】微软Azure Bot 编辑器系列(3) : 机器人对话流中加入帮助和取消按钮功能 (The Bot Framework Composer tutorials)

    欢迎来到微软机器人编辑器使用教程,从这里开始,创建一个简单的机器人. 在该系列文章中,每一篇都将通过添加更多的功能来构建机器人.当完成教程中的全部内容后,你将成功的创建一个天气机器人(Weather ...

  9. 「10.16晚」序列(....)·购物(性质)·计数题(DP)

    A. 序列 考场不认真读题会死..... 读清题就很简单了,分成若干块,然后块内递增,块外递减,同时使最大的块长为$A$ B. 购物 考场思路太局限了,没有发现性质, 考虑将$a_{i}$,排序前缀和 ...

  10. csp-c模拟测试43「A·B·C」

    B 题解 $f[i][(gcd(prime[j]*prime[k]\%P,P))]=\sum\limits_{k=1}^{k<=num} f[i-1][k]*phi(\frac{P}{prime ...