在spring+hibernate的架构中,访问数据库有几种方法,按spring依赖注入来区分有3种,在这之前先再来了解一下spring的依赖注 入,spring主要的两大核心就是IOC(控制反转)和AOP(面向切面编程),控制反转就是控制转移,从以往由Bean去控制要调用的接口或其他资源 转移给容器,由容器来寻找并实例化要调用的接口,也可以解释成依赖注入,即在spring配置文件中把要调用的接口、设置、构造子配置给Bean。这边是 以依赖注入来区分为sessionFactory、hibernateTemplate、jdbcTemplate,本质上划分只有 hibernateTemplate和jdbcTemplate这两种。

------------------------------------------------------------------------

  一、 注入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) {

                  //通过sessionFactory来生成hibernateTemplate      

                  this.hibernateTemplate = createHibernateTemplate(sessionFactory);


           }

            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中就得用这种方面去访问存取数据了。

 

  二、注入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);

 

 

   三、注入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);

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐