mybatis12一级缓存
验证一级缓存的存在
对应的实体类
/**
*学生对应的实体类
*/
public class Student { private Integer sId;
private String sName; public Integer getsId() {
return sId;
}
public void setsId(Integer sId) {
this.sId = sId;
}
public String getsName() {
return sName;
}
public void setsName(String sName) {
this.sName = sName;
}
public Student(Integer sId, String sName) {
super();
this.sId = sId;
this.sName = sName;
}
public Student() {
super();
}
@Override
public String toString() {
return "Student [sId=" + sId + ", sName=" + sName +"]";
}
}
对应的数据库--student表
CREATE DATABASE /*!32312 IF NOT EXISTS*/`mybatis` /*!40100 DEFAULT CHARACTER SET utf8 */; USE `mybatis`; DROP TABLE IF EXISTS `student`; CREATE TABLE `student` (
`sid` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`sname` varchar(20) DEFAULT NULL COMMENT '姓名',
PRIMARY KEY (`sid`)
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8; /*Data for the table `student` */ insert into `student`(`sid`,`sname`) values (1,'学生1'),(2,'学生2'),(3,'学生3'),(4,'学生4'),(5,'学生5');
创建对应的dao
public interface StudentDao {
/**
* 根据学生的编号查询对应的信息
* 验证一级缓存的存在
*/
Student selectStudentById(Integer sId);
}
对应的mapper文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-Mapper.dtd">
<mapper namespace="cn.bdqn.dao.StudentDao"> <!-- 查询指定学生的信息 验证一级缓存的存在 -->
<select id="selectStudentById" resultType="Student">
select sid,sname from student where sid=#{xxx}
</select> </mapper>
对应的测试类代码
package cn.bdqn.test; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; import cn.bdqn.bean.Student;
import cn.bdqn.dao.StudentDao;
import cn.bdqn.util.SessionUtil; public class TeacherTest {
StudentDao dao;
SqlSession session; @Before
public void before() {
// 因为需要关闭session 需要把session提取出去
session = SessionUtil.getSession();
dao = session.getMapper(StudentDao.class);
} @After
public void after() {
if (session != null) {
session.close();
}
} /**
* 验证一级缓存的存在
* myBatis的一级缓存是一直开启的,并且不能关闭!
*/
@Test
public void test1() {
Student student = dao.selectStudentById(1);
System.out.println(student);
//再次查询相同的id对象
Student student2 = dao.selectStudentById(1);
System.out.println(student2);
} }
查询语句的结果是:
只有一条查询结果!
验证mybatis缓存查询的依据!
在dao中增加一个方法
public interface StudentDao {
/**
* 验证mybatis缓存查询的依据!
*/
Student selectStudentById(Integer sId); Student selectStudentById2(Integer sId);
}
修改mapper文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-Mapper.dtd">
<mapper namespace="cn.bdqn.dao.StudentDao"> <!-- 查询指定学生的信息 验证mybatis缓存查询的依据!
两个查询语句的id不一致,但是sql语句一样-->
<select id="selectStudentById" resultType="Student">
select sid,sname from student where sid=#{xxx}
</select> <select id="selectStudentById2" resultType="Student">
select sid,sname from student where sid=#{xxx}
</select> </mapper>
增加测试代码
/**
* 验证查询的依据
* 两个查询都是查询id为1的学生对象,但是查询语句的id不一致
*/
@Test
public void test2() {
Student student = dao.selectStudentById(1);
System.out.println(student);
//再次查询相同的id对象
Student student2 = dao.selectStudentById2(1);
System.out.println(student2);
}
修改log4j配置文件
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%-5p] %c %L %m %n #log4j.rootLogger=trace,console
log4j.logger.cn.bdqn.dao.StudentDao=trace,console
#修改成对应的mapper文件中的namespace,就不会显示其他信息了
查询的结果是:
/**
* 得到的结论是:
* mybatis的查询依据是 : mapper文件中sql的id + sql语句!
* hibernate底层查询的依据是: 查询对象的id!
*
* 其实缓存的底层是一个map,
* map的key就是查询依据,value是查询的结果!
*/
验证增删改查对一级缓存的影响!
在dao中增加一个新增的方法
/**
* 验证增删改查对一级缓存的影响!
*/
void addStudent(Student student);
在mapper中新增
<!-- 新增一个学生 -->
<insert id="addStudent">
insert into student values(#{sId},#{sName})
<!--#{sId},#{sName} 对应的是实体类中的属性名 -->
</insert>
增加测试代码
/**
* 验证增删改对一级缓存的影响
* 之前是只有一条查询语句!
* 但是加上新增语句之后发现出现了再次查询!
*
* 因为增删改查操作都要清空缓存,把数据同步到数据库,
* 保证后续的查询得到正确的结果集!
*/
@Test
public void test3() {
Student student = dao.selectStudentById(1);
System.out.println(student);
dao.addStudent(new Student(66, "新增学生"));
//再次查询相同的id对象
Student student2 = dao.selectStudentById(1);
System.out.println(student2);
}
得到的结果是:
mybatis12一级缓存的更多相关文章
- [原创]关于mybatis中一级缓存和二级缓存的简单介绍
关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...
- MyBatis 延迟加载,一级缓存,二级缓存设置
什么是延迟加载 resultMap中的association和collection标签具有延迟加载的功能. 延迟加载的意思是说,在关联查询时,利用延迟加载,先加载主信息.使用关联信息时再去加载关联信息 ...
- hibernate笔记--缓存机制之 一级缓存(session缓存)
一级缓存: 又称为session缓存,它和session生命周期相同,周期非常短.是事务级别的缓存: 还是以Book和Category这两个表为例,我们用代码观察一个缓存的存在: 假设现在我要去查询i ...
- 在Hibernate框架中详谈一级缓存
在学习Hibernate的过程中我们肯定会碰上一个名词---缓存,一直都听说缓存机制是Hibernate中的一个难点,它分为好几种,有一级缓存,二级缓存和查询缓存 今天呢,我就跟大家分享分享我所理解的 ...
- hibernate缓存(一级缓存、二级缓存)
一.一级缓存(Session缓存) 意义:提高hibernate查询效率. 缺点:可能会因并发,产生数据不一致. 基于session的缓存,利用hibernate执行查询 ...
- [Nhibernate]一级缓存
目录 写在前面 文档与系列文章 一级缓存 一个例子 一级缓存管理 总结 写在前面 上篇文章介绍了nhibernate中对象的三种状态,通过对象的三种状态,很容易想到缓存. 什麽是缓存? 有时候,某些数 ...
- 【Java EE 学习 47】【Hibernate学习第四天】【sesion】【一级缓存】【懒加载】
一.Session概述 1.Session 接口是 Hibernate 向应用程序提供的操纵对数据库的最主要的接口, 它提供了基本的保存, 更新, 删除和加载Java 对象的方法. 2.理解Sessi ...
- 【Mybatis框架】查询缓存(一级缓存)
做Java的各位程序员们,估计SSH和SSM是我们的基础必备框架.也就是说我们都已经至少接触过了这两套常见的集成框架.当我们用SSH的时候,相信很多人都接触过hibernate的两级缓存,同样,相对应 ...
- 【转】hibernate缓存:一级缓存和二级缓存
什么是缓存? 缓存是介于物理数据源与应用程序之间,是对数据库中的数据复制一份临时放在内存中的容器,其作用是为了减少应用程序对物理数据源访问的次数,从而提高了应用程序的运行性能.Hibernate在进行 ...
随机推荐
- 学习笔记:iOS 视图控制器(UIViewController)剖析
转自:http://www.cnblogs.com/martin1009/archive/2012/06/01/2531136.html 视图控制器在iOS编程中占据非常重要的位置,因此我们一定要掌握 ...
- 608. Two Sum - Input array is sorted【medium】
Given an array of integers that is already sorted in ascending order, find two numbers such that the ...
- CCNA2.0笔记_VLSM
子网化:把一个大的主类网段,通过借位的方式逻辑划分多个子网段,应用于多个广播域: 做子网划分的时候,子网掩码最多只能到30位,不能再多划(因为至少要保留4个地址,即2个主机位) FLSM(定长子网掩码 ...
- Jquery Deferred 详解
近期由于公司项目主要由我来负责前端,所以打算优化一下代码.在jquery 里面有个Deferred的对象.为了研究这个也看了不少资料,其中阮一峰的博客写的很详细,这里转载一下. 一.什么是deferr ...
- Linq Mysql GroupBy语句的问题处理
语句如下: var resumeList = db.ChannelResume.Where(model); var groupValues = resumeList.GroupBy(t => n ...
- springbatch操作DB
一.需求分析 使用Spring Batch对DB进行读写操作: 从一个表中读取数据, 然后批量的插入另外一张表中. 二.代码实现 1. 代码结构图: 2. applicationContext.xml ...
- CSS Transform / Transition / Animation 属性的区别
back21 Jun 2011 Category: tech Tags: css 最近想UI的动画转到css3能吃进3d加速的属性上面来以加强动画的连贯性.只是对于css几个新加的属性不太熟悉,常常容 ...
- 嵌入式开发之信号采集同步---VSYNC和HSYNC的作用以及它们两者之间的关系
VSYNC和HSYNC的作用以及它们两者之间的关系 VSYNC和HSYNC的作用以及它们两者之间的关系 VSYNC和HSYNC是什么 VSYNC: vertical synchronization,指 ...
- HTML特殊字符的html、js、css写法汇总
⇠ 箭头类 符号 UNICODE 符号 UNICODE HTML JS CSS HTML JS CSS ⇠ ⇠ \u21E0 \21E0 ⇢ ⇢ \u21E2 \2 ...
- [Linux 学习] Centos 图形和命令行界面切换
要想切换图形界面和命令行界面切换, 需修改一个文件... root 下, 到 /etc/inittab 修改 id:5:initdefault Linux系统有7个运行级别(runlevel): 运行 ...