一级缓存

测试案例:

MyBatisTest.java

        //缓存
@Test
public void testFindCustomerCache1() throws Exception{ SqlSession sqlSession=dataConn.getSqlSession(); //调用userMapper的方法
Customer customer1=sqlSession.selectOne("test.findCustomerById",);
System.out.println("用户姓名:"+customer1.getUsername()); Customer customer2=sqlSession.selectOne("test.findCustomerById",);
System.out.println("用户姓名:"+customer2.getUsername());
sqlSession.close();
}

测试结果:

只查询了一次

DEBUG [main] - ==>  Preparing: SELECT * FROM CUSTOMER WHERE cus_id=?
DEBUG [main] - ==> Parameters: (Integer)
DEBUG [main] - <== Total:
用户姓名:Mr
用户姓名:Mr
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@42d8062c]

两次查询之间出现增删该查等情况时,即执行commit()方法。

在UserMapper.xml最后面加上

   <update id="updateCustomerAcNo" parameterType="cn.com.mybatis.po.Customer" >
UPDATE CUSTOMER SET acno = #{acno} WHERE cus_id=#{cus_id}
</update>

在MyBatisTest.java中测试

        @Test
public void testFindCustomerCache2() throws Exception{ SqlSession sqlSession=dataConn.getSqlSession(); //调用userMapper的方法
Customer customer1=sqlSession.selectOne("test.findCustomerById",);
System.out.println("用户姓名:"+customer1.getUsername()+"|"
+"卡号:"+customer1.getAcno()); String AcNo = "";
customer1.setAcno(AcNo);
System.out.println("修改用户卡号为:"+AcNo);
sqlSession.update("test.updateCustomerAcNo",customer1);
sqlSession.commit(); Customer customer2=sqlSession.selectOne("test.findCustomerById",);
System.out.println("用户姓名:"+customer2.getUsername()+"|"
+"卡号:"+customer2.getAcno()); sqlSession.close();
}

观察结果:

com.mysql.jdbc.JDBC4Connection@42d8062c]
DEBUG [main] - ==> Preparing: SELECT * FROM CUSTOMER WHERE cus_id=?
DEBUG [main] - ==> Parameters: (Integer)
DEBUG [main] - <== Total:
用户姓名:Mr|卡号:
修改用户卡号为:
DEBUG [main] - ==> Preparing: UPDATE CUSTOMER SET acno = ? WHERE cus_id=?
DEBUG [main] - ==> Parameters: (String), (Integer)
DEBUG [main] - <== Updates:
DEBUG [main] - Committing JDBC Connection [com.mysql.jdbc.JDBC4Connection@42d8062c]
DEBUG [main] - ==> Preparing: SELECT * FROM CUSTOMER WHERE cus_id=?
DEBUG [main] - ==> Parameters: (Integer)
DEBUG [main] - <== Total:
用户姓名:Mr|卡号:
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@42d8062c]
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@42d8062c]
DEBUG [main] - Returned connection to pool.

二级缓存

检查Customer.java文件

属性以及是否实现序列化接口

public class Customer implements Serializable{
private int cus_id;
private String username;
private String acno;
private String gender;
private String phone;
private List<Batch> batchList;
....
}

在MyBatisTest.java中测试

    @Test
public void testFindCustomerOnMapper1() throws Exception{
SqlSession sqlSession=dataConn.getSqlSession(); //获取Mapper代理
CustomerMapper customerMapper1=sqlSession.getMapper(CustomerMapper.class);
//执行Mapper代理对象的查询方法
Customer customer1=customerMapper1.findCustomerById();
System.out.println("用户姓名:"+customer1.getUsername()+"|"
+"卡号:"+customer1.getAcno()); //获取Mapper代理
CustomerMapper customerMapper2=sqlSession.getMapper(CustomerMapper.class);
//执行Mapper代理对象的查询方法
Customer customer2=customerMapper2.findCustomerById();
System.out.println("用户姓名:"+customer2.getUsername()+"|"
+"卡号:"+customer2.getAcno()); sqlSession.close();
}

得到结果:

DEBUG [main] - ==>  Preparing: SELECT * FROM CUSTOMER WHERE cus_id=?
DEBUG [main] - ==> Parameters: (Integer)
DEBUG [main] - <== Total:
用户姓名:Mr|卡号:
用户姓名:Mr|卡号:

若二级缓存中两个查询之间多出了commit()方法的执行?

MyBatisTest.java继续测试

        @Test
public void testFindCustomerOnMapper2() throws Exception{
SqlSession sqlSession=dataConn.getSqlSession(); //获取Mapper代理
CustomerMapper customerMapper1=sqlSession.getMapper(CustomerMapper.class);
//执行Mapper代理对象的查询方法
Customer customer1=customerMapper1.findCustomerById();
System.out.println("用户姓名:"+customer1.getUsername()+"|"
+"卡号:"+customer1.getAcno()); //获取Mapper代理
CustomerMapper customerMapper2=sqlSession.getMapper(CustomerMapper.class);
String AcNo = "";
customer1.setAcno(AcNo);
//执行Mapper代理对象的修改方法
customerMapper2.updateCustomerAcNo(customer1);
System.out.println("修改用户姓名:"+customer1.getUsername()+"|"
+"的卡号为:"+customer1.getAcno());
sqlSession.commit(); //获取Mapper代理
CustomerMapper customerMapper3=sqlSession.getMapper(CustomerMapper.class);
//执行Mapper代理对象的查询方法
Customer customer3=customerMapper3.findCustomerById();
System.out.println("用户姓名:"+customer3.getUsername()+"|"
+"卡号:"+customer3.getAcno()); sqlSession.close();
}

测试结果:

DEBUG [main] - ==>  Preparing: SELECT * FROM CUSTOMER WHERE cus_id=?
DEBUG [main] - ==> Parameters: (Integer)
DEBUG [main] - <== Total:
用户姓名:Mr|卡号:
DEBUG [main] - ==> Preparing: UPDATE CUSTOMER SET acno = ? WHERE cus_id=?
DEBUG [main] - ==> Parameters: (String), (Integer)
DEBUG [main] - <== Updates:
修改用户姓名:Mr|的卡号为:
DEBUG [main] - Committing JDBC Connection [com.mysql.jdbc.JDBC4Connection@13c27452]
DEBUG [main] - ==> Preparing: SELECT * FROM CUSTOMER WHERE cus_id=?
DEBUG [main] - ==> Parameters: (Integer)
DEBUG [main] - <== Total:
用户姓名:Mr|卡号:
DEBUG [main] - Resetting autocommit to true on JDBC Connection

第六章.MyBatis缓存结构的更多相关文章

  1. MyBatis缓存结构

    Mybatis Cache结构图: CacheKey(statementId, sql, sqlParams,other). 上图展示了Mybatis Cache的结构: 1)每个Mapper对应一块 ...

  2. 第三章 - CPU缓存结构和java内存模型

    CPU 缓存结构原理 CPU 缓存结构 查看 cpu 缓存 速度比较 查看 cpu 缓存行 cpu 拿到的内存地址格式是这样的 CPU 缓存读 根据低位,计算在缓存中的索引 判断是否有效 0 去内存读 ...

  3. 第六章 mybatis注入映射器

    为了代替手工使用 SqlSessionDaoSupport 或 SqlSessionTemplate 编写数据访问对象 (DAO)的代码,MyBatis-Spring 提供了一个动态代理的实现:Map ...

  4. csapp第六章笔记-存储器结构

    目录 随机访问存储器(Random-Access-Memory) 静态RAM 动态RAM 增强的DRAM 非易失性存储器 磁盘存储 磁盘构成 磁盘容量 磁盘操作 逻辑磁盘块 访问磁盘和连接I/O设备 ...

  5. 【转】MaBatis学习---源码分析MyBatis缓存原理

    [原文]https://www.toutiao.com/i6594029178964673027/ 源码分析MyBatis缓存原理 1.简介 在 Web 应用中,缓存是必不可少的组件.通常我们都会用 ...

  6. Java EE数据持久化框架 • 【第5章 MyBatis代码生成器和缓存配置】

    全部章节   >>>> 本章目录 5.1 配置MyBatis Generator 5.1.1 MyBatis Generator介绍 5.1.2 MyBatis Generat ...

  7. OpenGL ES着色器语言之语句和结构体(官方文档第六章)内建变量(官方文档第七、八章)

    OpenGL ES着色器语言之语句和结构体(官方文档第六章) OpenGL ES着色器语言的程序块基本构成如下: 语句和声明 函数定义 选择(if-else) 迭代(for, while, do-wh ...

  8. MyBatis的学习总结六:Mybatis的缓存【参考】

    一.Mybatis缓存介绍 正如大多数持久层框架一样,Mybatis同样提供了一级缓存和二级缓存 1.一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为Session, ...

  9. 第十六章 综合实例——《跟我学Shiro》

    简单的实体关系图 简单数据字典 用户(sys_user) 名称 类型 长度 描述 id bigint 编号 主键 username varchar 100 用户名 password varchar 1 ...

随机推荐

  1. Silverlight & Blend动画设计系列十一:沿路径动画(Animation Along a Path)

    Silverlight 提供一个好的动画基础,但缺少一种方便的方法沿任意几何路径对象进行动画处理.在Windows Presentation Foundation中提供了动画处理类DoubleAnim ...

  2. 了解:C#三维数组和锯齿数值

    此文章,只需了解,用到的不多. string[,,] three = new string[2, 3, 5];  //定义一个三维数组,给数组分别辅助2,3,5 对此数组的解释://有2个二维数组,每 ...

  3. HttpContext在多线程异步调用中的使用方案

    1.在线程调用中,有时候会碰到操作文件之类的功能.对于开发人员来说,他们并不知道网站会被部署在服务器的那个角落里面,因此根本无法确定真实的物理路径(当然可以使用配置文件来配置物理路径),他们唯一知道的 ...

  4. java 并发(六) --- 锁

          阅读前阅读以下参考资料,文章图片或代码部分来自与参考资料 概览 一张图了解一下java锁. 注 : 阻塞将会切换线程,切换内核态和用户态,是比较大的性能开销 各种锁 为什么要设置锁的等级 ...

  5. js返回树形结构数据

    /** * 树形结构转换 * @param a * @param idStr * @param pidStr * @param chindrenStr * @returns {Array} */ fu ...

  6. GeneratedKeyHolder的作用:获得新建主键值

    Spring利用GeneratedKeyHolder,提供了一个可以返回新增记录对应主键值的方法: int update(PreparedStatementCreator psc, KeyHolder ...

  7. 十、集成使用redis

    一.简介 redis是一种非关系型数据库,它的数据结构是key-value的存储形式:能够支持多种类型的数据存储,如:string/list/map/object...等.springboot自然也对 ...

  8. 无法解析 id,或者它不是字段

    解决方法:首先,看下R文件,有没有你上面的ID.没有的话,点项目-clean . 有的话,估计你是导了android里面的那个R包了,你看看你导的包有木有 “import android.R”有的话去 ...

  9. php查找字符串中第一个非0的位置截取

    $str = '00000000000000000000000000000000000000001234506'; $preg = '/[0]*/'; $result = preg_replace($ ...

  10. IndexedDB(二:索引)

    在HTML5本地存储--IndexedDB(一:基本使用)中介绍了关于IndexedDB的基本使用方法,很不过瘾,这篇我们来看看indexedDB的杀器--索引. 熟悉数据库的同学都知道索引的一个好处 ...