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