1. 程式人生 > >hibernate學習之簡單核心概念

hibernate學習之簡單核心概念

一、hibernate

1. hibernate是什麼?
hibernate是一個開放原始碼的物件關係對映框架(ORM),它是當今主流的Java持久層框架之一。
(1)hibernate框架應用在JavaEE三層架構中的dao層框架。
(2)在dao層對資料庫進行crud操作,hibernate底層程式碼就是jdbc,hibernate對jdbc進行封裝,好處為:不需要寫複雜的jdbc程式碼了,不需要寫SQL語句的實現了。
(3)hibernate是開源的輕量級的框架。輕量級是指不需要依賴於其他東西,可以直接使用。
(4)hibernate版本
     Hibernate3.*
     Hibernate4.*(過渡版本,一般沒人使用)
     Hibernate5.*(學這個就可以了)
(5)hibernate-release-5.2.12.Final.zip,final是指最終版本,目錄下的lib資料夾下是相關jar包。

2. 什麼事ORM思想
(1)hibernate使用ORM思想對資料庫進行操作。
(2)ORM:object relational mapping 物件關係對映
(3)文字描述
--實體類和資料庫表進行一一對應
--實體類中的屬性和資料庫表字段一一對應
--不需要操作資料庫表,直接操作表對應的實體類物件

二、 hibernate配置檔案詳解

1. hibernate對映配置檔案
(1)對映配置檔名和位置沒有固定要求
(2)對映配置檔案中,標籤屬性值寫實體類的相關內容
  --class標籤:name屬性:實體類全路徑
      table屬性:資料庫表名稱
  --id標籤和property標籤name屬性值 實體類屬性名稱
  --id標籤和property標籤column屬性可以省略的(不寫值->資料庫表字段名和name屬性值一樣) 
  --property標籤type屬性,設定生成表字段的型別,hibernate會自動對應型別

(3)程式碼User.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>
	<!-- 1. 配置類和表 
		class標籤:name屬性:實體類全路徑
			   table屬性:資料庫表名稱
	-->
	<class name="com.zzc.hibernate.entity.User" table="user">
		<!-- 2.配置實體類id和表id對應
			hibernate要求實體類有一個屬性唯一值
			hibernate要求表有欄位作為唯一值
		 -->
		<id name="uId" column="uId">
			<!-- 3. 設定資料庫表id增長策略(自動增長:native)-->
			<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核心配置檔案
(1)配置寫位置要求,必須在<hibernate-configuration><session-factory>內;
(2)配置三部分要求
        --第一部分:配置資料庫資訊(必須的)
        --第二部分:配置hibernate資訊(可選的)
        --第三部分:配置對映檔案資訊(必須的)
(3)核心配置檔名稱和位置固定的
        --位置:src下面
        --名稱:hibernate.cfg.xml
(4)程式碼hibernate.cfg.xml        

<?xml version="1.0" encoding="UTF-8"?>
<!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://localhost:3306/hibernate?characterEncoding=utf-8</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">123</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>
		<!-- 配置資料庫方言:讓hibernate框架識別不同資料庫特有的語句
			在MySQL中實現分頁:使用limit關鍵字(只能在mysql中使用),
			在oracle中實現分頁:使用rownum
		 -->
		 <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
		<!-- 第三部分:把對映檔案放到核心配置檔案中 必須的 -->
		<mapping resource="com/zzc/hibernate/entity/User.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

三、Configuration

1. Configuration物件會到src目錄下尋找hibernate.cfg.xml,建立物件,然後將hibernate.cfg.xml放到物件裡面(載入核心配置檔案)。

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

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

2. 其他方式使用:

(1)指定位置查詢核心配置檔案,如src目錄下的config包下的hibernate.cfg.xml。

Configuration cfg = new Configuration().configure("/config/hibernate.cfg.xml")

(2)載入對映檔案,當然也可在核心配置檔案中使用mapping標籤。

Configuration cfg = new Configuration().configure("XML檔案位置");
cfg.addResource("com/zzc/hibernate/entity/User.hbm.xml");

四、SessionFactory(重點)

1. 使用Configuration物件建立SessionFactory物件。
  --在建立過程中,會根據核心配置檔案中資料庫相關配置,有對映檔案部分,根據對映關係在資料庫中把表建立。
  --核心配置檔案中的配置:

<property name="hibernate.hbm2ddl.auto">update</property>

2. 由於每次都要建立SessionFactory,然後每次都要訪問核心配置檔案,判斷是否需要建立表,然後更新......,十分浪費資源,效能低。解決辦法:在hibernate操作過程中,建議一個專案一般建立SessionFactory物件--->寫工具類(Utils),使用靜態程式碼塊實現(靜態程式碼塊在類載入的時候執行,只會執行一次)。

3. 工具類的實現(可使用靜態方法返回SessionFactory物件,也可直接放回Session物件,下面返回的是SessionFactory物件

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {

	private static final Configuration cfg;
	private static final SessionFactory sessionFactory;
	//靜態程式碼塊實現
	static {
		cfg = new Configuration().configure();
		sessionFactory =cfg.buildSessionFactory(); 
	}
	//使用靜態方法返回SessionFactory物件
	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}
}

五、Session(重點)

1. Session類似於jdbc中的連線Connection。

2. 呼叫Session中的方法實現crud(增刪查改)的操作

       save(新增)、update(修改)、delete(刪除)、get和load(根據主鍵查詢)、createQuery和createSQLQuery(用於資料庫操作物件)、createCriteria(條件查詢)......

3. Session物件是單執行緒物件,意味著Session物件不能共用,只能自己使用。

六、Transaction

1.  事務物件

//開啟事務
Transaction ts = session.beginTransaction();

2. 事務提交和回滾方法

ts.commit();
ts.rollback();
3. 事務四個特性:原子性,一致性,隔離性,永續性

七、解決配置檔案沒有提示的問題

第一種:可以上網,它會自動提示,因為dtd約束是http協議。

第二種:沒有網路環境,解決辦法:將dtd約束檔案引入到eclipse中去。

         第一步:開啟eclipse->Windows->Preferences。

         第二步:在搜尋框輸入:xml c,下面就會自動出現 XML Catalog,點選進入。

        第三步:(1)將xml檔案中的dtd約束複製,如:http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd;注:要帶http的約束。

                        (2)點選 XML Catalog中的Add,選擇Catalog Entry,將key type 改為URL,將dtd的http約束複製到Key:中去,Location:->點選File System,將本地的dtd檔案匯入到Location中去,點選OK。

        第四步:檢視xml檔案中是否有提示,沒有提示,重啟eclipse。