Spring和Hibernate集成的HibernateTemplate的一些常用方法总结

1:get/load存取单条数据

  1. public Teacher getTeacherById(Long id) {
  2. return (Teacher)this.hibernateTemplate.get(Teacher.class, id);
  3. }
  4. public Teacher getTeacherById(Long id) {
  5. return (Teacher)this.hibernateTemplate.load(Teacher.class, id);
  6. }

2:find/iterate查询操作

  1. public Iterator getTeachersByAge(int age) {
  2. Iterator iterator = null;
  3. //使用find方法
  4. List list = (List)this.hibernateTemplate().find("from Teacher t where t.age>?", new Integer(age));
  5. iterator = list.iterator();
  6. //使用iterator方法
  7. iterator = this.hibernateTemplate().iterate("from Teacher t where t.age>?", new Integer(age));
  8. return iterator;
  9. }

find和iterato的区别主要是iterate采用了N+1次查询,对于大批量查询,比如查询10000条记录,那么iterate就要执行10000+1次查询,find和iterate应根据具体的实际

情况来使用,对于频繁的写操作对象,应使用find查询,而对于一些只读的数据对象,应使用iterate操作,因为iterate操作使用了Hibernate的缓存机制

3:save/update/saveOrUpdate/delete 保存/更新/删除操作

  1. public void save(Teacher teacher) {
  2. this.hibernateTemplate.save(teacher);
  3. }
  1. public void update(Teacher teacher) {
  2. this.hibernateTemplate.update(teacher);
  3. }
  1. public void update(Teacher teacher) {
  2. this.hibernateTemplate.saveOrUpdate(teacher);
  3. }
  1. public void update(Teacher teacher) {
  2. this.hibernateTemplate.delete(teacher);
  3. }

4:bulkUpdate批量删除或者更新

bulkUpdate提供了批量删除和更新,直接转换为相应的update/delete SQL进行批量删除和更新

  1. public void batchDelete(String name, int age) {
  2. this.hibernateTemplate.bulkUpdate("delete Teacher where name=? and age = ?", new Object[]{name, age});
  3. }
  1. public void batchDelete(String name, String newName) {
  2. this.hibernateTemplate.bulkUpdate("update Teacher set name=? where name=?", new Object[]{newName, name});
  3. }

此时要注意的一个问题是,使用bulkUpdate操作,必须手工清除相关对象在Hibernate中的缓存(包括一级缓存和二级缓存)

5:execute核心方法

  1. public Object execute(HibernateCallBack action, boolean exposeNativeSession) throws DataAccessException {
  2. //获取一个Session
  3. Session session = getSession();
  4. //当前session是否在事务中
  5. boolean existingTransaction = SessionFactoryUtils.isSessionTransactional(session, getSessionFactory());
  6. FlushMode previousFlushMode = null;
  7. try {
  8. previousFlushMode = applyFlushMode(session, existingTransaction); //应用flush模式
  9. enableFilters(session);
  10. //暴露给action的session
  11. Session sessionToExpose = (exposeNativeSession? session: createSessionProxy(session));
  12. //执行action
  13. Object result = action.doInHibernate(sessionToExpose);
  14. flushIfNecessary(session, existingTransaction);
  15. return result;
  16. } catch(HibernateException ex) {
  17. throw convertHibernateAccessException(ex);
  18. } catch(SQLException ex) {
  19. throw convertJdbcAccessException(ex);
  20. } catch(RuntimeException ex) {
  21. throw ex;
  22. } finally {
  23. //如果session在事务中,则不关闭session
  24. if(existingTransaction) {
  25. disableFilters(session);
  26. if(previousFlushMode != null) {
  27. session.setFlushMode(previousFlushMode);
  28. }
  29. } else {
  30. //释放session
  31. SessionFactoryUtils.releaseSession(session, getSessionFactory());
  32. }
  33. }
  34. }

*HibernateCallBack,一般用来实现特定的业务逻辑

*exposeNativeSession:是一个布尔值,要暴露给HibernateCallBack实际的session对象,而不是一个代理过的对象

6:一般情况下,只有HIberateTemplate提供的方法不能满足要求时才使用execute方法,它的使用情况如下所示,

  1. public void createDatabaseSchema() throws DataAccessException {
  2. HibernateTemplate hibernateTemplate = new HibernateTemplate(this.sessionFactory);
  3. //调用HibernateTempalte的execute方法
  4. hibernateTemplate.execute(new HibernateCallback() {
  5. public Object doInHibernate(Session session) throws HibernateException, SQLException {  //
    实现HibernateCallback的doInHibernate方法
  6. //具体实现
  7. Connection conn = session.connection();
  8. final Dialect dialect = Dialect.getDialect(configuration.getProperties);
  9. String[] sql = configuration.generateSchemaCreationScript(dialect);
  10. executeSchemaScript(conn, sql);
  11. }
  12. });
  13. }

使用execute方法的重点是实现
HibernateCallback的doInHibernate方法,它会传递一个Session实例,可以使用此Session实例操作数据库,由此
看出execute方法的好处是应用程序不用关心session的创建和释放,只需要处理关心的业务逻辑即可。

时间: 2024-11-08 17:26:20

Spring和Hibernate集成的HibernateTemplate的一些常用方法总结的相关文章

Hibernate(十)--spring整合hibernate

结构: Spring和Hibernate整合借助于HibernateTemplate applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-ins

菜鸟学习Spring——60s学会Spring与Hibernate的集成

一.概述. Spring与Hibernate的集成在企业应用中是很常用的做法通过Spring和Hibernate的结合能提高我们代码的灵活性和开发效率,下面我就一步一步的给大家讲述Spring如何和Hibernate集成的. 二.代码演示. 导入Hibernate的jar包 Hibernate-3.2/lib/*.jar Hibernate-3.2/hibernate3.jar 还有导入Spring的相关jar包 我用的数据库是MySql所以要导入MySql的驱动jar包: mysql-conn

基于注解的struts2+spring+hibernate集成

applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.spri

hibernateTemplate不建议在Spring与Hibernate整合中使用

HibernateTemplate类属于spring框架中的类 :org.springframework.orm.hibernate3.HibernateTemplate HibernateTemplate类目前Hibernate4不支持此类,只支持到Hibernate3,而且在SH整合过程中,如果DaoImpl采用Hibernate实现方法,如果采用Hibernate原声的SessionFactory,即使不采用Spring,原声的SessionFaction同样可以使用,将有利于Dao是可以

Spring + Spring MVC + Hibernate项目开发集成(注解)

在自己从事的项目中都是使用xml配置的方式来进行的,随着项目的越来越大,会发现配置文件会相当的庞大,这个不利于项目的进行和后期的维护.于是考虑使用注解的方式来进行项目的开发,前些日子就抽空学习了一下.在网上也查询了很多使用注解来搭建开发框架的文章,但是有一个问题就是,使用更新的软件版本会出错.这里我将使用最新的Spring,Hibernate来进行框架的搭建,经过测试,顺利运行.分享旨在与大家一起分享学习,共同进步,有不足之处,望不吝赐教,谢谢! 本项目使用maven构建,采用Spring +

Spring对Hibernate事务管理【转】

在谈Spring事务管理之前我们想一下在我们不用Spring的时候,在Hibernate中我们是怎么进行数据操作的.在Hibernate中我们每次进行一个操作的的时候我们都是要先开启事务,然后进行数据操作,然后提交事务,关闭事务,我们这样做的原因是因为Hibernate默认的事务自动提交是false,他是需要我们人为的手动提交事务,假如你不想每次都手动提交事务的话,你可以在hibernate.cfg.xml我文件中把它设置为事务自动提交: <property name="hibernate

Spring+Struts+Hibernate 简介(转)

http://blog.csdn.net/slnqnd/article/details/1772910/ Struts2.0 +Hibernate 3.2 +Spring 2.0 一.        Struts 1.定义 它是使用 servlet 和 JavaServer Pages 技术的一种 Model-View-Controller 实现, 可帮助您控制Web 项目中的变化并提高专业化水平.“模型-视图-控制 器”(MVC) 就是用来帮助您控制变化的一种设计模式.MVC 减弱了业务逻辑接

Spring对Hibernate事务管理

谈Spring事务管理之前我们想一下在我们不用Spring的时候,在Hibernate中我们是怎么进行数据操作的.在Hibernate中 我们每次进行一个操作的的时候我们都是要先开启事务,然后进行数据操作,然后提交事务,关闭事务,我们这样做的原因是因为Hibernate默认的事务自 动提交是false,他是需要我们人为的手动提交事务,假如你不想每次都手动提交事务的话,你可以在hibernate.cfg.xml我文件中把它设置 为事务自动提交: <property name="hiberna

Spring对Hibernate的session生效期(事物提交管理)介绍

在Hibernate中我们每次进行一个操作的的时候我们都是要先开启事务,然后进行数据操作,然后提交事务,关闭事务,这样做的原因是因为Hibernate默认的事务自动提交是false,它是需要人为的手动提交事务,假如你不想每次都手动提交事务的话,你可以在hibernate.cfg.xml我文件中把它设置为事务自动提交: <propertyname="hibernate.connection.autocommit">true</property> 当我们Spring