spring+hibernate架构中Dao访问数据库的几种方法
2010-08-26 19:32
585 查看
在spring+hibernate的架构中,访问数据库有几种方法,按spring依赖注入来区分有3种,在这之前先再来了解一下spring的依赖注入,spring主要的两大核心就是IOC(控制反转)和AOP(面向切面编程),控制反转就是控制转移,从以往由Bean去控制要调用的接口或其他资源转移给容器,由容器来寻找并实例化要调用的接口,也可以解释成依赖注入,即在spring配置文件中把要调用的接口、设置、构造子配置给Bean。这边是以依赖注入来区分为sessionFactory、hibernateTemplate、jdbcTemplate,本质上划分只有hibernateTemplate和jdbcTemplate这两种。
1、注入sessionFactory,在spring配置文件中,对Dao注入sessionFactory,即:
这边sessionFactory依赖注入的不是给Dao层中的类,而是给HibernateDaoSupport,见spring源文件org/springframework/orm/hibernate3/support/HibernateDaoSupport.java里面,就有sessionFactory的set、get操作:
所以在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自动自动连接、关闭,当然你也可以手动来连接、关闭,如下面采用的方法:
初学Hibernate的人对这些代码应该很熟悉,没有spring提供hibernateTemplate,在单单的Hibernate中就得用这种方面去访问存取数据了。
2、注入hibernateTemplate
这种方法本质跟上面注入sessionFactory一样,只不过再进行一层包装,这样最大的好处就是Dao中的类就不用再继承HibernateDaoSupport(在java中是单继承的,这唯一一次的继承就被HibernateDaoSupport剥夺去就岂不可惜?)不过在这之前要先要配置好hibernateTemplate,即:
再对要用到hibernateTemplate的Dao进行注入依赖,即:
在Dao层的类就要添加hibernateTemplate对象,来对应配置文件中所注入的依赖:
hibernateTemplate对数据的增删查给就跟上面的一样,即:
更新数据:hibernateTemplate().update(bo);
查询数据:hibernateTemplate().find(bo);
添加数据:hibernateTemplate().save(bo) ;
删除数据:hibernateTemplate().delete(bo);
3、注入jdbcTemplate如果对以前的jdbc的SQL还念念不忘,又对Hibernate的HQL没有好感的话,就可以采用jdbcTemplate来增删查改数据库了。在某些情况下采用jdbcTemplate还比较方便,甚至还能提高查询效率。在这之前也要像注入hibernateTemplate那样,先配置好jdbcTemplate,
如果jdbcTemplate和hibernateTemplate配置时都指向同一个dataSource,那就可以共用同一个事务了。再对要用到jdbcTemplate的Dao进行注入依赖,即:
在Dao层的类就要添加jdbctemplate对象,来对应配置文件中所注入的依赖:
现在就可以通过jdbctemplate存取数据了:查询数据:
VO要实现RowMapper接口中的mapRow方法,把结果集填充到bo里面:
这是在spring+hibernate框架中对Dao访问存取数据的方法做一个总结
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();
初学Hibernate的人对这些代码应该很熟悉,没有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+hibernate架构中Dao访问数据库的几种方法
- spring+hibernate架构中Dao访问数据库的几种方法
- spring+hibernate架构中Dao访问数据库的几种方法
- spring+hibernate架构中Dao访问数据库的几种方法
- spring+hibernate架构中Dao访问数据库的几种方法
- Spring+Hibernate DAO 持久层开发, Spring 用 Hibernate 访问数据库的三种方法.推荐使用回调
- Spring+Hibernate DAO 持久层开发, Spring 用 Hibernate 访问数据库的三种方法.推荐使用回调
- Spring+Hibernate整合框架下DAO的数据库访问方法
- spring+hibernate架设中Dao访问数据库的几种步骤
- spring+hibernate 访问数据库的方法
- 在Hibernate里面动态切换SChema实现访问不同的数据库的几种方法
- 在Hibernate里面动态切换SChema实现访问不同的数据库的几种方法
- 在Hibernate里面动态切换SChema实现访问不同的数据库的几种方法
- 在Hibernate里面动态切换SChema实现访问不同的数据库的几种方法
- 注解的力量 -----Spring 2.5 JPA hibernate 使用方法的点滴整理(六): 一些常用的数据库 注解
- hibernate在myeclipse反向工程中dao的save写不进数据库的解决方法
- hibernate在myeclipse反向工程中dao的save写不进数据库的解决方法
- 访问数据库的几种方法
- 数据库访问层中使用GenericDao和HibernateDaoSupport
- hibernate dao保存实体,提示成功,但未保存入数据库,解决方法