chapter7.3开源软件_Hibernate框架应用v10(2)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

应用软件新技术NewTechnologyforApplicationSoftware第七章开源软件-Hibernate框架应用(3)北京邮电大学计算机学院袁燕妮yuanyanni@bupt.edu.cn内容*9.使用HQL查询10.缓存策略11.抓取策略*12.Struts和Hibernate的整合策略9.0HQL查询的概念概念1:缩写HibernateQueryLanguage2:是一种面向对象的查询语句,操作的对象是类、实例、属性3:支持继承和多态特征HQL查询1:依赖Query类2:每个Query类对应一个查询对象HQL查询的步骤1:获取HibernateSession对象2:编写HQL语句3:以HQL作为参数,调用Session的createQuery方法创建查询对象4:如果HQL语句包含参数,调用Query的setXXX方法为参数赋值5:调用Query对象的list等方法遍历查询结果在hql中关键字不区分大小写,但是属性和类名区分大小写示例参见工程:hibernate_hql9.1HQL示例(1)1简单属性查询【重要】单一属性查询,返回结果集属性列表,元素类型和实体类中相应的属性类型一致多个属性查询,返回的集合元素是对象数组,数组元素的类型和对应的属性在实体类中的类型一致,数组的长度取决与select中属性的个数如果认为返回数组不够对象化,可以采用hql动态实例化Student对象参见:SimplePropertyQueryTest.java9.1HQL示例(2)2.实体对象查询【重要】N+1问题,在默认情况下,使用query.iterate查询,有可能出现N+1问题所谓的N+1是在查询的时候发出了N+1条sql语句1:首先发出一条查询对象id列表的sqlN:根据id列表到缓存中查询,如果缓存中不存在与之匹配的数据,那么会根据id发出相应的sql语句*list和iterate的区别?list每次都会发出sql语句,list会向缓存中放入数据,而不利用缓存中的数据iterate:在默认情况下iterate利用缓存数据,但如果缓存中不存在数据有可以能出现N+1问题参见:SimpleObjectQueryTest1.java/SimpleObjectQueryTest2.java9.1HQL示例(3)3条件查询【重要】可以采用拼字符串的方式传递参数可以采用?来传递参数(索引从0开始)可以采用:参数名来传递参数如果传递多个参数,可以采用setParamterList方法在hql中可以使用数据库的函数,如:date_format参见:SimpleConditionQueryTest.java9.1HQL示例(4)4、hibernate也支持直接使用sql进行查询参见:SqlQueryTest.java5、外置命名查询*在映射文件中采用query标签来定义hql*在程序中采用session.getNamedQuery()方法得到hql查询串参见:Student.hbm.xml、NameQueryTest.java6、查询过滤器*在映射文件中定义过滤器参数*在类的映射中使用这些参数*在程序中启用过滤器参见:Student.hbm.xml、FilterQueryTest.java9.1HQL示例(5)7、分页查询【重要】*setFirstResult(),从0开始*setMaxResults,每页显示多少条数据参见:PageQueryTest.java8、对象导航查询,在hql中采用.进行导航【重要】参见:ObjectNavQueryTest.java9、连接查询【重要】*内连*外连接(左连接/右连接)参见:JoinQueryTest.java9.1HQL示例(6)10、统计查询【重要】参见:StatQueryTest.java11、DML风格的操作(尽量少用,因为和缓存不同步)参见:DMLQueryTest.java10.缓存策略(1)hibernate一级缓存一级缓存很短和session的生命周期一致,一级缓存也叫session级的缓存或事务级缓存那些方法支持一级缓存:get()load()iterate(查询实体对象)如何管理一级缓存:session.clear(),session.evict()如何避免一次性大量的实体数据入库导致内存溢出每N条数据就强制session将数据持久化,同时清除缓存,避免大量数据造成内存溢出,即先flush,再clear如果数据量特别大,考虑采用jdbc实现,如果jdbc也不能满足要求可以考虑采用数据本身的特定导入工具10.缓存策略(2)hibernate二级缓存二级缓存也称进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有的session共享二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存二级缓存的配置和使用:将echcache.xml文件拷贝到src下开启二级缓存,修改hibernate.cfg.xml文件propertyname=hibernate.cache.use_second_level_cachetrue/property指定缓存产品提供商,修改hibernate.cfg.xml文件propertyname=hibernate.cache.provider_classorg.hibernate.cache.EhCacheProvider/property指定那些实体类使用二级缓存(两种方法)在映射文件中采用cache标签在hibernate.cfg.xml文件中,采用class-cache标签二级缓存是缓存实体对象的10.缓存策略(3)hibernate查询缓存查询缓存是针对普通属性结果集的缓存对实体对象的结果集只缓存id查询缓存的生命周期,当前关联的表发生修改,那么查询缓存生命周期结束查询缓存的配置和使用:在hibernate.cfg.xml文件中启用查询缓存,如:propertyname=hibernate.cache.use_query_cachetrue/property在程序中必须手动启用查询缓存,如:query.setCacheable(true);11.抓取策略(1)1.hibernate抓取策略(单端代理的批量抓取)保持默认,同fetch=select,如:many-to-onename=classescolumn=classesidfetch=select/(1)fetch=“select”,另外发送一条select语句抓取当前对象关联实体或集合(2)设置fetch=join,如:many-to-onename=classescolumn=classesidfetch=join/fetch=join,hibernate会通过select语句使用外连接来加载其关联实体或集合此时lazy会失效11.抓取策略(2)2.hibernate抓取策略(集合代理的批量抓取)保持默认,同fetch=select,如:setname=studentsinverse=truecascade=allfetch=select(1)fetch=“select”,另外发送一条select语句抓取当前对象关联实体或集合(2)设置fetch=join,如:setname=studentsinverse=truecascade=allfetch=joinfetch=join,hibernate会通过select语句使用外连接来加载其关联实体或集合此时lazy会失效11.抓取策略(3)3.Hibernate抓取策略(集合代理的批量抓取)设置fetch=subselect,如:setname=studentsinverse=truecascade=allfetch=subselectfetch=subselect,另外发送一条select语句抓取在前面查询到的所有实体对象的关联集合11.抓取策略(4)hibernate抓取策略,batch-szie在class上的应用batch-size属性,可以批量加载实体类,如classname=Classestable=t_classesbatch-size=3hibernate抓取策略,batch-szie在集合上的应用batch-size属性,可以批量加载实体类,如setname=studentsinverse=truecascade=allbatch-size=5可减少sql产生、提交、执行的次数。12.Struts和Hibernate的整合策略struts+hibernate工程示例:hibernate_struts_training_itemmgr物料管理登录用户名、密码:admin/admin18

1 / 18
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功