Hibernate检索学习
Hibernate的检索策略:类级别的检索策略;1对多,多对多的检索策略;多对一,一对一的检索策略
1.类级别的检索策略,可以通过class元素的lazy属性来设置,该设置只对load方法有效果
2.1对多,多对多的检索策略(默认开启懒加载):通过set元素的三个属性来控制,查询1方带出n方:lazy定义多方集合初始化的时机;fetch定义查询多方时sql的形式(select/subselect),如果取值为join则定义多方集合初始化的时机,这个会覆盖lazy属性的值,即忽略lazy的设置;batch-size:检索发送sql语句的次数,提高效率
Lazy属性:通过设置lazy=false,将延长加载变为立即加载。一般不建议这么做,lazy除了可以设置true,false,还可以设置为extra(增强延迟加载),该值可以尽可能的 延迟集合初始化的时机。
当lazy设置为true(默认值,延迟加载),hibernate在以下情况初始化集合代理实例
1)程序第一次访问集合属性的iterator(),size(),isEmpty(),contains()等方法
2)通过Hibernate.initialize()静态方法显示初始化
· 当lazy设置为extra(增强延迟加载)时,Hibernate第一次访问集合的iterator()方法时会吃初始化集合代理实例,在调用集合的size(),isEmpty(),contains()方法 的时候并不会初始化集合代理实例,而是通过sql查询必要的信息
batch-size属性:通过设置batch-size通过改变发送的sql语句(加入in子句)从而来减少发送sql语句的次数:比如1方有4个,那么对于查询n方就要发送4条语句,如果设置了batch-size的值为2,那么查询的时候只会发送2条sql语句
fetch属性:该属性可以有select(默认),subselect,join三个值,当值 为select按照正常的方式来初始化set元素,如果设置为subselect,将通过子查询一次性初始化所有的set集合(而不是按照batch-size设置的那样),所以这个时候batch-size属性失效。具体的子查询的样子是将1方所有的oid查询出来的sql,作为查询n方in之后的语句即子查询从而一次性查询出所有的n方数据;如果设置为join,则决定set集合初始化的时机,即在加载1方对象的时候使用迫切左外连接(使用左外连接查询的时候同时把set集合初始化了)的方式检索n方的集合属性(这个时候就不是懒加载了),所以这个时候lazy属性失效。注意HQL查询的时候会忽略fetch=join 的取值
3.多对一,一对一的检索策略:通过设置many-to-one元素的相关属性来控制。查询n方法带出1方
Lazy属性:这里的lazy属性的取值和上面的不一样,为proxy(默认的表示使用延迟加载),和false(表示不适用延迟加载)。
fetch属性:设置为join时,同样会在查询n方式用迫切左外连接查询出1方集合的属性值(不再是延迟加载)这个时候同样会忽略lazy的设置
batch-size属性:这个时候该属性需要设置在1方的class属性上,才会起作用。比如利用hql查询出所有的n方数据,遍历n方集合查询出1方数据,如果查询1方数据需要3条语句,这个时候设置 batch-size=2,则只要发送2条sql语句即可。原理也是通过在添加in子句
HQL查询:
1.使用HQL查询的步骤为:
1)创建Query对象
2)设置参数,参数可以使基本类型,也可以是实体类型(调用setEntity()方法来设置),设置参数的方法有第一种按照位子来设置,第二种按照参数名(在hql中参数名前面加上“:”)来设置,Query对象支持连续的设置值,也就是说每次set完之后返回的还是Query对象
3)执行查询
2.HQL提供的分页查询是跨平台:setFirstResult(index) 设置起始位子,默认从0开始;setMaxResults(size)设置每一页显示的数据数量;
3.可以将hql语句通过配置元素Query放到配置文件中,为了防止大小写有歧义,需要<![CDATA[]]>用将hql包起来,然后调用方法session.getNamedQuery(string queryName)来获得,更加灵活的对hql语句做调整
4.hql 投影查询,其实就是查询某些字段而不是所有字段(需要加上select),这个时候正常返回的是这些字段组成的数组组成的list集合。为了操作方便可以在hql中new的方式将数组封装成对象,对应的需要在实体类中添加构造器
5.hql的报表查询其实就是在hql中可以使用分组聚合函数的语法
6.hql的连接表查询
1)左连接:left join:查询所有记录的时候,默认返回的是俩个表对应的对象组成的数组组成的list集合。如果加上select显示的查询对象(既可以是主表,也可以是另一个另一个连接表),返回的是主表对象组成的list,但是在访问该对象管理的对象的时候,每一次访问都会放sql语句,效率低下。所以查询的时候基本上都用迫切连接查询
2)迫切左外连接 left join fetch:即在查询的时候就初始化了关联对象的集合,不用每次查询都发送sql语句。返回的是主表对象的集合
3)hql中没有显示的指定检索策略,会使用配置文件中使用的检索策略。hql中要使用迫切连接只能加上fetch关键字,而不能通过在配置文件中配置fetch=join来实现,即使配置了,也会被忽略
7.hibernate的QBC查询步骤:
1)创建Criteria对象
2)添加拼接条件
3)执行查询
QBC查询提供了更加面向对象的方式来拼接查询的条件,比如and,or,min,order by等等
8.hibernate 的二级缓存
1)默认关闭二级缓存,开启二级缓存的步骤为:先配置好第三方的二级缓存实现比如 EHCache,现在cfg.xml中配置开启二级缓存,在针对需要放入二级缓存的类做针对性的配置,这种配置可以防止cfg中,也可以放在对应类的hbm.xml映射文件中
2)二级缓存是session共用的
3)二级缓存提供了四种并发访问策略,每一中对应数据库的四种隔离级别
4)类级别的二级缓存和集合级别的二级缓存都要针对性的配置才能起作用。如果要开启集合的二级缓存,一定要同时开启集合中对象的二级缓存,这样才能提高效率(因为只是缓存id,如果不对集合中的对象开启二级缓存,就会按照id一个一个的去数据库查,效率反而低了)
5)二级缓存默认对Query对象Criteria对象的查询不起作用(即使是同一个session创建的同一个Query对象/Criteria对象的俩次查询操作,也是要发送俩次sql语句的),如果要让这俩种查询也具有二级缓存的特性,需要另外的开启查询缓存(不仅要在配置文件中开启,还要在代码中开启),查询缓存依赖二级缓存
4)对缓存的配置体现在对应的配置文件中比如ecache.xml,配置文件中每个<cache>为一个 缓存区域,,通过对区域的命名(类的全限定名或者类的全限定名.结合属性)可以将不同对象放入不同的缓存区当中。如果没有配置,那么 所有的数据都放入默认的缓存区。除此之外还包括是否永久有效(设置为永久会忽略其他时间设置),空闲时间,存活时间(大于空闲时间)
管理sessioin相关
将session和本地线程绑定,hibernate以及提供了,需要配置以及通过SessionFactory的方法获得。而不用自己绑定的到ThreadLocal中;如果sessioin是由线程管理,那么在事务回滚或者提交的时候session就已经关闭了(这就意味着不用写很多繁杂的关闭session操作)。配置<property name="current_session_context_class" >thread</property>。 sessionFactory.getCurrentSession()
· 批量操作相关
1)session(需要定量的提交事务,因为怕持久化对象把内存搞爆)
2)hql
3)StatelessSession
3)jdbc api (推荐使用)
Hibernate检索学习的更多相关文章
- Hibernate入门6.Hibernate检索方式
Hibernate入门6.Hibernate检索方式 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv Hibernate的整体框架已经 ...
- j2ee开发之hibernate框架学习笔记
hibernate框架技术重点学习笔记 1.针对不同的数据库,有不同的数据库实现类,使其符号对应的数据库? mysqlDaoImpl oracleDaoImpl ... ... 2.对象和表记录的转换 ...
- Hibernate —— 检索策略
一.Hibernate 的检索策略本质上是为了优化 Hibernate 性能. 二.Hibernate 检索策略包括类级别的检索策略.和关联级别的检索策略(<set> 元素) 三.类级别的 ...
- 7.Hibernate 检索
1.Hibernate检索方式 检索方式简介: 导航对象图检索方式:根据已经加载的对象,导航到其他对象.OID检索方式:按照对象的OID来检索对象.Session 的 get() 和 load() 方 ...
- Hibernate进阶学习4
Hibernate进阶学习4 深入学习hibernate的查询语句 测试HQL查询 package com.hibernate.test; import com.hibernate.domain.Cu ...
- Hibernate进阶学习3
Hibernate进阶学习3 测试hibernate的多表关联操作(一对多,多对一,多对多) 表之间的关系主要在类与元数据配置文件中体现 package com.hibernate.domain; i ...
- Hibernate基础学习2
Hibernate基础学习2 测试hibernate的一级缓存,事务以及查询语句 1)Hibernate的一些相关概念 hibernate的一级缓存 1)缓存是为了提高该框架对数据库的查询速度 2)一 ...
- (转) Hibernate检索方式概述
http://blog.csdn.net/yerenyuan_pku/article/details/70554816 Hibernate检索方式概述 我们在对数据库的操作中,最常用的是select, ...
- [原创]java WEB学习笔记89:Hibernate学习之路-- -Hibernate检索方式(5种),HQL介绍,实现功能,实现步骤,
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
随机推荐
- DD-WRT自定义脚本更新花生壳DDNS
N年以前买了一个tp-link 841n v7,一直用的还算可以吧,除了不定期重启路由器,不然网速慢的龟爬啊!这也是TP原厂固件的通病,于是刷了DD-WRT,话说DD确实很爽,除了功能强大之外,而且很 ...
- 又一个改写MBR的病毒(TDSS TDL4)
此毒为TDSS TDL4 的又一个变种.RIS2011 目前尚未收录此毒.此毒的主要行为是改写MBR,并在硬盘尾部的190个扇区内写入病毒代码.病毒的上述动作可穿透还原类软件对系统的保护.我在Acro ...
- leetcode 最长有效括号
给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度. 示例 1: 输入: "(()" 输出: 2 解释: 最长有效括号子串为 "()&quo ...
- Luogu P1314 聪明的质监员 二分答案
题目链接 Solution 这个范围不是二分就是结论题就是数学题... 然后再看一会差不多就可以看出来有单调性所以就可以确定二分的解法了 二分那个$W$,用前缀和$O(n+m)$的时间来求出对答案的贡 ...
- UVa 11292 勇者斗恶龙
https://vjudge.net/problem/UVA-11292 题意:有n条任意个头的恶龙,你希望雇一些其实把它杀死.一个能力值为x的骑士可以砍掉恶龙一个直径不超过x的头,且需要支付x个金币 ...
- 获取CheckBox的值
前台获取 function chkCheckBox() { var code_arr = new Array(); //定义一数组 $('.C_B').each(function () { if ($ ...
- python 生成元组
#create a tuple l = [(,), (,), (,)] print(list(zip(*l)))
- python 操作浏览器打开指定网页
#! /usr/bin/env python # encoding=utf8 import webbrowser import time webbrowser.open("http://ww ...
- MVC 子对象数据传递
1.接受参数 public ActionResult Address(User user) { return View(); } 2. User对象类型 public class User { pub ...
- MongoDB(课时12 字段判断)
3.4.2.7 判断某个字段是否存在 使用“$exists”可以判断某个字段是否存在,如果设置为true表示存在,false表示不存在. 范例:查询具有parents成员的数据 db.students ...