• 学习之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. 悲观锁
    整合篇章
  • 相关阅读:
    ThinkPHP实现定时任务
    VUE 父子组件之间通信传值 props和 $emit,事件触发传值ref,以及兄弟组件之间的通信传值 eventBus
    JS链接转换为二维码
    VUE 动态切换列表active样式
    微信内置浏览器video标签自动全屏的问题
    JS监听video视频播放时间
    JS数据统计表 highcharts.js的运用
    JS 自动返回每个月的天数
    JS 一键复制插件应用 和 原生实现
    JS enter键一键登录
  • 原文地址:https://www.cnblogs.com/jwlxtf/p/8046224.html
Copyright © 2020-2023  润新知