SSH——Hibernate初学者之旅(一)

来源:互联网 发布:windows数字签名 编辑:程序博客网 时间:2024/05/29 19:46

一、是什么

1、概念

      Hibernate,翻译过来是冬眠的意思,冬眠其实就是维持一种平衡稳定的状态,也就是持久化。
      持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。
      持久化是将程序数据在持久状态和瞬时状态间转换的机制。

2、理解

      Hibernate是一个对象关系映射(ORM)框架,它对JDBC进行了非常轻量级的对象封装,使得可以使用对象编程思维
来操纵数据库。
      ORM,即Object-Relational Mapping,它的作用就是在关系型数据库和对象之间做了一个映射。从对象(Object)映射到关系(Relation),再从关系映射到对象。这样,我们在操作数据库的时候,不需要再去和复杂SQL打交道,只要像操作对象一样操作它就可以了(把关系数据库的字段在内存中映射成对象的属性)。详见:EntityFramework——Map之初露锋芒(一)

二、有何用

1、作用

      Hibernate主要用来实现Java对象和表之间的映射,除此之外还提供还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间。
      Hibernate的目标是对于开发者通常的数据持久化相关的编程任务,解放其中的95%。
      对于以数据为中心的程序来说,它们往往只在数据库中使用存储过程来实现商业逻辑,Hibernate可能不是最好的解决方案;对于那些在基于Java的中间层应用中,它们实现面向对象的业务模型和商业逻辑的应用,Hibernate是最有用的。
      Hibernate可以帮助你消除或者包装那些针对特定厂商的SQL代码,并且帮你把结果集从表格式的表示形式转换到一系列的对象去。

2、核心

这里写图片描述
自上而下的调用

<code class="hljs vhdl has-numbering"><span class="hljs-keyword">Configuration</span>接口</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>

      负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象。

<code class="hljs  has-numbering">SessionFactroy接口</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>

      负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。
它是线程安全的,这意味着它的同一个实例可以被应用的多个线程共享。
它是重量级的,这意味着不能随意创建或销毁它的实例。如果应用只访问一个数据库,只需要创建一个SessionFactory实例

<code class="hljs  has-numbering">Session接口</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>

      负责执行被持久化对象的CRUD操作(CRUD:增读更删)。但需要注意的是Session对象是非线程安全的。因此在设计软件架构的时候,应该避免多个线程共享一个Session实例。同时,Hibernate的session不同于JSP应用中的HttpSession。

<code class="hljs  has-numbering">Query和Criteria接口</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>

      Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式。

<code class="hljs  has-numbering">Transaction接口</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>

      是Hibernate的数据库的数据库事务接口,它对底层的事务接口做了封装。底层事务接口包括:
1.jdbc API
2.JTA(JAVA Transation API)
3.CORBA(Common Object Request Broker Architecture) API
注意: Configuration实例是一个启动期间的对象,一旦SessionFactory创建完成它就被丢弃了。

三、怎么用

1、对应规则

<code class="hljs  has-numbering">类跟表相对应</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>
<code class="hljs  has-numbering">类的属性跟表的字段相对应</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>
<code class="hljs  has-numbering">类的实例与表中具体的一条记录相对应</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>
<code class="hljs  has-numbering">一个类可以对应多个表,一个表也可以对应对个类</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>
<code class="hljs javascript has-numbering">DB中的表可以没有主键,但是<span class="hljs-built_in">Object</span>中必须设置主键字段</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>
<code class="hljs javascript has-numbering">DB中表与表之间的关系(如:外键)映射成为<span class="hljs-built_in">Object</span>之间的关系 </code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>
<code class="hljs javascript has-numbering"><span class="hljs-built_in">Object</span>中属性的个数和名称可以和表中定义的字段个数和名称不一样</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>

这里写图片描述

2、实现方式

<code class="hljs  has-numbering">之前我们通过jdbc+sql,connection的管理,来跟数据库联系</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>

这里写图片描述

<code class="hljs  has-numbering">现在通过封装好的Hibernate实现</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>

这里写图片描述

四、优缺点

1、优点

      (1)更加对象化
      以对象化的思维操作数据库,我们只需要操作对象就可以了,开发更加对象化。
      (2)移植性
       因为Hibernate做了持久层的封装,你就不知道数据库,如果换个数据库只要在配置文件中变换配置就可以了,你写的所有的代码都具有可复用性。
      (3)Hibernate是一个没有侵入性的框架,没有侵入性的框架我们称为轻量级框架。
      对比Struts的Action和ActionForm,都需要继承,离不开Struts。Hibernate不需要继承任何类,不需要实现任何接口。这样的对象叫POJO对象。
      (4)Hibernate代码测试方便。
      (5)提高效率,提高生产力。

2、缺点

      (1)使用数据库特性的语句,将很难调优
      (2)对大批量数据更新存在问题
      (3)系统中存在大量的攻击查询功能
      (4)复杂表的查询和多表关联查询,效率不高

总结:

      我们通过介绍什么是Hibernate,知道了它就是JPA的一种实现,而且我们知道Hibernate是没有侵入性的轻量级框架。通过此次学习,我们对Hibernate有了一个大概的认识,便于我们以后的学习和使用

0 0