一、什么是 Hibernate?
Hibernate 是一個基於元數據的輕量級的 ORM 框架:
1、元數據(Meta Data):data about data(數據的數據),也就是說描述一個對象數據,相當於這個對象的上下文環境。
2、輕量級:占用資源少,沒有侵入性。(其實我認為這只是相對而言,如果和 Ibatis 相比,它到成重量級的了)。
3、ORM:(Object Relation Mapping)對象關系數據庫的映射這是 Hibernate 框架的重點,也就是說將我們程序中的實體(bean,這里也叫 POJO)和數據庫中的表進行映射。java 類型和 sql類型映射,面向對象設計和關系型數據庫設計的映射,從而我們只需要將更多的精力放到業務中,而不是 sql 數據庫方面。
4、POJO:(Plain Ordinary Java Object),無格式的普通 java 對象,也就是上邊說的實體,和數據庫做映射的簡單類。只是在這里提出了一個新的名詞而已。
總而言之,Hibernate 就是將我們的數據庫表和程序的 POJO 類進行映射,數據的操作進行了封裝,使我們不用把數據庫弄得非常精通,我們會面向對象編程就可以了,這樣大大提高了我們的編程效率,而且對個人的知識要求也降低了。
二、Hibernate 基礎 ----- 數據庫操作
在 Hibernate 出現之前,對數據庫操作是基於 JDBC,這中間經歷了操作 JDBC、封裝 JDBC、ORM 三個階段。
1、操作 JDBC 階段:
本階段即在調用 JDBC 連接數據庫的包時,需要自己進行編寫的進行數據庫用戶登錄驗證的那段代碼。在這段代碼中可以執行 SQL 語句進行數據查詢、插入、刪除等。
2、封裝 JDBC 階段:
由於僅僅只是操作 JDBC,使得在實現不同邏輯功能時,都要重新編寫進行數據庫用戶登陸驗證的那段代碼,使得代碼重復很嚴重。為此,引入了 JavaBean的技術,書寫一個 DBAccess.java 類進行數據庫用戶登陸驗證和數據庫操作,並把其中進行數據庫操作部分封裝成不同的函數,那么實現后續的邏輯功能時只需調用這些函數即可實現。
3、ORM 階段:
在對 JDBC 進行封裝之后,能夠方便的實現數據庫的操作。但是,在面向對象的編程開發中,數據庫的操作與普通的面向對象的 Java 代碼,顯然是兩種不同的開發思路。於是就產生了 ORM 階段——使原來直接操作數據庫變成了直接操作普通的 Java 類來實現相應的數據庫操作。
三、Hibernate 理論基礎 是ORM 對象關系映射
ORM 是 Object Relational Mapping 的簡稱,即對象關系映射。它是一種為了解決面向對象與關系數據庫存在的互不匹配技術。簡單地說,ORM 是通過使用描述對象和數據庫之間映射的元數據,將 Java 程序中的對象持久化到關系數據庫中。下面請看一個用戶實體(建立數據表時,要描述的現實世界中的實現)、數據表(實體建立完后,抽象分析完成數據表建立)、Java 類(此處就是 ORM要完成的任務而抽象生成的 Java 類):

ORM 實現了數據表到 Java 對象的映射,這正是 ORM 的作用
四、持久層概念
ORM 是通過使用描述對象和數據庫之間映射的元數據,將 Java 程序中的對象自動持久化到關系數據庫中。由此便引入了以下兩個新概念:
(1)持久化:就是對數據和程序狀態的保持。大多數情況下特別是企業級應用,數據持久化往往也就意味將內存中的數據保存到磁盤上加以固化,而持久化的實現過程則大多通過各種關系數據庫來完成。
(2)持久層:把數據庫實現當做一個獨立邏輯拿出來,即數據庫程序是在內存中的,為了使程序運行結束后狀態得以保存,就要保存到數據庫。持久層是在系統邏輯層面上,專致於實現數據持久化的一個相對獨立的領域。持久層的目的是通過持久層的框架將數據庫存儲服務從服務層中分離出來,而 Hibernate 是目前最流行的持久層框架。
五、具體開發步驟:
1、在Eclipse中配置開發環境:
(1)安裝Hibernate插件:
A、下載Hibernate插件,采用link方式安裝
(2)添加XML約束文件
2、新建Maven工程,導入Hibernate的核心jar包、支持C3P0數據庫連接池的jar包:
c3p0-0.9.5.2.jar
hibernate-c3p0-5.2.17.Final.jar
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.17.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>5.2.17.Final</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
2、創建Hibernate配置文件:
<session-factory>
<!-- 配置C3P0 -->
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider
</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.timeout">120</property>
<!--1 配置Oracle數據庫的方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
<!--2、配置驅動 -->
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<!--3、配置連接字符串 -->
<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<!--4、配置用戶名、密碼 -->
<property name="hibernate.connection.username">scott</property>
<property name="hibernate.connection.password">root</property>
<!--5、配置是否是否在控制台打印sql語句-->
<property name="hibernate.show_sql">true</property>
<!--6、是否格式化sql語句 -->
<property name="hibernate.format_sql">true</property>
<!--7、是否自動生成數據表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 配置POJO類的映射文件 -->
<mapping resource="com/cn/pojo/Product.hbm.xml"/>
</session-factory>
2、創建持久化類:
public class Product {
private Integer p_id;
private String p_name;
private Double p_price;
private String p_phone;
private String p_address;
......//省去set/get方法
}
3、創建對象-關系映射文件:
<hibernate-mapping>
<class name="com.cn.pojo.Product" table="TB_PRODUCT">
<id name="p_id" type="java.lang.Integer">
<column name="P_ID" />
<generator class="sequence">
<param name="sequence">TB_PRODUCT_SEQ</param>
</generator>
</id>
<property name="p_name" type="java.lang.String">
<column name="P_NAME" />
</property>
<property name="p_price" type="java.lang.Double">
<column name="P_PRICE" />
</property>
<property name="p_phone" type="java.lang.String">
<column name="P_PHONE" />
</property>
<property name="p_address" type="java.lang.String">
<column name="P_ADDRESS" />
</property>
</class>
</hibernate-mapping>
4、在Hibernate配置文件中加入映射文件:
<mapping resource="com/pojo/Product.hbm.xml"/>
5、通過Hibernate API 編寫訪問數據庫的代碼:
//1.創建Configuration對象,並調用configure()方法從默認路徑加載hibernate.cfg.xml文件
Configuration config = new Configuration().configure();
//2.獲取SessionFactory類實例(相當於JDBC中的工廠類)
SessionFactory sessionFactory = config.buildSessionFactory();
//3.獲取Session實例(相當於JDBC中的Connection對象)
Session session = sessionFactory.openSession();
//4.開啟事務
Transaction ts = session.beginTransaction();
//5.封裝數據
Product pro = new Product();
pro.setP_name("鋼筆");
pro.setP_price(12.55);
pro.setP_phone("02985368888");
pro.setP_address("咸陽");
//6.執行保存操作
session.save(pro);
//7.提交事務
ts.commit();
session.close();
注意:
1)4.0以前的版本使用,現在已經廢棄;
sessionFactory = configuration.buildSessionFactory();
2)創建一個ServiceRegistry對象:hibernate4.x以后新添加的對象,hibernate的任何配置對象和服務都必須在該對象中注冊了才能使用
//Hibernate4.2之前版本的寫法:
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties())
.buildServiceRegistry();
//Hibernate4.3之后版本的寫法:
ServiceRegistry serviceRegistry =
new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);