<pre name="code" class="html"><p><pre name="code" class="html">
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
/*
* ①什么操作会向一级缓存放入数据 save,update,saveOrUpdate,load,get,list,iterate,lock save
* 案例: //添加一个学生 Student student=new Student(); student.setName("小东");
*
* s.save(student);//放入一级缓存
*
* //我马上查询 Student stu2=(Student) s.get(Student.class, student.getId());
* //select System.out.println("你刚刚加入的学生名字是"+stu2.getName());
* ②什么操作会从一级缓存取数据. get / load / list
*
* get / load 会首先从一级缓存中取,如没有.再有不同的操作[get 会立即向数据库发请求,而load
* 会返回一个代理对象,直到用户真的去使用数据,才会向数据库发请求] ?list 会不会从session缓存取数据? 案例: //查询45号学生
*
* Student stu=(Student) s.get(Student.class, 45);
*
*
*
* String hql="from Student where id=45";
*
*
* Student stu2=(Student) s.createQuery(hql).uniqueResult();
*
* System.out.println(stu2.getName()); 从上面的案例,我看出 query.list()
* query.uniueResut() 不会从一级缓取数据! 但是query.list 或者query.uniqueRestu()
* 会向一级缓存放数据的. ③一级缓存不需要配置,就可以使用,它本身没有保护机制,所以我们程序员要考虑这个问题,我们可以同 evict 或者
* clear来清除session缓存中对象. evict 是清除一个对象,clear是清除所有的sesion缓存对象
* ④session级缓存中对象的生命周期, 当session关闭后,就自动销毁.
* 我们自己用HashMap来模拟一个Session缓存,加深对缓存的深入
* 下面是代码实现
*/
public class MyCache {
/**
* @param args
*/
static Map<Integer, Student> map = new HashMap<Integer, Student>();
public static void main(String[] args) {
// TODO Auto-generated method stub
// MyCache.getStudentById(1)需判断返回对象是否为空,我这没判断
System.out.println(MyCache.getStudentById(1).getName());
System.out.println(MyCache.getStudentById(1).getName());
System.out.println(MyCache.getStudentById(3).getName());
System.out.println(MyCache.getStudentById(3).getName());
}
public static Student getStudentById(Integer id) {
if (map.containsKey(id)) {
System.out.println("从缓存取出");
return map.get(id);
} else {
System.out.println("从数据库取出");
Student stu = MyDb.findById(id);
if (stu != null) {
map.put(id, stu);
}
/*
* for(Entry<Integer,Student> entry:map.entrySet()) {
* System.out.println(entry.getKey()); }
*/
return stu;
}
}
static class MyDb {
static List<Student> lists = new ArrayList<Student>();
static {
//这可以改善,6连接数据库获取数据 这儿仅仅是简单的实现
Student s1 = new Student();
s1.setId(1);
s1.setName("lv");
Student s2 = new Student();
s2.setId(2);
s2.setName("de");
Student s3 = new Student();
s3.setId(3);
s3.setName("lu");
lists.add(s1);
lists.add(s2);
lists.add(s3);
}
public static Student findById(Integer id) {
for (Student s : lists) {
if (s.getId().equals(id)) {
return s;
}
}
return null;
}
}
public static class Student {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
Hibernate 一级缓存模拟实现详解(java)
最新推荐文章于 2020-06-15 22:06:43 发布