1. 程式人生 > 實用技巧 >JavaWeb學習:Hibernate的API

JavaWeb學習:Hibernate的API

一、Configuration:載入配置檔案

1、載入資料庫連線配置檔案

  1.1、屬性配置檔案(hibernate.properties)  

    // 1.1.屬性檔案載入
    Configuration configuration=new Configuration();
    // 1.2.載入對映檔案
    configuration.addResource("com/marw/util/Customer.hbm.xml");    

  1.2、hibernate.cfg.xml    

Configuration configuration=new Configuration().configure();

2、載入對映配置檔案

  2.1、對屬性配置檔案(hibernate.properties)載入對映檔案

    configuration.addResource("com/marw/util/Customer.hbm.xml"); 

二、SessionFactory:內部維護了Hibernate的連線池和Hibernate的二級快取。是執行緒安全的物件。一個專案建立一個物件即可。

  配置連線池

    1、匯入jar包

    2、配置c3p0到核心配置檔案

<?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-core-5.x.Final.jar包中 org.hibernate => hibernate-configuration-3.0.dtd --> <hibernate-configuration> <session-factory> <!-- 連線資料庫基本引數 --> <property name="hibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</
property> <property name="hibernate.connection.url">jdbc:sqlserver://localhost:1433;databaseName=HibernateDB;</property> <property name="hibernate.connection.username">sa</property> <property name="hibernate.connection.password">AAA@111</property> <!-- 配置Hibernate的方言 --> <property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property> <!-- 可選配置start --> <!-- 控制檯列印sql語句 --> <property name="hibernate.show_sql">true</property> <!-- 控制檯列印sql語句 格式化--> <property name="hibernate.format_sql">true</property> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 可選配置end --> <!-- 配置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> <!-- 配置對映 --> <mapping resource="com/marw/util/Customer.hbm.xml"/> </session-factory> </hibernate-configuration>

  一個專案只建立一個SessionFactory

package com.marw.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/**
* @Title: HibernateUtils
* @Description: 
* @author: marw
* @date 2020/11/03 17:00:26
*/
public class HibernateUtils {
    private static Configuration confg;
    
    private static SessionFactory factory;
    
    static {
    confg=new Configuration().configure();
    factory=confg.buildSessionFactory();
    }
    
    public static Session openSession() {
    return factory.openSession();
    }
}
@Test
    public void demo2() {
    Session session=HibernateUtils.openSession();
    // 4.開啟事務(Hibernate版本5不用手動開啟事務,要相容版本3需要手動開啟事務)
    Transaction transaction=session.beginTransaction();
    // 5.編寫程式碼
    Customer customer=new Customer();
    customer.setCust_name("zhang");
    
    session.save(customer);
    // 6.提交事務
    transaction.commit();
    // 7.資源釋放
    session.close();
    }

三、Session:Hibernate與資料庫的連結物件。不是執行緒安全的(必須定義在方法內部,不能作為全域性變數)。與資料庫互動橋樑。

  Session中的API    

    儲存方法:

      Serializable save(Object obj);

    查詢方法:

      T get(Class c,Serializable id);

      T load(Class c,Serializable id);

    get方法和load方法的區別?

      get:立即載入,返回值為物件,查詢一個找不到的物件,返回null

      load:延遲載入,返回值為代理物件,查詢一個找不到的物件,返回ObjectNotFoundException    

    更新方法:

      void update(Object obj);

  @Test
    public void demo3() {
    Session session=HibernateUtils.openSession();
    Transaction transaction=session.beginTransaction();
    // 1.直接修改,不該修改的欄位也被修改了
    /*
     * Customer customer=new Customer(); 
     * customer.setCust_name("zhang");
     * session.update(customer);
     */
    
    // 2.先查詢,再修改,只會修改我們要修改的欄位
    Customer customer=session.get(Customer.class, 1L);
    customer.setCust_name("zhang");    
    session.update(customer);
    
    // 6.提交事務
    transaction.commit();
    // 7.資源釋放
    session.close();
    }

    刪除方法:

      void delete(Object obj);

      

  @Test
    public void demo4() {
    Session session=HibernateUtils.openSession();
    Transaction transaction=session.beginTransaction();
    // 1.直接刪除
    /*
     * Customer customer=new Customer(); 
     * customer.setCust_id("1L");
     * session.delete(customer);
     */
    
    // 2.先查詢,再刪除,如果有級聯關係使用查詢後刪除
    Customer customer=session.get(Customer.class, 2L);
    session.delete(customer);
    
    // 6.提交事務
    transaction.commit();
    // 7.資源釋放
    session.close();
    }

    儲存或更新:

      void saveOrUpdate(Object obj)    

    @Test
    public void demo5() {
    Session session=HibernateUtils.openSession();
    Transaction transaction=session.beginTransaction();
    /*
     * Customer customer=new Customer(); 
     * customer.setCust_name("lisi");
     * session.saveOrUpdate(customer);
     */
    
    Customer customer=new Customer();
    customer.setCust_id(3L);
    customer.setCust_name("wangwu");
    session.saveOrUpdate(customer);
    
    // 6.提交事務
    transaction.commit();
    // 7.資源釋放
    session.close();
    }

    查詢所有

@Test
    public void demo6() {
    Session session=HibernateUtils.openSession();
    Transaction transaction=session.beginTransaction();
    //接收HQL:Hibernate Query Language 面向物件的查詢語言
    /*
     * Query query = session.createQuery("from Customer");
     * List<Customer> list=query.list();
     * for(Customer customer : list){
     *     System.out.println(customer);
     * }
     */
    //接收SQL
    SQLQuery query=session.createSQLQuery("select * from cst_customer");
    List<Object[]> list list= query.list();
    for (Object[] objects : list) {
        System.out.println(Arrays.toString(objects));
    }
    // 6.提交事務
    transaction.commit();
    // 7.資源釋放
    session.close();
    }