检索策略和检索方式.ppt
《检索策略和检索方式.ppt》由会员分享,可在线阅读,更多相关《检索策略和检索方式.ppt(50页珍藏版)》请在三一办公上搜索。
1、检索策略,检索方式和二级缓存,Hibernate 检索策略,概述,当 Hibernate 从数据库中加载 Customer 对象时,如果同时加载所有关联的 Order 对象,而程序实际上仅仅需要访问 Customer 对象,那么这些关联的 Order 对象就白白浪费了许多内存.域对象关系数据库数据,类级别的检索策略,类级别可选的检索策略包括立即检索和延迟检索,默认为延迟检索立即检索:立即加载检索方法指定的对象延迟检索:延迟加载检索方法指定的对象类级别的检索策略可以通过 元素的 lazy 属性进行设置如果程序加载一个对象的目的是为了访问它的属性,可以采取立即检索.如果程序加载一个持久化对象的目的
2、是仅仅为了获得它的引用,可以采用延迟检索,类级别的检索策略,无论 元素的 lazy 属性是 true 还是 false,Session 的 get()方法及 Query 的 list()方法在类级别总是使用立即检索策略若 元素的 lazy 属性为 true 或取默认值,Session 的 load()方法不会执行查询数据表的 SELECT 语句,仅返回代理类对象的实例,该代理类实例有如下特征:由 Hibernate 在运行时采用 CGLIB 工具动态生成Hibernate 创建代理类实例时,仅初始化其 OID 属性在应用程序第一次访问代理类实例的非 OID 属性时,Hibernate 会初始化
3、代理类实例,一对多和多对多的检索策略,在映射文件中,用 元素来配置一对多关联及多对多关联关系.元素有 lazy 和 fetch 属性lazy:主要决定 orders 集合被初始化的时机.即到底是在加载 Customer 对象时就被初始化,还是在程序访问 orders 集合时被初始化fetch:取值为“select”或“subselect”时,决定初始化 orders 的查询语句的形式;若取值为”join”,则决定 orders 集合被初始化的时机若把 fetch 设置为“join”,lazy 属性将被忽略,元素的 lazy 和 fetch 属性,延迟检索和增强延迟检索,在延迟检索(lazy 属
4、性值为 true)集合属性时,Hibernate 在以下情况下初始化集合代理类实例 应用程序第一次访问集合属性:iterator(),size(),isEmpty(),contains()等方法通过 Hibernate.initialize()静态方法显式初始化增强延迟检索(lazy 属性为 extra):与 lazy=“true”类似.主要区别是增强延迟检索策略能进一步延迟 Customer 对象的 orders 集合代理实例的初始化时机:当程序第一次访问 orders 属性的 iterator()方法时,会导致 orders 集合代理类实例的初始化当程序第一次访问 order 属性的 si
5、ze(),contains()和 isEmpty()方法时,Hibernate 不会初始化 orders 集合类的实例,仅通过特定的 select 语句查询必要的信息,不会检索所有的 Order 对象,元素的 batch-size 属性,元素有一个 batch-size 属性,用来为延迟检索策略或立即检索策略设定批量检索的数量.批量检索能减少 SELECT 语句的数目,提高延迟检索或立即检索的运行性能.,用带子查询的 select 语句整批量初始化 orders 集合(fetch 属性为“subselect”),元素的 fetch 属性:取值为“select”或“subselect”时,决定初
6、始化 orders 的查询语句的形式;若取值为”join”,则决定 orders 集合被初始化的时机.默认值为 select 当 fetch 属性为“subselect”时假定 Session 缓存中有 n 个 orders 集合代理类实例没有被初始化,Hibernate 能够通过带子查询的 select 语句,来批量初始化 n 个 orders 集合代理类实例batch-size 属性将被忽略子查询中的 select 语句为最初查询 CUSTOMERS 表的 SELECT 语句,迫切左外连接检索(fetch 属性值设为“join”),元素的 fetch 属性:取值为“select”或“sub
7、select”时,决定初始化 orders 的查询语句的形式;若取值为”join”,则决定 orders 集合被初始化的时机.默认值为 select 当 fetch 属性为“join”时:检索 Customer 对象时,会采用迫切左外连接(通过做外连接加载与检索指定的对象关联的对象)策略来检索所有关联的 Order 对象lazy 属性将被忽略Query 的list()方法会忽略映射文件中配置的迫切左外连接检索策略,而依旧采用延迟加载策略,多对一和一对一关联的检索策略,和 一样,元素也有一个 lazy 属性和 fetch 属性.若 fetch 属性设为 join,那么 lazy 属性被忽略迫切左
8、外连接检索策略的优点在于比立即检索策略使用的 SELECT 语句更少.无代理延迟检索需要增强持久化类的字节码才能实现,多对一和一对一关联的检索策略,Query 的 list 方法会忽略映射文件配置的迫切左外连接检索策略,而采用延迟检索策略如果在关联级别使用了延迟加载或立即加载检索策略,可以设定批量检索的大小,以帮助提高延迟检索或立即检索的运行性能.Hibernate 允许在应用程序中覆盖映射文件中设定的检索策略.,检索策略小结,类级别和关联级别可选的检索策略及默认的检索策略,3 种检索策略的运行机制,检索策略小结,映射文件中用于设定检索策略的几个属性,检索策略小结,比较 Hibernate 的
9、三种检索策略,Hibernate 检索方式,概述,Hibernate 提供了以下几种检索对象的方式导航对象图检索方式:根据已经加载的对象导航到其他对象OID 检索方式:按照对象的 OID 来检索对象HQL 检索方式:使用面向对象的 HQL 查询语言QBC 检索方式:使用 QBC(Query By Criteria)API 来检索对象.这种 API 封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口.本地 SQL 检索方式:使用本地数据库的 SQL 查询语句,HQL 检索方式,HQL(Hibernate Query Language)是面向对象的查询语言,它和 SQL 查询语言有些相似
10、.在 Hibernate 提供的各种检索方式中,HQL 是使用最广的一种检索方式.它有如下功能:在查询语句中设定各种查询条件支持投影查询,即仅检索出对象的部分属性支持分页查询支持连接查询支持分组查询,允许使用 HAVING 和 GROUP BY 关键字提供内置聚集函数,如 sum(),min()和 max()能够调用 用户定义的 SQL 函数或标准的 SQL 函数支持子查询支持动态绑定参数,HQL 检索方式,HQL 检索方式包括以下步骤:通过 Session 的 createQuery()方法创建一个 Query 对象,它包括一个 HQL 查询语句.HQL 查询语句中可以包含命名参数动态绑定参
11、数调用 Query 的 list()方法执行查询语句.该方法返回 java.util.List 类型的查询结果,在 List 集合中存放了符合查询条件的持久化对象.Qurey 接口支持方法链编程风格,它的 setXxx()方法返回自身实例,而不是 void 类型HQL vs SQL:HQL 查询语句是面向对象的,Hibernate 负责解析 HQL 查询语句,然后根据对象-关系映射文件中的映射信息,把 HQL 查询语句翻译成相应的 SQL 语句.HQL 查询语句中的主体是域模型中的类及类的属性SQL 查询语句是与关系数据库绑定在一起的.SQL 查询语句中的主体是数据库表及表的字段.,HQL 检
12、索方式,绑定参数:Hibernate 的参数绑定机制依赖于 JDBC API 中的 PreparedStatement 的预定义 SQL 语句功能.HQL 的参数绑定由两种形式:按参数名字绑定:在 HQL 查询语句中定义命名参数,命名参数以“:”开头.按参数位置绑定:在 HQL 查询语句中用“?”来定义参数位置相关方法:setEntity():把参数与一个持久化类绑定setParameter():绑定任意类型的参数.该方法的第三个参数显式指定 Hibernate 映射类型HQL 采用 ORDER BY 关键字对查询结果排序,HQL 检索方式,分页查询:setFirstResult(int fi
13、rstResult):设定从哪一个对象开始检索,参数 firstResult 表示这个对象在查询结果中的索引位置,索引位置的起始值为 0.默认情况下,Query 从查询结果中的第一个对象开始检索setMaxResults(int maxResults):设定一次最多检索出的对象的数目.在默认情况下,Query 和 Criteria 接口检索出查询结果中所有的对象,HQL 检索方式,可滚动的结果集:Query 接口的 scroll()方法返回一个 org.hibernate.ScrollableResults 对象,它就代表可滚动的结果集在访问 ScrollableResults 结果集结束后,
14、应该即时调用 ScrollableResults 的 close()关闭结果集,从而关闭数据库中于此结果对应的游标在映射文件中定义命名查询语句Hibernate 允许在映射文件中定义字符串形式的查询语句.元素用于定义一个 HQL 查询语句,它和 元素并列.在程序中通过 Session 的 getNameQuery()方法获取查询语句对应的 Query 对象.,HQL(迫切)左外连接,迫切左外连接:LEFT JOIN FETCH 关键字表示迫切左外连接检索策略.list()方法返回的集合中存放 Customer 对象的引用,每个 Customer 对象的 orders 集合都被初始化,存放所有关
15、联的 Order 对象.查询结果中可能会包含重复元素,可以通过一个 HashSet 来过滤重复元素左外连接:LEFT JOIN 关键字表示左外连接查询.将根据配置文件来决定 orders 集合的检索策略.即使在映射文件中设置了延迟检索策略,在运行 list()方法时,Hibernate 执行的 SQL 语句依然与迫切左外连接生成的查询语句相同list()方法返回的集合中存放的是对象数组类型如果希望 list()方法返回的集合中仅包含 Customer 对象,可以在HQL 查询语句中使用 SELECT 关键字,HQL 迫切左外连接,迫切左外连接 Query 的 list()方法返回结果,resu
16、lt,Customer 类型引用,Customer 类型引用,Customer 类型引用,Customer 类型引用,Customer 对象(OID=1),Customer 对象(OID=2),Oders 集合(被初始化),Oder 对象(OID=1),Oder 对象(OID=2),Oder 对象(OID=3),HQL 左外连接,左外连接 Query 的 list()方法返回结果,result,Object,Customer 对象(OID=1),Customer 对象(OID=2),Oders 集合(没有被初始化),Oder 对象(OID=1),Oder 对象(OID=2),Oder 对象(O
17、ID=3),Object,Object,Object,null,HQL 内连接,内连接:INNER JOIN 关键字表示内连接,也可以省略 INNER 关键字list()方法的集合中存放的每个元素对应查询结果的一条记录,每个元素都是对象数组类型如果希望 list()方法的返回的集合仅包含 Customer 对象,可以在 HQL 查询语句中使用 SELECT 关键字,result,Object,Customer 对象(OID=1),Oders 集合(没有被初始化),Oder 对象(OID=1),Oder 对象(OID=2),Oder 对象(OID=3),Object,Object,HQL 迫切内
18、连接,迫切内连接:INNER JOIN FETCH 关键字表示迫切内连接,也可以省略 INNER 关键字list()方法返回的集合中存放 Customer 对象的引用,每个 Customer 对象的 orders 集合都被初始化,存放所有关联的 Order 对象,result,Customer 类型引用,Customer 类型引用,Customer 类型引用,Customer 对象(OID=1),Oders 集合(被初始化),Oder 对象(OID=1),Oder 对象(OID=2),Oder 对象(OID=3),关联级别运行时的检索策略,如果在 HQL 中没有显式指定检索策略,将使用映射文件
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 检索 策略 方式

链接地址:https://www.31ppt.com/p-5991759.html