黑马程序员三大框架11天笔记全之hibernateday07笔记_第1页
黑马程序员三大框架11天笔记全之hibernateday07笔记_第2页
黑马程序员三大框架11天笔记全之hibernateday07笔记_第3页
黑马程序员三大框架11天笔记全之hibernateday07笔记_第4页
黑马程序员三大框架11天笔记全之hibernateday07笔记_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、黑马程序员:三大框架hibernate-day07笔记第1章 Hibernate注解开发在hibernate中我们使用注解,可以帮助我们简化hbm文件配置。1.1 PO类注解配置Entity 声明一个实体Table来描述类与表对应Id来声明一个主键GenerateValue 用它来声明一个主键生成策略默认情况下相当于native可以选择的主键生成策略 AUTO IDENTITY SEQUENCEColumn来定义列注意:对于PO类中所有属性,如果你不写注解,默认情况下也会在表中生成对应的列。列的名称就是属性的名称Temporal来声明日期类型可以选择TemporalType.DATA 只有年月

2、日 TemporalType.TIME 只有小时分钟秒TemporalType.TIMESTAMP 有年月日小时分钟秒我们最终需要在hibernate.cfg.xml文件中将我们类中的注解配置引用生效问题:1.如果我们主键生成策略想使用UUID类型?问题2:如果设定类的属性不在表中映射?对于我们以上讲解的关于属性配置的注解,我们也可以在其对应的getXxx方法去使用1.2 一对多(多对一)OneToManyManyToOne以Customer与Order为例Customer类Order类示例:保存客户时,保存订单对于这个示例我们需要在Customer中配置cascade操作,save-upda

3、te第一种方式,可以使用JPA提供的注解第二种方式:可以使用hibernate提供的注解以下是示例代码执行后的结果订单中没有关联客户的id,为什么?原因:我们在Customer中配置了mappedBy=”c”它代表的是外键的维护由Order方来维护,而Customer不维护,这时你在保存客户时,级联保存订单,是可以的,但是不能维护外键,所以,我们必须在代码中添加订单与客户关系。扩展:关于hibernate注解Cascade中的DELETE_ORPHAN过时s使用下面方案来替换过时方案第2章 Hibernate关联映射-多对多我们使用注解完成多对多配置.描述学生与老师.使用ManyToMany来

4、配置多对多,只需要在一端配置中间表,另一端使用mappedBy表示放置外键维护权。2.1 创建PO类Teacher类中Student类中2.2 级联保存操作测试因为我们将外键的维护权利由Student来维护,我们演示保存学生时,将都也级联保存。我们在Student类中配置了级联2.3 级联删除操作测试第3章 Hibernate关联映射-一对一以人与身份证号为例一对一操作有两种映射方式:1. 在任意一方添加外键2. 主键映射3.1 外键映射创建实体User类上述配置,t_user表放弃对外键的维护权利IDCard类joinColumn指定外键列名称,当前配置外键是在t_idcard表中测试代码3

5、.2 主键映射(了解)以Husband与Wife为例Wife的主键生成策略是identityPrimaryKeyJoinColumn 说明husband与wife是使用主键映射Husband的主键我们设置成参考wife的主键方式测试操作 第4章 Hibernate检索方式概述对数据库操作中,最常用的是select.使用hibernate如何select操作。分为五种:1导航对象图检索方式,根据已加载的对象导航到其它对象2.OID检索方式,按照对象的OID来检索对象3.HQL检索方式,使用面向对象的HQL查询语言4.QBC检索方式,使用QBC(Query by Criteria)API来检索对象

6、,这种API封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口5.本地SQL检索方式,使用本地数据库的SQL查询语句4.1 导航对象图检索方式Customer c=session.get(Customer.class,2);c.getOrders().size()通过在hibernate中进行映射关系,在hibernate操作时,可以通过导航方式得到其关联的持久化对象信息。4.2 OID检索方式Session.get(Customer.class,3);Session.load(Order.class,1);Hibernate中通过get/load方法查询指定的对象,要通过OID来查

7、询。4.3 HQLHQL是我们在hibernate中是常用的一种检索方式。HQL(Hibernate Query Language)提供更加丰富灵活、更为强大的查询能力因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语 句的查询方式,同时也提供了更加面向对象的封装。完整的HQL语句形式如下: Select/update/delete from where group by having order by asc/desc 其中的update/delete为Hibernate3中所新添加的功能,可见HQ

8、L查询非常类似于标准SQL查询。基本步骤:1. 得到Session2. 编写HQL语句3. 通过session.createQuery(hql)创建一个Query对象4. 为Query对象设置条件参数5. 执行list查询所有,它反胃的是List集合 uniqueResut()返回一个查询结果。4.3.1 数据准备4.3.2 基本检索From 类名;4.3.3 排序检索4.3.4 条件检索4.3.5 分页检索4.3.6 分组统计检索分组 group by统计 count max min avg sum4.3.7 投影检索我们主要讲解是关于部分属性查询,可以使用投影将部分属性封装到对象中。注意:

9、我们必须在PO类中提供对应属性的构造方法,也要有无参数构造。4.3.8 命名检索我们可以将hql语句先定义出来,在使用时通过session.getNamedQuery(hqlName);得到一个Query,在执行.问题:hql定义在什么位置?1.如果你有hbm配置文件,那么当前的hql操作是对哪一个实体进行操作,就在哪一个实体的配置文件中声明。2.如果是使用注解来描述PO的配置我们直接在PO类中使用如何使用?4.4 QBC QBC(query by criteria),它是一种更加面向对象的检索方式。QBC步骤:1.通过Session得到一个Criteria对象 session.createC

10、riteria()2.设定条件 Criterion实例 它的获取可以通过Restrictions类提供静态。Criteria的add方法用于添加查询条件3. 调用list进行查询 criterfia.list.4.4.1 基本检索4.4.2 排序检索注意在criteri.addOrder()方法的参数使用的Order是hibernate中的对象4.4.3 条件检索4.4.4 分页检索4.4.5 统计分组检索Count sum avg max min4.4.6 离线条件检索4.5 本地SQL本地sql也支持命名查询。可以将sql语句定义在hbm文件中,也可以使用注解。本地命名sql注解定义如果执

11、行这个命名的sql会产生异常出现问题的原因:是hibernate不知道执行select * from t_customer后如果将结果封装。4.6 多表操作4.6.1 SQL多表操作4.6.1.1 1.交叉连接 CROSS JOIN 会产生迪卡尔积SELECT * FROM t_customer CROSS JOIN t_order;4.6.1.2 2.内连接 INNER JOIN ON SELECT * FROM t_customer AS c INNER JOIN t_order AS o ON c.id=o.c_customer_id; 使用内连接它只能将有关联的数据得到。隐式内连接 使

12、用 逗号将表分开,使用WHERE来消除迪卡尔积SELECT * FROM t_customer AS c ,t_order o WHERE c.id=o.c_customer_id;4.6.1.3 3.外连接 左外LEFT OUTER JOIN 右外RIGHT OUTER JOIN OUTER可以省略SELECT * FROM t_customer c LEFT OUTER JOIN t_order o ON c.id=o.c_customer_id;4.6.2 HQL多表操作Hql多表操作分类:1. 交叉连接2. 内连接a) 显示内连接b) 隐式内连接c) 迫切内连接3. 外连接左外连接迫切

13、左外连接右外连接注意:在hibernate中有迫切连接的概念,而sql中没有。4.6.2.1 内连接显示内连接显示内连接使用的是inner join with隐式内连接隐式内连接也我们在sql中操作不一样,它是通过”.”运算符来关联迫切内连接迫切内连接得到的结果是直接封装到PO类中,而内连接得到的是Object数组,数组中封装的是PO类对象。4.6.2.2 外连接第5章 Hibernate事务管理5.1 事务介绍问题:什么是事务?事务就是逻辑上的一组操作,组成这组操作的各个单元要么全部成功,要么全都失败。问题:事务四个特性?原子性:不可分割一致性:事务在执行前后,要保证数据的一致。隔离性:一个

14、事务在执行的过程中,不应该受到其它事务的干扰。持久性:事务一旦结束,数据持久化到数据库。问题:不考虑事务的隔离性,会产生什么问题?脏读:一个事务读取到另一个事务的未提交数据不可重复读:一个事务读取到另一个事务提交的数据(主要是指update),会导致两次读取的结果不一致。虚读(幻读): 一个事务读取到另一个事务提交的数据(主要是指insert),会导致两次读取结果不一致.问题:对于上述问题如何解决?我们可以通过设置隔离级别来解决.READ_UNCOMMITED 读取未提交,它引发所有的隔离问题READ_COMMITTED 读已提交,阻止脏读,可能发生不可重复读与虚读.REPEATABLE_RE

15、AD 重复读 阻止脏读,不可重复读 可能发生虚读SERIALIZABLE 串行化 解决所有问题 不允许两个事务,同时操作一个目标数据。(效率低下)ORACLE 默认的是事务隔离级别 READ_COMMITTEDMYSQL 默认的事务隔离级别 REPEATABLE_READ5.2 Hibernate中设置事务隔离级别hibernate.connection.isolation 它可取的值有 1 2 4 81代表的事务隔离级别为READ UNCOMMITTED2代表的事务隔离级别为READ COMMITTED4.代表的事务隔离级别为 REPEATABLE READ8代表的事务隔离级别为 SERIA

16、LIZABLE在hibernate.cfg.xml文件中配置5.3 Hibernate中session管理 Hibernate提供了三种管理session的方式:1. Session对象的生命周期与本地线程绑定(ThreadLocal)2. Session对象的生命周期与JTA事务绑定(分布式事务管理)3. Hibernate委托程序来管理Session的生命周期我们之前所使用的是第三种 ,通过程序获取一个Session对象,使用它,最后session.close();在实际开发中我们一般使用的是前两种:主要介绍关于本地线程绑定Session。步骤:1. 需要在hibernate.cfg.xm

17、l文件配置2. 在获取session时不要在使用openSession而是使用getCurrentSession()方法。关于getCurrentSession使用时的注意事项:上述代码执行后,会产生问题原因:使用getCurrentSession获取的与线程绑定的session对象,在事务关闭时,session对象也会close,简单说,就不需要我们在手动close;第6章 Hibernate优化方案6.1 HQL优化6.1.1 1.使用参数绑定1.使用绑定参数的原因是让数据库一次解析SQL,对后续的重复请求可以使用用生成好的执行计划,这样做节省CPU时间和内存。2.避免SQL注入6.1.2

18、 2.尽量少使用NOT 如果where子句中包含not关键字,那么执行时该字段的索引失效。6.1.3 3.尽量使用where来替换havingHaving在检索出所有记录后才对结果集进行过滤,这个处理需要一定的开销,而where子句限制记录的数目,能减少这方面的开销6.1.4 4.减少对表的查询在含有子查询的HQL中,尽量减少对表的查询,降低开销6.1.5 5.使用表的别名当在HQL语句中连接多个表时,使用别名,提高程序阅读性,并把别名前缀与每个列上,这样一来,可以减少解析时间并减少列歧义引起的语法错误。6.1.6 6.实体的更新与删除在hibernate3以后支持hql的update与del

19、ete操作6.2 一级缓存优化一级缓存也叫做session缓存,在一个hibernate session有效,这级缓存的可干预性不强,大多于hibernate自动管理,但它提供清除缓存的方法,这在大批量增加(更新)操作是有效果的,例如,同时增加十万条记录,按常规进行,很可能会出现异常,这时可能需要手动清除一级缓存,session.evict以及session.clear.6.3 检索策略(抓取策略)6.3.1 延迟加载延迟加载 是hibernate为提高程序执行的效率而提供的一种机制,即只有真正使用该对象的数据时才会创建。load方法采用的策略延迟加载.get方法采用的策略立即加载。检索策略分

20、为两种:1. 类级别检索2. 关联级别检索6.3.2 类级别检索类级别检索是通过session直接检索某一类对应的数据,例如Customer c=session.load(Customer.class,1)Session.createQuery(“from Order”)类级别检索策略分为立即检索与延迟检索,默认是延迟检索,类级别的检索策略可以通过元素的lazy属性来设置 ,默认值是true在hbm配置文件中设置 在类中使用注解如果将lazy设置为false,代表类级别检索也使用立即检索。这时load与get就一样,都是立即检索。如果对一个延迟代理对象进行初始化?6.3.3 关联级别检索查询到

21、某个对象,获得其关联的对象或属性,这种称为关联级别检索,例如c.getOrders().size()c.getName()对于关联级别检索我们就要研究其检索策略(抓取策略)6.3.4 检索策略(抓取策略)6.3.4.1 抓取策略介绍 指的是查找到某个对象后,通过这个对象去查询关联对象的信息时的一种策略。一对一 一对多(多对一) 下有 多对多 下有我们主要是在与或上设置fetch lazy例如:查询一个客户,要关联查询它的订单客户是一的一方,在客户中有set集合来描述其订单,在配置中我们是使用.可以在set标签上设置两个属性 fetch lazyFetch主要描述的是SQL语句的格式(例如是多条

22、,子查询,多表联查Lazy 控制SQL语句何时发送例如:在查询一个订单时,要查询客户信息 或也可以设置fetch lazyFetch主要描述的是SQL语句的格式(例如是多条,子查询,多表联查Lazy 控制SQL语句何时发送总结:讲解抓取策略在两方面设置6.3.4.2 注解配置抓取策略问题:如何使用注解来设置在设置的fetch与lazy可以使用下面注解来描述在或上如何设置 fetch与lazy6.3.4.3 set上的fetch与lazyset上的fetch与lazy它主要是用于设置关联的集合信息的抓取策略。Fetch可取值有:1. SELECT 多条简单的sql (默认值)2. JOIN 采用

23、迫切左外连接3. SUBSELECT 将生成子查询的SQLlazy可取值有:1. TURE 延迟检索 (默认值)2. FALSE 立即检索3. EXTRA 加强延迟检索(及其懒惰)第一种组合 会首先查询客户信息,当需要订单信息时,才会关联查询订单信息。第二种组合s当查询客户信息时,就会将订单信息也查询,也就是说订单信息没有进行延迟。第三种组合当查询客户信息时,不会查询订单信息,当需要订单的个数时,也不会查询订单信息,只会通过count来统计订单个数。当我们使用size(),contains()或isEmpty()方法时不会查询订单信息。第四种组合如果fetch选择的是join方案,那么lazy它会失效。生成SQl将采用的是迫切左外连接(left outer join fetch)会立即查询。第五种组合会生成子查询,但是我们在查询订单时采用的是延迟加载。第六种组合会生成子查询,在查询客户信息时,就会将订单信息也查询出来第七种组合在查询订单时,只会根据情况来确定是否要订单信息,如果不需要,例如我们程序中size操作,那么就会发出select count(*) from Order where c_customer_id=?6.3.4.4 One的一言fetch与lazy它主要是设置在获取到一的一方时,如果去查询多的一方。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论