SSH框架之Hibenate
阿新 • • 發佈:2018-12-18
Hibernate基礎
原理:
1.通過Configuration().configure();讀取並解析hibernate.cfg.xml配置檔案
2.由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.xml"/>讀取並解析對映資訊
3.通過config.buildSessionFactory();//建立SessionFactory
4.sessionFactory.openSession();//開啟Sesssion
5.session.beginTransaction();//建立事務Transation
6.persistent operate持久化操作
7.session.getTransaction().commit();//提交事務
8.關閉Session
9.關閉SesstionFactory
為什麼要用:
1. 對JDBC訪問資料庫的程式碼做了封裝,大大簡化了資料訪問層繁瑣的重複性程式碼。
2. Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工作
3. hibernate使用Java反射機制,而不是位元組碼增強程式來實現透明性。
4. hibernate的效能非常好,因為它是個輕量級框架。對映的靈活性很出色。它支援各種關係資料庫,從一對一到多對多的各種複雜關係。
public class UserDaoImpl implements UserDao{
@Override
public void insertUser(User u) {
// 1.載入配置檔案
//預設載入Hibernate.cfg.xml檔案 如果核心配置檔案被修改位置 或 改名字
// Configuration cfg = new Configuration().configure("hibernate.cfg.xml");
//
// 2.建立sessionFactory
// SessionFactory factory = cfg.buildSessionFactory();
//
// 3.開啟session
//瞬時態
// Session session = factory.openSession();
// 4.開啟事務
Transaction tx = session.beginTransaction();
// 5.Session的CUID
//持久態
// session.save(u);
session.update(u);
// session.delete(u);
// 6.事務的提交
//遊離態
// 7.關閉資源
session.close();
}
}
1, 物件狀態: Hibernate將實體類物件分為三種狀態
一 、 臨時(瞬時)狀態:
建立物件 --> session管理物件 之間的狀態
特點:
不被session管理
不與資料庫表 列對應
二 、持久化狀態:
Session管理 --> 事務提交
Session.save(user);//持久化
特點:
被session 管理
與資料庫表 列對應
三 、遊離(脫管)狀態:
事務提交以後-->消亡
特點:
不被session管理
與資料庫表 列相對應
2,SessionFactory 是否需要關閉????
不需要,SessionFactory的建立耗費資源和記憶體
3,
針對於查詢而言,是不需要進行事務的處理的
Hibernate提供兩種方式:
Get
Load
Get 與 load 區別:
查詢時間不同
- get方法查詢時是立即載入(執行get方法後,立即向資料庫傳送sql語句查詢回資料)
- load方法查詢時才用的是延時載入(執行load方法時,並沒有向資料庫傳送sql語句查詢資料,而是返回一個代理物件。load方法是在第一次獲取代理物件中,非主鍵的屬性時,才傳送sql語句進行查詢)
- 當根據所給主鍵,查不到資料時, get方法 返回 null
- load方法 拋異常
- 一級快取 是session級別快取
- 特點:自動開啟,不能關閉
- 當開啟一級快取時,先去session物件中查詢資料,如果沒有查詢到,則去資料庫取值,將取出來的資料先放到session中,再放到物件中;當再有查詢時,先去session查詢如果查詢到,則直接取值,而不需要去資料庫中取值;這樣減少的資料庫的連線數,並提高效率。
- 如何清除快取:
- session.flush() 清session的快取,把資料同步到資料庫中
- 如果session中的物件,與資料庫中的不一致,就再次查詢
- session.clear() 清session的快取,資料不會同步到資料庫中
- 直接從session中清除
- session.evict(user) 把指定物件從session的快取中清除,資料不會同步到資料庫中
- 二級快取
- sessionFactory級別的
- 資料是所有Session共享的
- 什麼樣的資料放入到二級快取中?
- 查詢多
- 少增刪改
- 使用:
- 匯入快取的jar包 --> ehcache-1.2.3.jar
- 在src下放入快取的策略
- 將..\project\cache-ehcache\src\test\resources\ehcache.xml複製到src下
- 二級快取需要手動開啟
- 在核心配置檔案中配置:
- 指定物件放入到二級快取中
- 方式一:在配置檔案中配置:<class-cache usage="read-only" class="com.entity.User"/>
- 方式二:在對映檔案中配置:<cache usage="read-only"/>
- 指定快取代理商
- <!-- hibernate3的二級快取配置 -->
- <!-- hibernate4的二級快取配置 -->
- 禁用快取
- 方式一:<property name="hibernate.cache.use_second_level_cache">false</property>
- 方式二:session.setCacheMode(CacheMode.IGNORE); // 設定快取模式:禁止一級快取和二級快取之間進行資料互動
- 快取配置檔案:
- <diskStore path="java.io.tmpdir"/><!-- 快取物件存在磁碟上路徑 -->
- 快取規則:
- maxElementsInMemory 記憶體中最多快取多少個物件
- timeToIdleSeconds 最大空閒時間(秒)
- timeToLiveSeconds 最大存活時間
- overflowToDisk 記憶體中數量超過規定時,是否把物件存到磁碟上
- eternal 是否是永久的
- 案例:
- <defaultCache
- maxElementsInMemory="10000"
- eternal="false"
- timeToIdleSeconds="120"
- timeToLiveSeconds="120"
- overflowToDisk="true"
- 快取注意:
- 一級快取和二級快取都只儲存物件,不會儲存欄位的結果集
- get、load、iterate方法支援一級和二級快取,但list方法不支援
- 三級快取(查詢快取)
- 基本步驟
- 在配置檔案中,配置開啟查詢快取:<property name="hibernate.cache.use_query_cache">true</property>
- 通過程式碼設定啟用查詢快取:query.setCacheable(true);
- 注意:只有list方法支援查詢快取,iterate方法不支援查詢快取