Hibernate 初相識(一)Hibernate API 詳解,配置檔案,對映檔案詳解。
阿新 • • 發佈:2019-01-24
導航{
}
Hibernate 在三層框架中的位置。
一,第一個Hibernate 專案。
地址:https://github.com/gengzi/Hibernate【1】匯入jar包
解壓 Hibernate 的原始碼包 將加壓檔案中的 hibernate3.jar 匯入專案,是核心jar 包開啟依賴的jar 包,選擇 jpa 和 required 中的jar 檔案
操作資料庫,需要對應的資料庫的驅動jar 包
下面這些都是必須要匯入的jar 包
【2】建立我們的資料庫,和表 (資料庫名:day29hibernate_test01 表名: s_user)
[3] 編寫 javaBean 檔案和 配置檔案
{
兩個配置檔案:(1) 對映檔案(對應javabean 物件)
(2) 核心配置檔案} 編寫屬性和 資料庫建立一樣的javaBean 物件。
建立一個跟 User.java 的名字一樣的 javabean名.hbm.xml 的對映檔案 { 規範要求:對映檔案的名字前面與javabean 名字一樣,在同一包下。 } 配置檔案需要匯入 dtd 約束。 約束檔案
、 (小知識: 一般dtd 檔案中頭註釋部分,都會把約束寫出來) 在 對映檔案中 匯入 hibernate-mapping-3.0.dtd 的約束 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>
<class name="cn.edu.aynu.rjxy.domain.User" table="s_user">
<!--主鍵-->
<
<!--native意思:原生-->
<generator class="native"></generator>
</id>
<!--普通欄位-->
<property name="username"></property>
<property name="password"></property>
</class>
</hibernate-mapping>
配置核心約束檔案
位置:類路徑(classpath、src)-->WEB-INF/classes
名稱:hibernate.cfg.xml
匯入hibernate-configuration-3.0.dtd 的約束頭
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/day29hibernate_test01</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">111</property>
<!--新增對映檔案-->
<mapping resource="cn/edu/aynu/rjxy/domain/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
複製User.hbm.xml 的全路徑,需要刪掉 src 前面的內容。
【4】編寫test.java 檔案,測試專案。
package cn.edu.aynu.rjxy.test;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import cn.edu.aynu.rjxy.domain.User;
publicclassTest01{
publicstaticvoid main(String args[]){
test();
}
publicstaticvoid test(){
// [1]載入配置檔案獲得核心配置物件
Configuration configuration =newConfiguration().configure();
// [2]獲得工廠 SessionFactory,相當於連線池( build 構造)
SessionFactory buildSessionFactory = configuration
.buildSessionFactory();
// [3]獲得會話session,相當於連結Connection
Session openSession = buildSessionFactory.openSession();
// 【4】 儲存一個user 資訊
User user =newUser();
user.setPassword("111");
user.setUsername("耿帥佳");
// [5] 操作
openSession.save(user);
// [6] 關閉資源
openSession.close();
buildSessionFactory.close();
}
}
控制檯列印 sql 語句 。
執行結果 :
二,分析常見的Api 欄位。
【1】Hibernate 的執行過程。
【2】對Configuraction 詳解。
package cn.edu.aynu.rjxy.api;
import org.hibernate.cfg.Configuration;
import cn.edu.aynu.rjxy.domain.User;
publicclassConfiguration_test{
// 詳解 Configuraction 物件
publicvoid fun1(){
// 1.1 呼叫configure() 方法=> 載入src下名為hibernate.cfg.xml
// (呼叫configuraction() 方法 => 載入src下的 hibernate.properties)
Configuration configuration =newConfiguration().configure();
// <三種載入核心配置檔案的方式:>
// 1.2 如果配置檔案不符合預設載入規則.我們可以呼叫
// new Configuration().configure(file); 通過file載入
// new Configuration().configure(path); 通過指定的路徑載入
// <載入對映檔案的兩種方式:>
// 1.3 可以通過Configuration物件載入 對映檔案(不推薦)(對映檔案就是:User.hbm.xml)
// 手動配置(不推薦)
// configuration.addClass(User.class);
// configuration.addResource("cn/edu/aynu/rjxy/domain/User.hbm.xml");
// 推薦hibernate.cfg.xml 使用 mapping 屬性引入配置檔案
configuration.addClass(User.class);
configuration.addResource("cn/edu/aynu/rjxy/domain/User.hbm.xml");
// <ORM(User.hmb.xml) 對映檔案編寫規範>
// 規範: 1>orm對映檔名稱與實體的簡單類名一致 (User.hbm.xml User.java )
// 2>orm對映檔案 需要與實體的類在同一包下
}
}
【3】 對 SessionFactory 的詳解。
package cn.edu.aynu.rjxy.api;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
// 對sessionFactory 的詳解
publicclassSessionFactory_test{
//
publicvoid fun1(){
// 1載入配置
Configuration conf =newConfiguration().configure();
// 2 根據Configuration 配置資訊建立 SessionFactory
// sessionFactory 可以理解為一個連線池,連線池中包含很多連線,而session 就相當於連線池中的 connection 物件
SessionFactory sf = conf.buildSessionFactory();
// 3 獲得session
// 3.1 openSession => 獲得一個全新的Session物件
sf.openSession();
// 3.2 getCurrentSession => 獲得與當前執行緒繫結的session物件
// 呼叫getCurrentSession 需要加上一個配置: <property
// name="hibernate.current_session_context_class">thread</property>
sf.getCurrentSession();
}
}
【4】詳解 Session 物件
測試我們常見的資料庫操作,增(insert),刪(delete),改(update),查(查一條,查所有,按條件查詢)(select)(1)在資料庫中新增一條資料。
呼叫了 session 的 save() 方法(主鍵自增)User user =newUser();
user.setUsername("test");
user.setPassword("111");
// 呼叫session 物件的 save 方法,來儲存物件到資料庫中
session.save(user);
(2)修改一條資料,需要先查詢到該物件,然後才能修改物件中的屬性
使用 update 方法// 先執行查的方法,找到需要修改的物件
User user =(User) session.get(User.class,1);
user.setUsername("耿帥佳--修改");
session.update(user);
(3)刪除一條資料,呼叫 delete 方法。 需要先找出該物件, 才能執行刪除。
// 先找出該物件
User user =(User) session.get(User.class,2);
// 再刪除
session.delete(user);
(5) 查詢一條記錄,查詢 id 為 2 的記錄。
(5.1)get 方法兩個引數 (Class class Serializable id) , 第二個引數就是標識的主鍵// 查詢 id 為 2的這一條記錄。
User user =(User) session.get(User.class,2);
transaction.commit();
(5.1)使用 load 方法來查資料庫, 它不會立即查詢資料庫,當我們使用到這個物件的時候,就會查詢資料庫。
User user =(User) session.load(User.class,2);
在debug 的模式下,我們執行到提交以後,再去點選 user 物件,則會執行如下圖的查詢。
比較:get()方法 和 load() 方法 get: get方法被呼叫時立刻 傳送sql語句查詢 load : 呼叫時並沒有查詢資料庫,當我們需要使用該物件的時候,才查詢資料
(6)查詢所有,三種方式。
(6.1)使用HQL 語言進行查詢(6.2)使用原生的sql 語句查詢
(6.3) 使用Hibernate 獨創的物件方式查詢 => 無語句
對應控制檯的輸出:
其中的問題: 1 load方法.返回一個代理物件,獲得其內容時,會查詢資料庫,是每次訪問屬性都會查詢資料庫嗎? 答:不是每次都查.代理物件中有一個標識是否被初始化的boolean型變數. 記錄是否被初始化過. 2 代理都是要基於介面的,用load方法返回的代理,就沒有實現任何介面? 答: java中的動態代理是基於介面. 而 Hibernate 是使用javassist-3.12.0.GA.jar 產生代理物件的. 該代理與被代理物件之間的關係是繼承關係.與我們學的動態代理不是一種.所以不需要介面.
【5】 詳解 Trancastion 物件。
事務是處理一系列的資料庫的操作。注意: 事務關閉時,就會把當前執行緒上繫結的session 關閉,並刪除
【6】 詳解Query 物件
(1)可以使用這個物件,實現分頁顯示的功能。(2)查詢一條結果。 注意: 返回的結果只能是 一條,否則會報錯。