学习之hibernate下册

Posted 老螃蟹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习之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 提供缓存机制:一级缓存、二级缓存

  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对象,设置缓存内容(注意:存放和查询 都需要设置)

@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. 悲观锁
整合篇章






















以上是关于学习之hibernate下册的主要内容,如果未能解决你的问题,请参考以下文章

hibernate框架学习之核心API

hibernate框架学习之核心配置文件

Spring 学习之二(Spring 和 hibernate 整合)

spring 学习之三(spring 与hibernate, struts2整合)

Hibernate学习之简单应用

hibernate框架学习之对象状态