• Mybatis缓存及高级映射


    缓存

     

    • 如果想看看mybatis中执行的sql语句,可以做如下配置:
    • 在项目中导入log4j.jar相关jar包和log4j.properties文件;在mybatis的配置文件中配置如下即可:
    	
           
    
    

    一级缓存

     

    • 注意:在测试一级缓存存在的时候,一定要保证session的统一
    • 测试一级缓存的作用域:session

    Mybatis的查询策略(原理)

    • 当用户发情请求时,并不是直接去数据库中查询,先到缓存中去命中,如果命中,则直接返回结果,如果缓存中没有要查找的数据,这个时候才会去数据库查询,
    • 查询结束之后会将结果保存一份在缓存中,然后将结果返回,当下一次在发出相同的查询语句时,则直接从缓存中获取数据返回,不会去查询数据库。
      • 注意:当执行增删改操作的时候,会刷新缓存。
      • Mybatis的一级缓存默认是开启的。
      • 注意:使用时要保证session的统一。
    • a、MyBatis在开启一个数据库会话时,会 创建一个新的SqlSession对象,SqlSession对象中会有一个Executor对象。Executor对象中持有一个PerpetualCache对象;
    • 当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。
    • b、如果SqlSession调用了close()方法,会释放掉一级缓存PerpetualCache对象,一级缓存将不可用。
    • c、如果SqlSession调用了clearCache(),会清空PerpetualCache对象中的数据,但是该对象仍可使用。
    • d、SqlSession中执行了任何一个update操作(update()、delete()、insert()) ,都会清空PerpetualCache对象的数据,但是该对象可以继续使用。

     

    二级缓存

    • 二级缓存是可以跨session的

     

    • Mybatis的二级缓存也是默认开启的,但是还是要配置一下。
    • eviction:代表的是缓存回收策略,目前MyBatis提供以下策略。
    •     (1) LRU,最近最少使用的,最长时间不用的对象
    •     (2) FIFO,先进先出,按对象进入缓存的顺序来移除他们
    • flushInterval:刷新间隔时间,单位为毫秒
    • size:引用数目,一个正整数,代表缓存最多可以存储多少个对象,不宜设置过大。设置过大会导致内存溢出。
    • readOnly:只读,意味着缓存数据只能读取而不能修改,这样设置的好处是我们可以快速读取缓存,缺点是我们没有办法修改缓存,他的默认值是false,不允许我们修改
    • 虽然二级缓存的开关是默认开启的,但是要指明二级缓存的开关。
    • 此外还需要在在核心配置文件的setting中配置cacheEnabled,同时pojo对象必须是可序列化的,既要求实现序列化接口;
    • 注意:mybatis的二级缓存如果想有效果的话,则必须要让实体类实现序列化接口

    ResultMap 高级映射

    • resultMap 元素是 MyBatis 中最重要最强大的元素。它就是让你远离 90%的需要从结果 集中取出数据的 JDBC 代码的那个东西, 而且在一些情形下允许你做一些 JDBC 不支持的事 情。
    • 事实上, 编写相似于对复杂语句联合映射这些等同的代码, 也许可以跨过上千行的代码。 ResultMap的设计就是简单语句不需要明确的结果映射,而很多复杂语句确实需要描述它们的关系。
    • resultMap 常用属性
    • id – 一个 ID 结果;标记结果作为 ID 可以帮助提高整体效能
    • result – 注入到字段或 JavaBean 属性的普通结果
    • association – 一个复杂的类型关联;许多结果将包成这种类型,包含了另外一个对象的引用时,mybatis无法实现自动的映射,需要使用手动映射,同时autoMapping也需要手动的 开启
    • 嵌入结果映射 – 结果映射自身的关联,或者参考一个
    • collection – 复杂类型的集合
    • 嵌入结果映射 – 结果映射自身的集,或者参考一个
    • 拓展:当进行多表关联查询时,无法使用一个对象完成对结果的封装时,可以使用hashmap进行封装,
    • 如果返回的是一个结果时,接口中的方法返回hashMap,xml中的resultMap中封装类型也是hashMap;
    • 如果返回的是多个结果时,接口中的方法返回类型应该是list集合,xml中的sql语句封装类型还是hashMap,遵循mybatis的输入和输出参数类型。
    • 1:1对1的映射
    • 关联元素处理有一个”类型的关系。一般用于一对一的对应关系
    • property  映射到java类中的属性名称。
    • javaType  property属性的类型全路径,支持别名
    • association的子标签用法和resultMap 子标签的用法一致。
    • 注意:关联查询中的自动映射无效,需要手动开启。
    • 需求:查询冠希哥和他老婆的信息,返回Husband对象 , 最简单的就是返回一个HashMap
    • 注意:mybatis 自动封装只能完成简单类型的封装,复杂的类型无法封装 ---- 手动封装

     

    对多的映射

    Property:属性名字

    ofType : 集合中封装的类型,就是泛型

    javaType:属性的类型

    集合元素的作用几乎和关联是相同的。实际上,它们也很相似,文档的异同是多余的。所以我们更多关注于它们的不同。他主要是用来处理一对多的映射关系

    需求:查询10号部门中的员工信息和部门信息,返回部门对象(部门对象中包含了所有的员工信息)

     

  • 相关阅读:
    Qemu系统模拟:1 简介
    Io流 小总结
    Skywalking Docker单机环境搭建
    SQL获取当前年月的每一天
    安装开源的apache的依赖库apr
    Python、Rust中的协程
    Rancher - v2.6.5升级v2.7.0
    opencv-直方图
    2021年下半年信息安全工程师上午真题及答案解析
    面试官:请说一下如何优化结构体的性能?
  • 原文地址:https://blog.csdn.net/m0_73030012/article/details/127743582