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包。
(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。