1.Configuration
1.1 加載核心配置文件,
加載hibernate.properties時:Configuration configuration = new Configuration();
加載hibernate.cfg.xml時:Configuration configuration = new Configuration().configure();
1.2 加載映射文件(不過,一般映射文件都配置在核心配置文件中,該方法用少)
configuration.addResource("com/itheima/hibernate/domain/Customer.hbm.xml");
configuration.addClass(Customer.class);//實體類必須和映射文件在同一個包中才行
2.SessionFactory
SessionFactory負責管理Session,管理連接池,管理Hibernate二級緩存。是一個重量級的, 線程安全的對象.
3.session
Session是Hibernate程序與數據庫之間的橋梁。完成CRUD的操作。Session是一個單線程的對象,內部維護了Hibernate的一級緩存。
hibernate的一級緩存--->session級別的緩存
一級緩存是session級別的緩存, 同session的聲明周期一直. 一級緩存實際上是由session中的一組集合構成的.
一級緩存的主要作用: 減少對數據庫的訪問次數
執行原理: 在session中執行查詢操作時,首先會從緩存中獲取結果, 如果緩存中沒有, 則去數據庫中查詢, 並將查詢結果往緩存中存放一份; 如果緩存中有, 則直接從緩存中獲取.
一級緩存快照區: 在存放在緩存中的數據會在session一級緩存的快照區存放一份, 當數據發生變更時, 緩存中的數據會被修改, 而快照區的數據還是原來的數據, 在事務提交時, 會對比一級緩存和快照區, 如果數據不一致, 則會發送sql語句更改數據庫中數據; 如果數據一致, 則不對數據庫進行更新操作. 因此, 對於持久態的對象, 即使沒有顯示的添加update語句, 如果數據發生變化, 在提交事務時, 會自動更新數據庫.
session保存一個對象: session.save(entity);
session修改對象:session.update(entity);
session刪除對象session.delete(entity);
session查詢對象:session.get()和session.load();
get()方法和load()方法的區別
1. 加載機制不同. get方法采用的是立即加載,執行到代碼的時候,立即發送SQL語句進行查詢; 而load方法采用的延遲加載(Lazy)機制, 執行該代碼的 時候不會馬上發送SQL語句,只有真正使用該對象的時候才會發送SQL語句查詢.
2. 查詢結果不同. get方法查詢得到的是對象本生, 而load方法查詢返回的一個代理對象;
3. 查詢沒有找到時的處理應答不同, get方法返回的是null; 而load方法則會拋出異常ObjectNotFoundException;
4. Query:支持HQL查詢
獲得Query接口可以通過session.createQuery(String hql);獲得。
HQL:Hibernate Query Language。Hibernate查詢語言。語法與SQL是類似的。HQL中查詢的是對象。
public void demo2(){
//HibernateUtils為編寫的獲取創建sessionFactory和獲取session的工具類
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// HQL的基本查詢
Query query = session.createQuery("from Customer");
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}
5.Criteria:支持QBC查詢
獲得Criteria接口可以通過session.createCriteria();獲得。
QBC:Query By Criteria。條件查詢。一種更加面向對象的方式.
統計查詢
Criteria criteria = session.createCriteria(Customer.class);
criteria.setProjection(Projections.rowCount());
Long count = (Long) criteria.uniqueResult();
5.1 離線條件查詢 DetachedCriteria.
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);
detachedCriteria.add(Restrictions.like("cust_name", "%強%"));
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
List<Customer> list = criteria.list();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}
6.SQLQuery:支持SQL查詢
獲得SQLQuery接口可以通過session.createSQLQuery();獲得。
SQLQuery:通過SQL語句進行查詢。
