学习之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();
}
排序查询
条件查询
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 提供缓存机制:一级缓存、二级缓存
- 一级缓存:session级别缓存,在一次请求中共享数据。
- 二级缓存:sessionFactory级别缓存,整个应用程序共享一个会话工厂,共享一个二级缓存。
- 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 的查询缓存(
- 导入jar包:ehcache-1.5.0.jar/ commons-logging.jar/ backport-util-concurrent.jar
- 开启二级缓存
- 确定二级缓存提供商
- 确定需要缓存内容
-
配置需要缓存的类
-
配置需要缓存的集合
-
- 配置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对象,设置缓存内容(注意:存放和查询 都需要设置)
@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连接池
配置事务隔离级别
锁
- 乐观锁
- 悲观锁