HIbernate筆記(1)
近來基本將Hibernate進行了一個理解和應用,雖然現在使用SSH框架的企業很少了,但是三大框架主流思維還是相對較為相似,Hibernate上手難度較低,更容易理解,同時也是通過XML進行配置的典型框架,我認為還是有必要進行一個瞭解。
Hibernate是一個持久層框架,其思想為ORM(Object Relational Maps)物件關係對映。能夠通過XML檔案進行配置,同時其框架為我們提供了多種優化手段,能夠極大提高開發效率同時也使維護變的更加方便。
物件關係對映(ORM)
物件關係對映是Hibernate中最為重要的一種思想。簡單理解來說,ORM即將我們資料庫中的資料表與Java中的實體類進行相對應,將Java實體類中的屬性與表中的欄位相關聯,能夠通過操作物件來完成對資料庫中資料的更改。其最明顯的優勢就是能夠以面向物件的思維方式來處理資料庫問題。
之前使用JDBC處理資料庫時,操作過於底層同時也不夠靈活,如果需要更改查詢條件,我們必須將SQL語句進行更改,這樣的操作似乎也不太符合面向物件設計的理念,而在Hibernate框架中,我們可以通過更改物件的方式,框架將自動為我們完成資料庫資訊的更新和變動。
簡單來說,Hibernate將給我們帶來如下幾個優勢
-
JDBC操作繁瑣,ORM簡潔明瞭
-
SQL語句編寫複雜,且不是面向物件的思維,ORM改善了這種方法並提供了自己的優化,並只需要對物件操作即可
-
可將物件與表之間建立聯絡,簡化了程式設計思維
-
ORM解決了跨資料庫平臺優勢,當更換資料庫時,不需要重構程式碼(可移植性好)
-
ORM為輕量級框架,使用更加靈活
Hibernate關係對映
Hibernate中我們可以實現幾種關係對映,如下
-
實體類與資料表關係對映(屬性對映,類對映)
-
一對一對映
-
一對多對映
-
多對多對映
Hibernate XML關係配置
在使用Hibernate前,我們需要對Hibernate進行一些關係配置,其中主要分為實體類與表的對映配置與Hibernate框架配置兩個XML的使用。
關於Hibernate框架配置
檔名命名為hibernate.cfg.xml,可以進行更改,但是需要更改配置,一般都使用預設名稱。
首先我們需要引入hibernate.cfg.xml的約束
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
然後我們引入使用Hibernate的幾個必要的標籤
<hibernate-configuration>
<session-factory>
<!-- 資料庫基本配置 -->
<propertyname="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
//資料庫名稱
<property name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property>
//資料庫使用者名稱
<property name="hibernate.connection.username">root</property>
//資料庫密碼
<property name="hibernate.connection.password">root</property>
<!-- Hibernate 方言配置 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
</session-factory>
</hibernate-configuration>
前幾項類似於我們配置JDBC的驅動配置,而方言配置是Hibernate將使用者的操作轉化為SQL語句時,使用哪種資料庫語言,通過這一方法,我們能夠實現更換資料庫時保證原始碼不進行重構。
這幾項完成後,需要引入類與表的關聯的XML檔案,程式碼如下
<mapping resource="demo1/Customer.hbm.xml"/>
這樣能夠讓Hibernate載入到我們類表關聯的配置檔案,檔案路徑為全路徑名稱。其中還有一些可選配置例如
是否列印SQL語句到控制檯上
<property name="hibernate.show_sql">true</property>
SQL語句是否進行格式化
<property name="hibernate.format_sql">true</property>
該類語句可以到Hibernate官方提供的API中進行查詢
關於類與表對映配置
這是Hibernate的核心內容,通過XML配置完成後,框架完成解析,將我們對於物件的每一步操作自動轉化為SQL語句,XML檔案配置正確與否將直接影響到我們程式能否進行使用。
基本過程如下
- 引入約束檔案
- 建立表與實體類的對映
- 建立表與主鍵的對應
- 建立表中欄位與類中普通屬性的對應
約束檔案如下
<!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="demo1.Customer" table="cst_customer">
<!-- 建立類中屬性與表中主鍵對應-->
<id name="cust_id" column="cust_id">
//其中native為一種主鍵自增長方式,之後進行詳細描述
<generator class="native"></generator>
</id>
<!-- 建立類中普通屬性與表中欄位-->
<property name="cust_name" column="cust_name" />
<property name="cust_source" column="cust_source" />
<property name="cust_industry" column="cust_industry"/>
<property name="cust_level" column="cust_level"/>
<property name="cust_phone" column="cust_phone"/>
<property name="cust_mobile" column="cust_mobile"/>
</class>
</hibernate-mapping>
此時,我們就建立了一個實體類與表對映的XML檔案。
此時我們來看下如Hibernate如何讓我們不使用SQL語句即可完成對資料庫的操作。
public class HibernateDemo1 {
@Test
public void function() {
//載入核心配置檔案
Configuration configuration = new Configuration();
configuration.configure();
//建立session-factory物件,類似於JDBC連線池,維護快取等內容
SessionFactory SessionFactory = configuration.buildSessionFactory();
//通過session-factory獲取到session物件,類似於jdbc中connection物件
Session session = SessionFactory.openSession();
//手動開啟事務,在Hibernate5中不需要手動開啟,為了保證相容
Transaction transcation = session.beginTransaction();
//編寫程式碼
Customer customer = new Customer();
customer.setCust_name("張三");
//將物件儲存
session.save(customer);
//事務提交
transcation.commit();
//釋放資源
session.close();
SessionFactory.close();
}
}
我們能夠看到,程式碼中沒有出現SQL語句,而是通過SAVE方法將物件進行儲存即完成了對資料庫的一個操作,這實際上也體現了框架的一種面向物件的思維方式,擯棄以往JDBC傳統的思維方法,將實現細節進行封裝,只需要我們關注業務本身即物件層面操作即可。
關於其中內容一些註釋
- 操作需要我們使用session進行處理,例如增刪改查
- session代表資料庫連線物件,是執行緒不安全的,不能夠定義為全域性變數
- 在使用完成後需要我們及時關閉session資源