学习之hibernate下册

QBC(Query By Criteria)
@Test
	public void getList(){
		SessionFactory factory = HibernateUtils.getSessionFactory();
		Session session = factory.getCurrentSession();
		session.beginTransaction();
		//
		Criteria criteria = session.createCriteria(Person.class);
		List<Person> list = criteria.list();
		for(Person person : list){
			System.out.println(person);
		}
		session.getTransaction().commit();
		factory.close();
	}
分页查询
@Test
	public void getPage(){
		SessionFactory factory = HibernateUtils.getSessionFactory();
		Session session = factory.getCurrentSession();
		session.beginTransaction();
		//
		Criteria criteria = session.createCriteria(Person.class);
		criteria.setFirstResult(0);
		criteria.setMaxResults(2);
		List<Person> list = criteria.list();
		for(Person person : list){
			System.out.println(person);
		}
		session.getTransaction().commit();
		factory.close();
	}
排序查询

Alt text

条件查询

Alt text
Alt text

GT: Greater Than , >
GE: Greater than or Equivalent with , >=
LT: Less than, <
LE: Less than or Equivalent with, <=
EQ:equal with, ==
NE: Not equal with, /=

离线查询

先进行查询语句的拼装, 和以往在查询的时候拼装不同,往往是再此进行优化的设置。

@Test
	public void detachedCriteria(){
		//假设此处是service层,在此组装查询条件
		DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Person.class);
		detachedCriteria.add(Restrictions.like("name", "%p%"));
		detachedCriteria.add(Restrictions.gt("age", 32));
		// dao
		SessionFactory factory = HibernateUtils.getSessionFactory();
		Session session = factory.getCurrentSession();
		session.beginTransaction();
		//采用从业务层传递过来对象进行查询
		Criteria criteria = detachedCriteria.getExecutableCriteria(session);
		List<Person> list = criteria.list();
		for(Person person : list){
			System.out.println(person);
		}
		
		session.getTransaction().commit();
		factory.close();
	}
缓存

缓存(Cache): 计算机领域非常通用的概念。它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是降低应用程序直接读写硬盘(永久性数据存储源)的频率,从而提高应用的运行性能。缓存中的数据是数据存储源中数据的拷贝。缓存的物理介质通常是内存
缓存:程序<--(内存)-->硬盘

1.hibernate 提供缓存机制:一级缓存、二级缓存

  1. 一级缓存:session级别缓存,在一次请求中共享数据。
  2. 二级缓存:sessionFactory级别缓存,整个应用程序共享一个会话工厂,共享一个二级缓存。
  3. SessionFactory的缓存两部分:
    a)内置缓存:使用一个Map,用于存放配置信息,预定义SQL语句等,提供给Hibernate框架自己使用,对外只读的。不能操作。
    b)外置缓存:使用另一个Map,用于存放用户自定义数据。默认不开启。外置缓存hibernate只提供规范(接口),需要第三方实现类。外置缓存有成为二级缓存。

1.适合放入二级缓存中的数据:

  • a)很少被修改
  • b)经常被访问
  • c)不是很重要的数据, 允许出现偶尔的并发问题

2.不适合放入二级缓存中的数据:

  • a)经常被修改
  • b)财务数据, 绝对不允许出现并发问题

缓存供应商:
1.EHCache: 可作为进程(单机)范围内的缓存, 存放数据的物理介质可以是内存或硬盘, 对 Hibernate 的查询缓存提供了支持。--支持集群。(
2.OpenSymphony `:可作为进程范围内的缓存, 存放数据的物理介质可以是内存或硬盘, 提供了丰富的缓存数据过期策略, 对 Hibernate 的查询缓存提供了支持
3.SwarmCache: 可作为集群范围内的缓存, 但不支持 Hibernate 的查询缓存
4.JBossCache:可作为集群范围内的缓存, 支持 Hibernate 的查询缓存(

  1. 导入jar包:ehcache-1.5.0.jar/ commons-logging.jar/ backport-util-concurrent.jar
  1. 开启二级缓存
  2. 确定二级缓存提供商
  3. 确定需要缓存内容
    1. 配置需要缓存的类

    2. 配置需要缓存的集合

  4. 配置ehcache自定义配置文件
    非严格读写(notstrict-read-write)不保证Cache和数据库之间的数据库的一致性。使用此策略时,应该设置足够的缓存过期时间,否则可能从缓存中读出脏数据。当一些数据极少改变,并且当这些数据和数据库有一部份不量影响不大时,可以使用此策略。

解读它的配置文件

 <defaultCache
            maxElementsInMemory="10000" // cache中最多保存对象的数量
            eternal="false" // 缓存中的对象是否永久
            timeToIdleSeconds="120" // 缓存数据的钝化时间(设置对象在过期之前的空闲时间)
            timeToLiveSeconds="120" // 缓存数据的生存时间(设置对象在过期之前的生存时间),如果用到再次加载
            overflowToDisk="true" // 内存不足时,是否采用磁盘储存。
            memoryStoreEvictionPolicy=" LRU " // 内存不足时对对象的清楚策略
ehcache中缓存的三种情况策略
FIFO:先进先出
LFU:一直以来很少被使用
LRU:最近很少被使用,清楚离储存数据的时间戳最远的对象
查询缓存

1.查询缓存又称为三级缓存
2.查询缓存默认不使用。需要手动开启
3.查询缓存:将HQL语句与 查询结果进行绑定。通过HQL相同语句可以缓存内容。
a)默认情况Query对象只将查询结果存放在一级和二级缓存,不从一级或二级缓存获取。
b)查询缓存就是让Query可以从二级缓存获得内容。

使用步骤
1.开启二级缓存
2.在查询query对象,设置缓存内容(注意:存放和查询 都需要设置)

true

@Test
	/**
	 * 查询集合
	 */
	public void testQueryCache(){
		SessionFactory factory = HibernateUtils.getSessionFactory();
		Session session = factory.getCurrentSession();
		session.beginTransaction();
		//
		Query query = session.createQuery("from Person");
		//设置使用查询缓存
		query.setCacheable(true);
		query.list();
		//
		session.getTransaction().commit();
		//开启一个新的session
		Session session2 = factory.getCurrentSession();
		session2.beginTransaction();
		Query query2 = session2.createQuery("from Person");
		query2.setCacheable(true);
		query2.list();
		session2.getTransaction().commit();
		
		factory.close();
	}
批量处理

批量插入
批量更新
批量删除

整合c3p0连接池
配置事务隔离级别
  1. 乐观锁
  2. 悲观锁
整合篇章
posted @ 2017-12-16 11:58  老螃蟹  阅读(149)  评论(0编辑  收藏  举报