版權聲明:本文爲 小異常 原創文章,非商用自由轉載-保持署名-註明出處,謝謝!
本文網址:https://blog.csdn.net/sun8112133/article/details/106151400
文章目錄
本篇博客主要講解 Hibernate 中的 核心 API。
一、Configuration(配置類)
該類主要用來對 Hibernate 進行配置,以及啓動,它是啓動 Hibernate 時所遇到的第一個類。它有兩個作用:
1、加載核心配置文件
1)屬性配置文件(hibernate.properties)
通過下面的語句就能加載 屬性配置文件。
Configuration cfg = new Configuration();
2)XML 配置文件(hibernate.cfg.xml)
通過下面的語句就能加載 XML 配置文件。
Configuration cfg = new Configuration().configure();
2、加載映射文件
如果是 XML 配置文件,則加載核心配置文件的時候就能加載映射文件;如果是 屬性配置文件 則必須手動加載映射文件。
// 手動加載映射
cfg.addResource("com/demo/domain/Customer.hbm.xml");
二、Session(數據庫連接類)
該類主要負責執行被持久化類的 CRUD 操作。它代表的是 Hibernate 與數據庫的連接對象,它是與數據庫交互的橋樑,Session 類是線程不安全的。而線程不安全的類不能把它定義成全局變量,必須要放在方法內。該類有以下幾個常用方法:
1、保存方法(save())
1)save() 方法
返回的是一個序列化的 id,也就是保存到數據庫中的 id。
Serializable save(Object obj);
2)測試
@Test
// 保存客戶
public void demo1() {
Session session = HibernateUtils.openSession(); // HibernateUtils是自己封裝的工具類,從中獲取 Session 對象
Transaction transaction = session.beginTransaction();
Customer customer = new Customer();
customer.setCust_name("五五");
Serializable id = session.save(customer);
System.out.println(id); // 比如保存的id是5,就返回5
transaction.commit();
session.close();
}
2、查詢方法(get()、load())
1)get() 方法
T get(Class c, Serializable id);
2)load() 方法
T load(Class c, Serializable id);
3)get() 方法和 load() 方法的區別?
- get() 方法
- 採用的是立即加載,執行到這行代碼的時候,就會馬上發送 SQL 語句去查詢;
- 查詢後返回的是真實對象本身;
- 查詢一個找不到的對象的時候,返回
null
。
- load() 方法
- 採用的是延遲加載(也叫 lazy 懶加載),執行到這行代碼的時候,不會發送 SQL 語句,當真正使用這個對象的時候纔會發送 SQL 語句;
- 查詢後返回的是代理對象。javassist-3.18.1-GA.jar 利用 javassist 技術產生的代理;
- 查詢一個找不到的對象的時候,返回
ObjectNotFoundException
。
4)測試
@Test
// 查詢
public void demo2() {
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
// 使用get方法查詢
// Customer c = session.get(Customer.class, 1L); // 這裏就會發送SQL語句了
// System.out.println(c);
// 使用load方法查詢
Customer c = session.load(Customer.class, 1L);
System.out.println(c); // 運行到這行代碼纔會發送SQL語句
transaction.commit();
session.close();
}
3、修改方法(update())
1)update() 方法
void update(Object obj);
2)測試
@Test
// 修改操作
public void demo3() {
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
// 直接創建對象,進行修改
// Customer c = new Customer();
// c.setCust_id(1L);
// c.setCust_name("李四");
// session.update(c);
// 先查詢,再修改(推薦)
Customer c = session.get(Customer.class, 1L);
c.setCust_name("李四");
session.update(c);
transaction.commit();
session.close();
}
4、刪除方法
1)delete() 方法
void delete(Object obj);
2)測試
@Test
// 刪除操作
public void demo4() {
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
// 直接創建對象,刪除
// Customer c = new Customer();
// c.setCust_id(1L);
// session.delete(c);
// 先查詢再刪除(推薦 )-->可以級聯刪除
Customer c = session.get(Customer.class, 1L);
session.delete(c);
tx.commit();
session.close();
}
5、保存或更新
1)saveOrUpdate() 方法
一旦設置了 id,它就會認爲要執行更新操作了。
void saveOrUpdate(Object ob);
2)測試
@Test
// 保存或更新
public void demo5() {
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
// 保存
// Customer c = new Customer();
// c.setCust_name("張三");
// session.saveOrUpdate(c);
// 更新
Customer c = new Customer();
c.setCust_id(3L);
c.setCust_name("李四");
session.saveOrUpdate(c);
tx.commit();
session.close();
}
6、查詢所有
1)createQuery() 方法
用於接收 HQL 語言。
HQL:全稱是 Hibernate Query Language,Hibernate 查詢語言,也叫 面向對象的查詢語言 ,關於 HQL 語言在後續博客會專門進行講解。
Query createQuery(String str);
2)createCriteria() 方法
用於 QBC 查詢。接收一個類作爲參數。
QBC 查詢(Query By Criteria,條件查詢),它是一種更加面向對象的查詢方式。通過調用簡單的方法,就能實現查詢,關於 QBC 查詢在後續博客會專門進行講解。
Criteria createCriteria(Class clazz);
2)createSQLQuery() 方法
用於接收 SQL 語言。
SQLQuery createSQLQuery(String str);
3)測試
@Test
// 查詢所有
public void demo6() {
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
// 接收HQL
Query query = session.createQuery("from Customer");
List<Customer> list = query.list();
for (Customer c : list) {
System.out.println(c);
}
// 接收SQL
SQLQuery sqlQuery = session.createSQLQuery("select * from cst_customer");
List<Object[]> list2 = sqlQuery.list();
for (Object[] arr : list2) {
System.out.println(Arrays.toString(arr));
}
tx.commit();
session.close();
}
三、SessionFactory(Session 工廠)
該類主要負責初始化 Hibernate,它充當數據存儲源的代理,並負責創建 Session 對象,它使用的設計模式是工廠模式。它是重量級對象,創建比較耗時,所以一般情況一個項目只需要創建一個 SessionFactory 就夠了。
SessionFactory 是線程安全的,它的內部維護了 Hibernate 的連接池和 Hibernate 的二級緩存(關於緩存知識後續博客會有講解)。
1、配置連接池(瞭解)
在 SSH 整合時,配置連接池會交給 Spring 進行管理,所以不需要在 Hibernate 上配置,這塊內容簡單瞭解即可。
這裏的連接池就以 C3P0 爲例進行簡單介紹,C3P0 的 jar 包在lib/optional/c3p0
目錄中。如果是使用 Maven 的小夥伴可直接添加下面的依賴信息即可:
<!-- C3P0 依賴 --> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> </dependency>
在 Hibernate 中的配置信息如下:
<!-- 配置C3P0連接池 -->
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<!--在連接池中可用的數據庫連接的最少數目 -->
<property name="c3p0.min_size">5</property>
<!--在連接池中所有數據庫連接的最大數目 -->
<property name="c3p0.max_size">20</property>
<!--設定數據庫連接的過期時間,以秒爲單位,
如果連接池中的某個數據庫連接處於空閒狀態的時間超過了timeout時間,就會從連接池中清除 -->
<property name="c3p0.timeout">120</property>
<!--每3000秒檢查所有連接池中的空閒連接 以秒爲單位-->
<property name="c3p0.idle_test_period">3000</property>
四、Transaction(事務類)
該類主要負責管理 Hibernate 中的事務。
注意: 如果沒有配置 C3P0 或其他連接池,是可以不用手動開啓事務和提交事務的,因爲它內置的連接池會自動開啓和提交。但是在 Hibernate 3.X 中是不會自動提交事務的。所以在 5.X 中爲了更好的兼容 3.X 的代碼,最好寫上開啓事務和提交事務的代碼。關於事務的常用方法有:
commit()
:提交事務rollback()
:回滾事務
// 開啓事務
Transaction tx = session.beginTransaction();
// 提交事務
tx.commit();
五、Query(HQL 查詢)
該接口主要負責 HQL 查詢,它用於接收 HQL 語言,來查詢多個對象。它是通過 Session 類中的
createQuery()
方法獲得的。
@Test
// Query
public void demo1() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// 通過Session獲得Query接口
// 簡單查詢
// String hql = "from Customer"; // Customer 類名
// 條件查詢
// String hql = "from Customer where cust_name like ?";
// 這裏的cust_name是Customer類的屬性
// 設置條件
// query.setParameter(0, "張%"); // 這裏只能寫%
// 分頁查詢
String hql = "from Customer";
Query query = session.createQuery(hql);
// 設置分頁
query.setFirstResult(0); // 從第1條記錄開始
query.setMaxResults(3); // 每頁顯示3條記錄
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}
六、Criteria(QBC 查詢)
該接口主要負責 QBC 查詢。
@Test
// Criteria
public void demo2() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// 通過session獲得Criteria
Criteria criteria = session.createCriteria(Customer.class);
// 簡單查詢
// List<Customer> list = criteria.list();
// 條件查詢
// add(Restrictions.like(屬性名, 屬性值)) 這裏只能寫%
// criteria.add(Restrictions.like("cust_name", "王%"));
// MatchMode.START:在前面(XX%)、END:在後面(%XX)、ANYWHERE:在中間(%XX%)
// criteria.add(Restrictions.like("cust_name", "王", MatchMode.ANYWHERE));
// 分頁查詢
criteria.setFirstResult(0); // 從第1條記錄開始
criteria.setMaxResults(3); // 每頁顯示3條記錄
List<Customer> list = criteria.list();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}
七、SQLQuery(SQL 查詢)
該接口主要負責 SQL 查詢,它用於接收 SQL 語言,我們一般在特別複雜的情況下才會使用到這種查詢方式。一般都會使用 HQL 或 QBC 查詢。
@Test
public void demo3() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
SQLQuery sqlQuery = session.createSQLQuery("select * from cst_customer");
// List<Object[]> list = sqlQuery.list();
// for (Object[] objs : list) {
// System.out.println(Arrays.toString(objs));
// }
sqlQuery.addEntity(Customer.class);
List<Customer> list = sqlQuery.list();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}