SSH框架---Hibernate

来源:互联网 发布:月下的妖樱阿波罗数据 编辑:程序博客网 时间:2024/05/16 06:04

Hibernate是什么;

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库Hibernate大体上分为三个部分:一是关于xml部分的配置,二是Hibernate相关的api,最后一个是具体的增删改查操作。

hibernate的工作流程

1,配置环境,加载hibernate的jar文件,以及连接数据库连接使用的jar文件,并配置CLASSPATH环境变量。

2,写hibernate所需的配置文件,hibernate.cfg.xml ,XXX.hbm.xml

3,写POJO类

4.为实体类写映射文件“User.hbm.xml”,在“hibernate.cfg.xml”添加映射实体

5. HQL语句

  Query q = s.createQuery("from Account where actNo=:actNo");

  //from 类名 where 属性名=:shuxingming

  q.setLong("actNo",12345);//设置属性名,并赋值

  q.uniqueResult()//获得匹配HQL的唯一属性

6,调用hibernate API

1)使用Configuration对象的buildSessionFactory()方法创建SessionFactory对象

2)使用SessionFactory对象openSession()方法创建Session对象。

  3)使用Session的相应方法来操作数据库,将对象信息持久化到数据库同时开启事物并提交

4)关闭资源

1. Hibernate优点
(1) 对象/关系数据库映射(ORM)
它使用时只需要操纵对象,使开发更对象化,抛弃了数据库中心的思想,完全的面向对象思想
(2) 透明持久化(persistent)
带有持久化状态的、具有业务功能的单线程对象,此对象生存期很短。这些对象可能是普通的JavaBeans/POJO,这个对象没有实现第三方框架或者接口,唯一特殊的是他们正与(仅仅一个)Session相关联。一旦这个Session被关闭,这些对象就会脱离持久化状态,这样就可被应用程序的任何层自由使用。(例如,用作跟表示层打交道的数据传输对象。)           
(3) 事务Transaction(org.hibernate.Transaction)
 应用程序用来指定原子操作单元范围的对象,它是单线程的,生命周期很短。它通过抽象将应用从底层具体的JDBCJTA以及CORBA事务隔离开。某些情况下,一个Session之内可能包含多个Transaction对象。尽管是否使用该对象是可选的,但无论是使用底层的API还是使用Transaction对象,事务边界的开启与关闭是必不可少的。 
(4) 它没有侵入性,即所谓的轻量级框架
(5) 移植性会很好
(6) 缓存机制,提供一级缓存和二级缓存
(7) 简洁的HQL编程
 
2. Hibernate缺点
(1)  Hibernate在批量数据处理时有弱势
(2) 针对单一对象简单的增删查改,适合于Hibernate,而对于批量的修改,删除,不适合用Hibernate,这也是OR框架的弱点;要使用数据库的特定优化机制的时候,不适合用Hibernate 

4.Hibernate底层(有些东西自己拓展)

   A)一级缓存:

一级缓存是hibernate自带的,不受用户干预,其生命周期和session的生命周期一致,当前session一旦关闭,一级缓存就会消失,因此,一级缓存也叫session缓存或者事务级缓存,一级缓存只存储实体对象,不会缓存一般的对象属性,即:当获得对象后,就将该对象缓存起来,如果在同一个session中再去获取这个对象时,它会先判断缓存中有没有这个对象的ID,如果有,就直接从缓存中取出,否则,则去访问数据库,取了以后同时会将这个对象缓存起来

      B)二级缓存:

二级缓存也称为进程缓存或者sessionFactory级的缓存,它可以被所有的session共享,二级缓存的生命周期和sessionFactory的生命周期一致,二级缓存也是只存储实体对象。

二级缓存的一般过程如下:

①:条件查询的时候,获取查询到的实体对象

②:把获得到的所有数据对象根据ID放到二级缓存中

③:当Hibernate根据ID访问数据对象时,首先从sesison的一级缓存中查,查不到的时候如果配置了二级缓存,会从二级缓存中查找,如果还查不到,再查询数据库,把结果按照ID放入到缓存中

④:进行delete、update、add操作时会同时更新缓存

      C)查询缓存(数据量太多自行了解)

6.查询链表方式(自行查阅资料如何使用)

A)一对一

B)一对多

C)多对多

7.Hibernate中GET和LOAD区别(总结,更深入的层次自行了解)

get方法首先查询session缓存,没有的话直接发送sql查询数据库,一定要获取到真实的数据,否则返回null,并不适用二级缓存;反而load方法创建时首先查询session缓存,没有就创建代理,实际使用数据时才查询二级缓存和数据库,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,就抛异常

8.如何优化HIBERNATE

1)使用双向一对多关联,不适用单向一对多

2)灵活使用单向一对多关联

3)不用一对多,使用多对一替代

4)配置对象缓存,不使用集合缓存

5)一对多集合使用BAG,多对多使用SET

6)继承使用显示多态

7)表字段要少,表关联不要怕多,又二级缓存撑