Hibernate框架詳解(一)

Hibernate概述

Hibernate框架是當今主流的java持久層框架之一,是一個開放源碼的ORM(Object Relational Mapping,對象關係映射)框架,它對JDBC進行了輕量級的封裝,使得JAVA開發人員可以使用面向對象的編程思想來操作數據庫。

  • hibernate框架是應用在Java EE三層結構中的dao層的框架
  • 在dao層裏面對數據庫進行crud操作,使用hibernate框架就可以實現,而hibernate框架底層代碼就是JDBC,hibernate框架對JDBC 進行了封裝,使用hibernate框架的好處就是:不需要寫複雜的JDBC代碼(導-->載-->連-->創-->執-->果-->放),不需要寫sql語句
  • hibernate框架是開源輕量級的框架
  • hibernate框架版本:Hibernate3.x    Hibernate4.x(過渡版本)   Hibernate5.x(學習使用版本)

爲什麼要使用Hibernate框架?

使用傳統的JDBC開發應用系統時,如果是小型應用系統,並不覺得有什麼麻煩,但是對於大型應用系統的開發,使用JDBC就會顯得力不從心,例如對幾十,幾百張包含幾十個字段的數據表進行增刪改查時,編寫的SQL語句不但很長,而且繁瑣,容易出錯;在讀取數據時,需要些多條getXXX語句從結果集中取出各個字段的信息,不但枯燥重複,並且工作量非常大。爲了提高編程效率,Gavin King開發了一個當今最流行的ORM框架,它就是Hibernate框架。

什麼是ORM思想?

所謂的ORM就是利用描述對象和數據庫表之間映射的元數據,自動把java應用程序中的對象持久化到關係型數據庫的表中。通過操作java對象,就可以完成對數據庫表的操作。可以把ORM理解爲關係型數據和對象的一個紐帶,開發人員只需關注紐帶一段映射的對象即可。

  • Hibernate框架使用ORM思想對數據庫進行crud操作
  • 在web階段學習的javabean,更準確的叫法應該是實體類
  • ORM:Object Relational Mapping,對象關係映射。讓實體類和數據庫表對應,讓實體類屬性和表中字段對應。

 

搭建Hibernate環境

(1)導入hibernate的jar包

也可以直接導入整理好的jar包

(2)創建實體類

使用hibernate框架的時候,不需要自己手動創建數據表,hibernate框架可以幫我們完成數據表的創建

public class User {
	private int uid;
	private String uname;
	private String password;
	private String address;
	public int getUid() {
		return uid;
	}
	public void setUid(int uid) {
		this.uid = uid;
	}
	public String getUname() {
		return uname;
	}
	public void setUname(String uname) {
		this.uname = uname;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
}

(3)配置實體類和數據庫表一一對應 關係(映射關係)

第一步:創建xml格式的配置文件

映射配置文件名稱和位置沒有固定要求。建議:在實體類所在的包裏創建,名稱爲:實體類名稱.hbm.xml

第二步:在配置文件中引入xml約束

在hibernate框架裏引入的約束是dtd約束,參照如下範例:

<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

第三步:配置映射關係

<hibernate-mapping>
	<!-- 1 配置類和表對應 
		class標籤
		name屬性:實體類全路徑
		table屬性:數據庫表名稱
	-->
	<class name="cn.itcast.entity.User" table="t_user">
		<!-- 2 配置實體類id和表id對應 
			hibernate要求實體類有一個屬性唯一值
			hibernate要求表有字段作爲唯一值
		-->
		<!-- id標籤
			name屬性:實體類裏面id屬性名稱
			column屬性:生成的表字段名稱
		 -->
		<id name="uid" column="uid">
			<!-- 設置數據庫表id增長策略 
				native:生成表id值就是主鍵自動增長
			-->
			<generator class="native"></generator>
		</id>
		<!-- 配置其他屬性和表字段對應 
			name屬性:實體類屬性名稱
			column屬性:生成表字段名稱
		-->
		<property name="username" column="username"></property>
		<property name="password" column="password"></property>
		<property name="address" column="address"></property>
	</class>
</hibernate-mapping>

(4)創建hibernate的核心配置文件

第一步:核心配置文件格式爲xml,但是核心配置文件名稱和位置是固定的。

位置:src目錄下

名稱:必須是hibernate.cfg.xml

第二步:在配置文件中引入dtd約束

參照如下範例:

<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

第三步:hibernate框架在操作過程中,只會加載核心配置文件,其他配置文件不會加載。

配置內容包括三個部分:

第一部分:配置數據庫信息(必須)

第二部分:配置hibernate信息(可選)

第三部分:配置映射文件到核心配置文件中(必須)

數據庫配置信息如下所示:

<!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="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信息  可選的-->
		<!-- 輸出底層sql語句 -->
		<property name="hibernate.show_sql">true</property>
		<!-- 輸出底層sql語句格式 -->
		<property name="hibernate.format_sql">true</property>
		<!-- hibernate幫創建表,需要配置之後 
			update: 如果已經有表,更新,如果沒有,創建
		-->
		<property name="hibernate.hbm2ddl.auto">update</property>
		<!-- 配置數據庫方言
			在mysql裏面實現分頁 關鍵字 limit,只能使用mysql裏面
			在oracle數據庫,實現分頁rownum
			讓hibernate框架識別不同數據庫的自己特有的語句
		 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		


		<!-- 第三部分: 把映射文件放到核心配置文件中 必須的-->
		<mapping resource="cn/itcast/entity/User.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

 

實現添加操作

第一步:加載hibernate核心配置文件

第二步:創建SessionFactory對象

第三步:使用SessionFactory創建session對象

第四步:開啓事務

第五步:寫具體邏輯crud操作

第六步:提交事務

第七步:關閉資源

public class HibernateDemo {

	@Test
	public void testAdd() {
//		第一步 加載hibernate核心配置文件
		// 到src下面找到名稱是hibernate.cfg.xml
		//在hibernate裏面封裝對象
		Configuration cfg = new Configuration();
		cfg.configure();
		
//		第二步 創建SessionFactory對象
		//讀取hibernate核心配置文件內容,創建sessionFactory
		//在過程中,根據映射關係,在配置數據庫裏面把表創建
		SessionFactory sessionFactory = cfg.buildSessionFactory();
		
//		第三步 使用SessionFactory創建session對象
		// 類似於連接
		Session session = sessionFactory.openSession();
		
//		第四步 開啓事務
		Transaction tx = session.beginTransaction();

//		第五步 寫具體邏輯 crud操作
		//添加功能
		User user = new User();
		user.setUsername("小王");
		user.setPassword("250");
		user.setAddress("日本");
		//調用session的方法實現添加
		session.save(user);
		
//		第六步 提交事務
		tx.commit();

//		第七步 關閉資源
		session.close();
		sessionFactory.close();
	}

}

 

Hibernate配置文件詳解

(1)Hibernate映射配置文件

  • 映射配置文件名稱和位置沒有固定要求,建議寫在實體類所在包裏,名稱命名爲:實體類名稱.hbm.xml
  • 映射配置文件中,首先書寫<hibernate-mapping>標籤
  • 在<hibernate-mapping>標籤中,書寫<class>標籤,將實體類和數據庫表進行一一映射。其中<class>標籤中,name屬性值寫實體類全路徑,table屬性值寫數據表名稱
  • 在<class>標籤中,書寫<id>標籤和<property>標籤,hibernate要求實體類有一個屬性是唯一值,要求數據表中有字段作爲唯一值,<id>標籤表示這個值,<property>標籤標示其他非唯一的值
  • 在<id>標籤中,name屬性值表示實體類裏面id屬性值,column屬性值表示生成的表字段名稱(可省略,表字段名稱跟屬性相同)
  • 在<property>標籤中,name屬性值表示實體類裏面屬性名稱,column屬性值表示成成的表字段名稱(可省略,表字段名稱跟屬性相同)
<hibernate-mapping>
	
	<class name="cn.itcast.entity.User" table="t_user">
		
		<id name="uid" column="uid">
			<generator class="native"></generator>
		</id>
		<property name="username" column="username"></property>
		<property name="password" column="password"></property>
		<property name="address" column="address"></property>

	</class>
</hibernate-mapping>

(2)Hibernate核心配置文件

  • 核心配置文件名稱和位置都有固定要求,該核心配置文件要書寫在src目錄下面,名稱命名爲:hibernate.cfg.xml
  • 核心配置文件中,首先書寫<hibernate-configuration>標籤,在該標籤下書寫<session-factory>標籤,在該標籤下書寫配置信息
  • 配置信息包括三個部分:數據庫配置信息(必須),hibernate配置信息(可選),映射文件配置信息(必須)
<hibernate-configuration>
	<session-factory>

		<!-- 第一部分: 配置數據庫信息 必須的 -->
		<property name="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信息  可選的-->
		      <!-- 輸出底層sql語句 -->
		<property name="hibernate.show_sql">true</property>
		      <!-- 輸出底層sql語句格式 -->
		<property name="hibernate.format_sql">true</property>
		      <!-- hibernate幫創建表,需要配置之後 update: 如果已經有表,更新,如果沒有,創建-->
		<property name="hibernate.hbm2ddl.auto">update</property>
		      <!-- 配置數據庫方言
			   在mysql裏面實現分頁 關鍵字 limit,只能使用mysql裏面
			   在oracle數據庫,實現分頁rownum
			   讓hibernate框架識別不同數據庫的自己特有的語句
		       -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		


		<!-- 第三部分: 把映射文件放到核心配置文件中 必須的-->
		<mapping resource="cn/itcast/entity/User.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

 

Hibernate的核心API

(1)Configuration:配置對象

Configuration主要用於Hibernate框架加載核心配置文件。實例代碼如下:

Configuration cfg = new Configuration();
cfg.configure();

說明:到src目錄下找到名稱爲hibernate.cfg.xml配置文件,創建對象,把配置文件放到對象裏面(即加載核心配置文件)

(2)SessionFactory:Session工廠對象

  • 使用configuration對象創建SessionFactory對象,創建SessionFactory過程中,Hibernate框架會根據核心配置文件中的數據庫配置和映射關係配置,到數據庫裏面根據映射關係創建數據表。

  • 創建SessionFactory的過程中,這個過程特別耗費資源,因此在Hibernate操作中,建議一個項目只創建一個SessionFactory對象
  • 具體實現:書寫工具類,寫靜態代碼塊(靜態代碼塊在類加載時執行,且只執行一次)
public class HibernateUtils {

	static Configuration cfg = null;
	static SessionFactory sessionFactory = null;
	//靜態代碼塊實現
	static {
		//加載核心配置文件
		cfg = new Configuration();
		cfg.configure();
		sessionFactory = cfg.buildSessionFactory();
	}
	
	//提供方法返回sessionFactory
	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}
	
	public static void main(String[] args) {
		
	}
}

(3)Session

  • Session類似於JDBC中connectino對象,是應用程序和數據庫之間交互操作的一個單線程對象,是Hibernate運作的核心,它的主要功能是爲實體類對象提供創建,讀取,刪除的能力,所有實體類對象必須在Session的管理下才可以進行持久化操作。
  • 調用Session裏面不同的方法可以實現crud操作:添加功能使用save方法,修改功能使用update方法,刪除功能使用delete方法,根據id查詢使用get方法
  • Session對象是單線程對象,即Session對象不能共用,只能自己使用

(4)Transaction

  • Transaction接口主要用於管理實務,它是hibernate框架的數據庫事務接口,且對底層的事務接口進行了封裝,Transaction接口的事務對象通過session對象開啓,其開啓方式如下:
//開啓事務
Transaction tx=session.beginTransaction();
  • Transaction接口中,提供了事務管理的常用方法,如下所示:

  • Session對象執行完數據庫操作後,要使用Transaction接口的commit方法進行事務提交,才能真正的將數據操作同步到數據庫中,如果發生異常,則需要使用rollback方法進行事務回滾,以避免數據發生錯誤

 

配置文件中沒有提示信息

(1)可以上網,自動引入dtd約束文件

(2)手動把約束文件引入到myeclipse中

第一步:

第二步:

第三步:

 

第四步:在配置文件中複製一句話

第五步:重啓myeclipse

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章