上一篇介紹瞭如何在ssh環境中配置Hibernate框架,本篇介紹如何基於Hibernate框架編寫DAO
1. Hibernate框架相關接口
SessionFactory 是一個重量級對象所以通常它都是在應用程序啓動時創造然後留存爲以後使用。每個數據庫需要一個 SessionFactory 對象使用一個單獨的配置文件。所以如果你使用多種數據庫那麼你要創造多種 SessionFactory 對象。
Session
一個會話被用於與數據庫的物理連接。Session 對象是輕量級的,並被設計爲每次實例化都需要與數據庫的交互。持久對象通過 Session 對象保存和檢索。
Session 對象不應該長時間保持開啓狀態因爲它們通常情況下並非線程安全,並且它們應該按照所需創造和銷燬。
Transaction
一個事務代表了與數據庫工作的一個單元並且大部分 RDBMS 支持事務功能。在 Hibernate 中事務由底層事務管理器和事務(來自 JDBC 或者 JTA)處理。
這是一個選擇性對象,Hibernate 應用程序可能不選擇使用這個接口,而是在自己應用程序代碼中管理事務。
Query 對象
Query 對象使用 SQL 或者 Hibernate 查詢語言(HQL)字符串在數據庫中來檢索數據並創造對象。一個查詢的實例被用於連結查詢參數,限制由查詢返回的結果數量,並最終執行查詢。
2. 基於Hibernate實現DAO
package com.bs_circle.dao;
import javax.annotation.Resource;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;
import com.bs_circle.entity.User;
@Repository
public class UserDaoImpl extends HibernateDaoSupport implements UserDao{
//通過該方法注入sessionFactory對象
@Resource(name = "sessionFactory")
public void setHibernateSessionFactory(SessionFactory sessionFactory) {
super.setSessionFactory(sessionFactory);
}
public void save(User user) {
getHibernateTemplate().save(user);
}
public User findById(String id) {
return (User)getHibernateTemplate().get(User.class, id);
}
public void update(User user) {
getHibernateTemplate().update(user);
}
public User findByName(String name) {
Session session = getSession();
Query query = session.createQuery(FIND_BY_NAME_HQL);
query.setString(0, name);
User u = (User) query.uniqueResult();
return u;
}
}
注意由於Session代表與數據庫的鏈接,因此開啓後需要手動關閉,但是因爲Hibernate的延時加載特性,如果在加載前提前關閉Session會在真正需要查詢時拋出異常。方便的做法是採用事物進行統一管理@Transactional,spring在提交事物後會自動關閉數據庫鏈接。更多解決方案參考http://blog.sina.com.cn/s/blog_864f40cb01017oef.html