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