查询缓存
一级缓存:同一个sqlSession对象
MyBatis默认开启一级缓存,如果用同样的sqlSession对象查询相同的数据,则会在第一次查询时向数据库发送SQL语句,并将查询的结果放入到SQLSESSION中,后续再次查询该同样的对象时,则直接从缓存中查询该对象即可(即忽略了数据库的访问)。
注意:commit()之后缓存就会被清理,一般增删改操作之后要commit()。
 
二级缓存:
1.Mybatis自带二级缓存:同一个namespace生成的mapper对象
MyBatis默认没有开启二级缓存,需手工打开。
(1)conf.xml
    <!-- 开启二级缓存 -->
        <setting name="cacheEnabled" value="true"/>
(2)在具体的mapper.xml中声明开启
<!-- 声明此namespace开启二级缓存 -->
    <cache/>
结论:只要产生的xxMapper对象来自同一namespace,属于二级缓存

根据异常提示:NotSerializableException可知,MyBatis的二级缓存是将对象放入硬盘文件中。
序列化:内存--->硬盘
反序列化:硬盘--->内存
准备缓存的对象,必须实现序列化接口。其本类、父类、级联属性全部需要序列化。
注意:执行session.close()时,将一级缓存对象放入二级缓存。
 
禁用二级缓存:在想禁用的某个对象中<select useCache="false">
清理二级缓存:(1)与清理一级缓存的方法相同

commit(); (一般执行增删改时会清理缓存,原因:预防脏数据的产生)

在二级缓存中,commit()不能是查询自身的commit。

(2)在select标签中添加属性flushCache="true"

2.三方提供的二级缓存:ehcache、memcache
要想整合三方提供的二级缓存(或者自定义二级缓存),必须实现cache接口。
整合ehcache二级缓存:
(1)添加jar包

Ehcahe-Core-2.6.11.jar

mybatis-Ehcache-1.0.3.jar

    slf4j-api-1.7.25.jar
(2)编写配置文件Ehcache.xml
(3)开启ehCache二级缓存
在xxxMapper.xml中开启
    <!-- 开启ehcache二级缓存 -->
    <cache type="org.mybatis.caches.ehcache.EhcacheCache">
 
        <!-- 覆盖Ehcache中的值 -->
        <property name="maxElementsInMemory" value="2000"/>
    </cache>
逆向工程
表、类、接口、mapper.xml四者密切相关,因此,当知道其中一个的时候,其他三个应该可以自动生成。
表——>其他三个
实现步骤:
1.mybatis-generator-core.jar、mybatis.jar、mysql-connector-java.jar;
2.逆向工程的配置文件generator.xml;
3.执行。

MyBatis6——一级缓存、二级缓存、逆向工程的更多相关文章

  1. Mybatis一级、二级缓存

      Mybatis一级.二级缓存   一级缓存 首先做一个测试,创建一个mapper配置文件和mapper接口,我这里用了最简单的查询来演示. <mapper namespace="c ...

  2. Hibernate 再接触 一级缓存 二级缓存 查询缓存

    缓存 就是把本来应该放在硬盘里的东西放在内存里  将来存内存里读 一级缓存: session缓存 二级缓存: sessionFactory级别的   (适合经常访问,数据量有限,改动不大) 很多的se ...

  3. hibernate的获取session的两方法比较,和通过id获取对象的比较,一级缓存二级缓存

    opensession与currentsession的联系与区别 在同一个线程中opensession的session是不一样的,而currentsession获取的session是一样的,这就保证了 ...

  4. MyBatis(七):MyBatis缓存详解(一级缓存/二级缓存)

    一级缓存 ​ MyBatis一级缓存上SqlSession缓存,即在统一SqlSession中,在不执行增删改操作提交事务的前提下,对同一条数据进行多次查询时,第一次查询从数据库中查询,完成后会存入缓 ...

  5. MyBatis 一级、二级缓存

    一级 默认session就有一级缓存,session有C/U/D操作或者session.clearCache();session.commit();都会清空缓存: 二级在mapper.xml中添加&l ...

  6. 一级缓存二级缓存(hibernate)

    缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能.缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事 ...

  7. mybatis一级缓存二级缓存

    一级缓存 Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存,一级缓存只是相对于同一个SqlSession而言.所以在参数和SQL完全一样的情况下,我们使用同一个SqlSess ...

  8. hibernate的一级和二级缓存

    一级缓存就是Session级别的缓存,close后就没了. 二级缓存就是SessionFactory级别的缓存,全局缓存,要配置其他插件. 什么样的数据适合存放到第二级缓存中? 1.很少被修改的数据 ...

  9. Mysql中一级缓存二级缓存区别

    一级缓存: 也称本地缓存,sqlSession级别的缓存.一级缓存是一直开启的:与数据库同一次会话期间查询到的数据会放在本地缓存中. 如果需要获取相同的数据,直接从缓存中拿,不会再查数据库. 一级缓存 ...

  10. mybatis学习--缓存(一级和二级缓存)

    声明:学习摘要! MyBatis缓存 我们知道,频繁的数据库操作是非常耗费性能的(主要是因为对于DB而言,数据是持久化在磁盘中的,因此查询操作需要通过IO,IO操作速度相比内存操作速度慢了好几个量级) ...

随机推荐

  1. 开源分布式系统Druid简谈

    介绍 Druid是一个拥有大数据实时查询和分析的高容错.高性能开源分布式系统,旨在快速处理大规模的数据,并能够实现快速查询和分析.尤其是当发生代码部署.机器故障以及其他产品系统遇到宕机等情况时,Dru ...

  2. 史上最全CentOS6离线安装部署Cloudera Manager5.9.3

    史上最全CentOS6离线安装部署Cloudera Manager5.9.3

  3. The Preliminary Contest for ICPC Asia Shenyang 2019 C Dawn-K's water (完全背包)

    完全背包为什么要取到M,可以取到2*M嘛,这题需要整取,对于不能整取的背包容量,dp[k]=INF,以及dp[j-water[i].weight]=INF时,dp[j]也不需要更新.如果不整取的话,后 ...

  4. List(数组)里面常用的属性和方法

    常用属性: length 长度 reversed 翻转 isEmpty 是否为空 isNotEmpty 是否不为空常用方法: add 增加 addAll 拼接数组 增加多个数据 list.addAll ...

  5. Educational Codeforces Round 73

    唉,又是掉分的一场比赛... A. 2048 Game 题意:给出一个数组,问能不能通过一系列操作(将数组中的两个数相加变成另一个数),使得数组中包含2048,数组中的数全是2的指数,可以则输出YES ...

  6. 用python计算一条射线到两个平面的交点

    前两天,一个朋友找我(半个程序猿)用python帮他写数学模型,当时的我直接是懵逼的,当听到三维啥的时候,整个人就好了,最终在周末花了3个小时把逻辑理了一遍,给小伙伴一个满意的答复了,话不多说,我来整 ...

  7. Dubbo教程:入门到实战

    Dubbox简介 Dubbox 是一个分布式服务框架,其前身是阿里巴巴开源项目Dubbo ,被国内电商及互联网项目中使用,后期阿里巴巴停止了该项目的维护,当当网便在Dubbo基础上进行优化,并继续维护 ...

  8. WinForm开发(5)——DataGridView控件(3)——DataGridView控件操作

    一.禁止用户改变DataGridView的列宽.行高.列头高度 1.// 禁止用户改变DataGridView1的所有列的列宽 DataGridView1.AllowUserToResizeColum ...

  9. ROS机器人系统学习——踩坑之路

    推荐学习教程:深蓝学院 机器人操作系统ROS理论与实践学习 在学习到第2讲ROS基础的分布式通信时,一直卡在这里,主机开启小海龟后,从机虽然可以通过 rostopic list 列出当前的所有topi ...

  10. 策略模式,重构if-else

    最近完成了我们公司的公众号开发,在微信消息路由选择的时候一开始都是用if-else 来判断,后面if-else月写越多显得十分的乱.在网上简单查了一下解决方法,果然有不少干货,感觉最经典最简洁的还是使 ...