Hibernate 一级缓存模拟实现详解(java)

<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;
		}
	}
}


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值