相信所有做后端的程序員同行們,沒有不知道Hibernate大名的。這是一個經典的輕量級Java EE持久層的解決方案,它使得我們程序員能以面向對象的思維操作傳統的關系型數據庫,這也是其存在的最大意義所在。當然也有很多人說Hibernate不就是封裝了我們的JDBC實現對數據庫的增刪改查嗎?,但其實Hibernate所做的事情遠遠不止於此,它是一個非常優秀的框架,甚至在目前依然占有很大一部分市場。下面我們就詳細的學習下該框架的最基本的一些概念和配置,主要涉及內容有如下幾點:
- Hibernate的基本介紹
- 配置基本環境運行Hibernate
一、Hibernate的基本介紹
在沒有Hibernate之前,我們的程序對數據的訪問都是基於JDBC,我們創建connection對象並由它創建我們的Statement對象,接着就是寫Sql語句以實現對數據庫的訪問。這樣就直接導致我們每次對數據庫的訪問都對應於一條Sql語句,並且對於查詢返回的結果集也是需要我們利用循環遍歷訪問的。(也就是需要取出數據表的每一列數據再次封裝成對象)那我們的Hibernate的思想就是讓一個類對應於數據的一張表,該類的一個對象對應於數據表的一行數據,這樣我們可以在程序中通過對類對象的操作來映射為對數據表的操作(這就是我們的Hibernate框架做的事情),數據庫查詢返回的結果集則對應於類對象的集合。這樣通過Hibernate,我們對於數據庫的訪問也具有面向對象思維,並且我們不再需要書寫大量的Sql語句了,從此我們對數據庫的操作就完全變成對類對象的操作,簡化了程序代碼的復雜程度。
以上我們簡單介紹了Hibernate基本思想,利用實體類映射數據表。當然,如果你覺得你寫的Sql語句效率很高並且能夠很好的管理程序中大量的數據訪問代碼的話,你可以完全不用使用Hibernate。我們的Hibernate是一個ORM框架,ORM就是ObjectRelationMapping,對象到關系的映射,簡單來說就是用Java類對應數據庫表,一個類對象就對應數據表中的一行數據,這樣我們對於數據庫的訪問就變成了對類對象的訪問,所有的Sql語句都由Hibernate生成。
對於Hibernate的下載,前往http://hibernate.org/orm/downloads/選擇自己所需版本進行下載即可。解壓下載下來的Hibernate包,主要有三個文件夾,一個documentation包含了基本的文檔,一個lib包含的是hibernate的核心jar包,還有一些其他的工具庫,一個project包含一些源代碼,相關資源。關於Hibernate的基本介紹就簡單介紹到這,對於該框架更深層次的理解需要實踐去感悟,下面我們介紹搭建Hibernate運行環境的幾個基本配置文件。
二、配置基本環境運行Hibernate
本小節將從頭至尾一步一步的配置好Hibernate的基本環境,最終能夠完成對數據庫的增刪改查。
1、導入必需的jar包
拷貝hibernate-release-4.3.11.Final\lib\required目錄下的所有jar包到Java項目中,這些jar包是Hibernate必需的核心jar包。還有我們操作數據庫需要的數據庫驅動的jar包。
2、編寫hibernate.cfg.xml配置文件
hibernate.cfg.xml文件是Hibernate的一個重要的配置文件,我們一般在該配置文件中配置數據庫連接的基本信息以及一些其他的資源信息。這個文件可以到目錄hibernate-release-4.3.11.Final\project\etc中拷貝進行修改即可。
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--配置數據庫連接基本信息-->
<!--配置數據庫驅動-->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!--配置數據庫連接url-->
<property name="connection.url">jdbc:mysql://localhost:3306/cyy</property>
<!--配置數據庫連接用戶名和密碼-->
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<!--配置數據庫數據方言-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
</session-factory>
</hibernate-configuration>
3、創建實體類
這里創建的實體類就是用於映射數據庫某張表的。其中的每個屬性都是和數據表中列是相對應的,並且每個屬性都必須符合Javabean規范(提供相對應的getter和setter方法)。
這里我們雖然創建了實體類(pojo),但是它還並不具備能夠映射數據庫的能力,也就是說它還差一步才能和我們的數據庫進行映射(po)。
4、編寫*.hbm.xml配置文件
這是一個專門用於把普通的Java類配置成可持久化的po對象。該文件的命名一般和我們定義的實體類名相關,例如上述我們定義了一個userinfo類,那么這里的配置文件就是userinfo.hbm.xml,當然這個配置文件的命名完全隨便你,如果按照約定命名的話,我們在配置文件中對於某些參數就不用再顯式指定了。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!--配置實體類個關系數據表之間的映射-->
<!--
name屬性表示實體類的全路徑
table屬性表示數據庫表名
-->
<class name="DbClasses.UserInfo" table="userinfo">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<!--配置實體類屬性與數據表的各個列之間的映射對應-->
<property name="name" column="name"></property>
<property name="age" column="age"></property>
</class>
</hibernate-mapping>
通過該配置文件,我們關聯了某個實體Java類與數據庫中的某張表,並將實體的中的各個屬性與數據表中的各列相關聯。當然,為了讓我們的程序能夠加載該配置文件,我們還需要在hibernate.cfg.xml配置文件中外部鏈接該配置文件。想hibernate.cfg.xml中添加一下一行代碼:
<mapping resource="DbClasses/UserInfo.hbm.xml"></mapping>
5、啟動Hibernate框架
至此,以上的步驟完成了運行框架的基本配置,下面就是通過在主程序中啟動框架。以下這張圖就是Hibernate的主要步驟:
從上述圖片中,我們可以看出來,啟動Hibernate框架大致需要七個步驟。它們分別是:
- 創建configuration對象
- 通過configuration對象創建sessionFactory實例
- 通過sessionfactory創建session實例
- 通過session對象創建Transaction對象
- 保存數據
- 提交事務
- 釋放session
//創建configuration對象
Configuration cfg = new Configuration().configure();
Configuration對象負責加載我們的配置文件,並創建SessionFactory實例。我們這里調用了無參的configure方法,該方法的內部會去加載hibernate.cfg.xml文件。源代碼如下:
public Configuration configure() throws HibernateException {
this.configure((String)"/hibernate.cfg.xml");
return this;
}
當然,如果我們想創建由我們自己隨意命名的配置文件的話,在這里只需要通過參數傳給configure方法即可。
//創建sessionfactory對象
ServiceRegistry registry = new StandardServiceRegistryBuilder()
.applySettings(cfg.getProperties())
.build();
SessionFactory sf = cfg.buildSessionFactory(registry);
從hibernate4以后都建議采取ServiceRegistry 來注冊SessionFactory對象了,通過configuration和ServiceRegistry 來生成SessionFactory對象,它是一個進程級別的對象,也就是說它是單例的,整個程序中只能有一個對象,因此也是線程安全的。
//通過SessionFactory創建session對象
Session session = sf.openSession();
session對象代表着與數據庫的一次連接,它底層封裝的是jdbc,我們通過它來操作我們的數據表。
//通過session創建事務對象
Transaction transaction = session.beginTransaction();
Transaction 代表事務的概念,它和數據庫中的事務概念類似,代表了一次原子操作,所有的持久化操作都應該在事務的管理之下。
接下來我們完成一次數據庫的插入操作,完整的代碼如下:
public static void main(String[] args){
//創建configuration對象
Configuration cfg = new Configuration().configure();
//創建sessionfactory對象
ServiceRegistry registry = new StandardServiceRegistryBuilder()
.applySettings(cfg.getProperties())
.build();
SessionFactory sf = cfg.buildSessionFactory(registry);
//通過SessionFactory創建session對象
Session session = sf.openSession();
//通過session創建事務對象
Transaction transaction = session.beginTransaction();
UserInfo user = new UserInfo();
user.setName("張三");
user.setAge(22);
session.save(user);
//提交事務
transaction.commit();
session.close();
}
運行程序,查看數據庫中的userinfo表:
可以看到,我們的插入操作已經生效。最后,貼出整個項目的目錄結構。
至此,我們簡單的介紹了Hibernate中一些最基本的概念,並完整的搭建了Hibernate的運行環境,通過最簡單的插入操作運行起來Hibernate框架。有關Hibernate更詳細的一些細節,我們將在后續文章中進行介紹學習,總結不到之處,望指出。