1. 程式人生 > >HIbernate筆記(1)

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資源