HibernateTemplate詳解

HibernateTemplate提供非常多的常用方法來完成基本的操作,比如通常的增加、刪除、修改、查詢等操作,Spring 2.0更增加對命名SQL查詢的支持,也增加對分頁的支持。大部分情況下,使用Hibernate的常規用法,就可完成大多數DAO對象的CRUD操作。下面是HibernateTemplate的常用方法簡介:q void delete(Object entity):刪除指定持久化實例q deleteAll(Collection entities):刪除集合內全部持久化類實例q find(String queryString):根據HQL查詢字符串來返回實例集合q findByNamedQuery(String queryName):根據命名查詢返回實例集合q get(Class entityClass, Serializable id):根據主鍵加載特定持久化類的實例q save(Object entity):保存新的實例q saveOrUpdate(Object entity):根據實例狀態,選擇保存或者更新q update(Object entity):更新實例的狀態,要求entity是持久狀態q setMaxResults(int maxResults):設置分頁的大小下面是一個完整DAO類的源代碼:public class PersonDAOHibernate implements PersonDAO{ //採用log4j來完成調試時的日誌功能private static Log log = LogFactory.getLog(NewsDAOHibernate.class); //以私有的成員變量來保存SessionFactory。private SessionFactory sessionFactory;//以私有變量的方式保存HibernateTemplateprivate HibernateTemplate hibernateTemplate = null; //設值注入SessionFactory必需的setter方法 public void setSessionFactory(SessionFactory sessionFactory){ this.sessionFactory = sessionFactory; } //初始化本DAO所需的HibernateTemplatepublic HIbernateTemplate getHibernateTemplate(){ //首先,檢查原來的hibernateTemplate實例是否還存在 if ( hibernateTemplate == null) { //如果不存在,新建一個HibernateTemplate實例 hibernateTemplate = new HibernateTemplate(sessionFactory); } return hibernateTemplate;} //返回全部的人的實例 public List getPersons() { //通過HibernateTemplate的find方法返回Person的全部實例 return getHibernateTemplate().find("from Person"); } /** * 根據主鍵返回特定實例 * @ return 特定主鍵對應的Person實例 * @ param 主鍵值 public News getNews(int personid) { return (Person)getHibernateTemplate().get(Person.class, new Integer(personid)); } /** * @ person 需要保存的Person實例 */ public void savePerson(Person person) { getHibernateTemplate().saveOrUpdate(person); } /** * @ param personid 需要刪除Person實例的主鍵 * / public void removePerson(int personid) { //先加載特定實例 Object p = getHibernateTemplate().load(Person.class, new Integer(personid)); //刪除特定實例 getHibernateTemplate().delete(p); }}使用HibernateTemplateHibernateTemplate 可將Hibernate 的持久層訪問模板化,使用HibernateTemplate 非常簡單。創建Hi bernateTemplate 實例後,注入一個SessionFactory 的引用,就可執行持久化操作。SessionFactoyr 對象可通過構造參數傳入,或通過設值方式傳入。例如://獲取Spring 上下文ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");//通過上下文獲得SessionFactorySessionFactory sessionFactory = (SessionFactory) ctx.getBean("sessionFactory") ,HibernateTemplate 提供如下三個構造函數:? HibernateTemplateO 。? HibernateTemplate(org.hibernate.SessionFactory sessionFactory)。? HibernateTemplate(org.hibernate.SessionFactory sessionFactory, boolean allowCreate) 。 第一個構造函數:構造一個默認的HibernateTemplate 實例,因此,使用HibernateTemplate實例之前,還必須使用方法setSessionFactory(SessionFactory sessionFactory)來爲HibernateTemplate 傳入SessionFactory 的引用。第二個構造函數:在構造時已經傳入SessionFactory 引用。第三個構造函數:其boolean 型參數表明,如果當前線程己經存在一個非事務性的Session ,是否直接返回此非事務性的Session 。對於在Web 應用中,通常啓動時自動加載ApplicationContext , SessionFactory 和DAD對象都處在Spring 上下文管理下。因此無須在代碼中顯式設置,可採用依賴注入解耦SessionFactory 和DAO. 其依賴關係可通過配置文件來設置 com.mysql.jdbc.Driver jdbc:mysql://wonder:3306/j2ee root pass