Mybatis缓存及高级映射

缓存

 

  • 如果想看看mybatis中执行的sql语句,可以做如下配置:
  • 在项目中导入log4j.jar相关jar包和log4j.properties文件;在mybatis的配置文件中配置如下即可:
	<settings>
       <!-- 打印查询语句 -->
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>

一级缓存

 

  • 注意:在测试一级缓存存在的时候,一定要保证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的映射
  • <association property="" javaType="">
  • 关联元素处理有一个”类型的关系。一般用于一对一的对应关系
  • property  映射到java类中的属性名称。
  • javaType  property属性的类型全路径,支持别名
  • association的子标签用法和resultMap 子标签的用法一致。
  • 注意:关联查询中的自动映射无效,需要手动开启。
  • 需求:查询冠希哥和他老婆的信息,返回Husband对象 , 最简单的就是返回一个HashMap
  • 注意:mybatis 自动封装只能完成简单类型的封装,复杂的类型无法封装 ---- 手动封装

 

对多的映射

<collection property="" ofType=""javaType="">

Property:属性名字

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

javaType:属性的类型

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

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

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大黑翔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值