【Hibernate筆記整理四】核心API

版權聲明:本文爲 小異常 原創文章,非商用自由轉載-保持署名-註明出處,謝謝!
本文網址: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();
}

04保存方法


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();
}

04修改方法


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();
}

04刪除方法


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 語言,我們一般在特別複雜的情況下才會使用到這種查詢方式。一般都會使用 HQLQBC 查詢。

@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();
}


博客中若有不恰當的地方,請您一定要告訴我。前路崎嶇,望我們可以互相幫助,並肩前行!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章