spring+hibernate架構中Dao訪問數據庫的幾種方法

在spring+hibernate的架構中,訪問數據庫有幾種方法,按spring依賴注入來區分有3種,在這之前先再來了解一下spring的依賴注入,spring主要的兩大核心就是IOC(控制反轉)和AOP(面向切面編程),控制反轉就是控制轉移,從以往由Bean去控制要調用的接口或其他資源轉移給容器,由容器來尋找並實例化要調用的接口,也可以解釋成依賴注入,即在spring配置文件中把要調用的接口、設置、構造子配置給Bean。這邊是以依賴注入來區分爲sessionFactory、hibernateTemplate、jdbcTemplate,本質上劃分只有hibernateTemplate和jdbcTemplate這兩種。1、注入sessionFactory
在spring配置文件中,對Dao注入sessionFactory,即:
<bean id="classDao" class="cn.jmu.data.dao.impl.ClassImpl">
<property name="sessionFactory">
   <ref local="sessionFactory" />
</property>
</bean>
這邊sessionFactory依賴注入的不是給Dao層中的類,而是給HibernateDaoSupport,見spring源文件org/springframework/orm/hibernate3/support/HibernateDaoSupport.java裏面,就有sessionFactory的set、get操作:public final void setSessionFactory(SessionFactory sessionFactory) {
   this.hibernateTemplate = createHibernateTemplate(sessionFactory);//通過sessionFactory來生成hibernateTemplate
}public final SessionFactory getSessionFactory() {
   return (this.hibernateTemplate != null ? this.hibernateTemplate.getSessionFactory() : null);
}所以在Dao層中類繼承HibernateDaoSupport,即可通過this.getHibernateTemplate()來對數據庫進行操作,
   更新數據:this.getHibernateTemplate().update(bo);
   查詢數據:this.getHibernateTemplate().find(bo);
   添加數據:this.getHibernateTemplate().save(bo) ;
   刪除數據:this.getHibernateTemplate().delete(bo);
從上面可以看出spring+hibernate的強大威力,存取數據不用像以往jdbc那樣,要寫一大串try,catch語句,還要連接數據庫,用完再關閉數據庫連接,而用一條語句就可以搞定。
這裏sessionFactory由spring自動自動連接、關閉,當然你也可以手動來連接、關閉,如下面採用的方法:
Session session=this.getHibernateTemplate().getSessionFactory().openSession();
Transaction tx=session.beginTransaction();
/*--------------查詢數據------------------------*/
String str="hql";
Query query=session.createQuery(str);
List list=query.list();
/*--------------刪除數據------------------------*/
session.load(bo,ID);
   session.delete(bo);
/*--------------添加數據------------------------*/
session.save(bo);  
/*--------------修改數據-----------------------*/
  session.load(bo,ID);
   session.update(bo); 
/*--------------end---------------------------*/
tx.commit();
session.close();
初學Hebernate的人對這些代碼應該很熟悉,沒有spring提供hibernateTemplate,在單單的Hibernate中就得用這種方面去訪問存取數據了。
2、注入hibernateTemplate
這種方法本質跟上面注入sessionFactory一樣,只不過再進行一層包裝,這樣最大的好處就是Dao中的類就不用再繼承HibernateDaoSupport(在java中是單繼承的,這唯一一次的繼承就被HibernateDaoSupport剝奪去就豈不可惜?)不過在這之前要先要配置好hibernateTemplate,即:
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
        <property name="sessionFactory">
            <ref bean="sessionFactory"/>
        </property>
    </bean>
再對要用到hibernateTemplate的Dao進行注入依賴,即:
<bean id="ClassDao" class="cn.jmu.data.dao.impl.ClassImpl">
<property name="hibernateTemplate">
   <ref bean="hibernateTemplate"/>
</property>
</bean>
在Dao層的類就要添加hibernateTemplate對象,來對應配置文件中所注入的依賴:
private HibernateTemplate hibernateTemplate;
public HibernateTemplate getHibernateTemplate() {
return hibernateTemplate;
}
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
hibernateTemplate對數據的增刪查給就跟上面的一樣,即:
   更新數據:hibernateTemplate().update(bo);
   查詢數據:hibernateTemplate().find(bo);
   添加數據:hibernateTemplate().save(bo) ;
   刪除數據:hibernateTemplate().delete(bo);
3、注入jdbcTemplate如果對以前的jdbc的SQL還念念不忘,又對Hibernate的HQL沒有好感的話,就可以採用jdbcTemplate來增刪查改數據庫了。在某些情況下采用jdbcTemplate還比較方便,甚至還能提高查詢效率。在這之前也要像注入hibernateTemplate那樣,先配置好jdbcTemplate,<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
   <property name="dataSource">
    <ref bean="dataSource" />
   </property>
</bean>如果jdbcTemplate和hibernateTemplate配置時都指向同一個dataSource,那就可以共用同一個事務了。再對要用到jdbcTemplate的Dao進行注入依賴,即:<bean id="classDao" class="cn.jmu.data.dao.impl.ClassImpl"> 
   <property name="jdbctemplate">
    <ref bean="jdbcTemplate" />
   </property>
</bean>在Dao層的類就要添加jdbctemplate對象,來對應配置文件中所注入的依賴:protected JdbcTemplate jdbctemplate;public JdbcTemplate getJdbctemplate() {
   return jdbctemplate;
}public void setJdbctemplate(JdbcTemplate jdbctemplate) {
   this.jdbctemplate = jdbctemplate;
}現在就可以通過jdbctemplate存取數據了:查詢數據:
/*------------查詢單列-------------------*/
  String SQL= "select name from table";
    List   list= jdbctemplate.queryForList(SQL);
/*------------查詢多列------------------*/
Hashtable hash = new Hashtable();
jdbctemplate.query(SQL,
     new RowCallbackHandler() {
       public void processRow(ResultSet rs) throws SQLException {
            hash.put(rs.getString(1),rs.getString(2));
      }
   });
/*----------查詢後填充到vo裏面-----------*/
String SQL="select * from table where id=?";
String[] obj = new String[1];
   obj[0] = N;
VO vo= new VO();            //這邊暫用VO來表示,VO的本質不是這樣的
List list = jdbcTemplate.query(SQL,obj,vo);
VO要實現RowMapper接口中的mapRow方法,把結果集填充到bo裏面:class VO implements RowMapper{
public Object mapRow(ResultSet rs, int index) throws SQLException {
    Bo bo = new Bo();     
   bo.setProperty(rs.getString(1));
     bo.setProperty(rs.getString(2));
     bo.setProperty(rs.getString(3));
     return bo;
    }
}/*----------------更新數據------------------*/ 
String SQL="update table set name=?";
  String[] obj=new String[1];
  obj[1]="new name"; 
jdbcTemplate.update(SQL,obj);
/*----------------刪除數據------------------*/ 
String SQL="delete from table where id='"+ID+"'";
jdbcTemplate.execute(SQL);
/*----------------添加數據------------------*/
String SQL="insert into table (property1,property2) values ('"+property1+"','"+property1+"')";
jdbcTemplate.execute(SQL);
這是在spring+hibernate框架中對Dao訪問存取數據的方法做一個總結,由於水平有限,錯誤和不足之處歡迎大家批評指正。

 

 

 

*************************************

 

================================================================================================

spring在Dao層中類繼承HibernateDaoSupport,即可通過this.getHibernateTemplate()來對數據庫進行操作,
   更新數據:this.getHibernateTemplate().update(bo);
   查詢數據:this.getHibernateTemplate().find(bo);
   添加數據:this.getHibernateTemplate().save(bo) ;
   刪除數據:this.getHibernateTemplate().delete(bo);
從上面可以看出spring+hibernate的強大威力,存取數據不用像以往jdbc那樣,要寫一大串try,catch語句,還要連接數據庫,用完再關閉數據庫連接,而用一條語句就可以搞定。
這裏sessionFactory由spring自動自動連接、關閉,當然你也可以手動來連接、關閉,如下面採用的方法:
Session session=this.getHibernateTemplate().getSessionFactory().openSession(); ......

===============================================================================================

來源:(http://blog.sina.com.cn/s/blog_4fe8c9230100in0n.html) - ssh2開發,更新單個字段_將哥_新浪博客

public void updateUser(User user) {
    this.getHibernateTemplate().saveOrUpdate(user);
 }

 

 public void updateUser(String hql) {
  Session session=this.getHibernateTemplate().getSessionFactory().openSession();

  Query query=session.createQuery(hql);
  session.beginTransaction();
  query.executeUpdate();
  session.getTransaction().commit();
  session.flush();
  session.close();
 }

來源:(http://blog.sina.com.cn/s/blog_4fe8c9230100in0n.html) - ssh2開發,更新單個字段_將哥_新浪博客

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章