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的创建和释放,只需要处理关心的业务逻辑即可。

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

  1. Spring与Hibernate集成中的Session问题

    主要讨论Spring与Hibernate集成中的session问题 1.通过getSession()方法获得session进行操作 public class Test extends Hibernat ...

  2. spring和hibernate集成事物管理配置方法

    spring+hibernate,采用声明式事务 1.声明式事务配置 * 配置SessionFactory * 配置事务管理器 * 事务的传播特性 * 那些类那些方法使用事务 2.编写业务逻辑方法 * ...

  3. Spring和Hibernate集成配置

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...

  4. Spring 与 Hibernate 集成 Transactional设置为只读

    @Transactional标签用于标记ServiceImpl使用事务,并且能够打开一个sessionFactory的session,并且打开事务. 如果在这个标签为@Transactional(pr ...

  5. Hibernate(十)--spring整合hibernate

    结构: Spring和Hibernate整合借助于HibernateTemplate applicationContext.xml <?xml version="1.0" e ...

  6. 【译】Spring 4 + Hibernate 4 + Mysql + Maven集成例子(注解 + XML)

    前言 译文链接:http://websystique.com/spring/spring4-hibernate4-mysql-maven-integration-example-using-annot ...

  7. Java Hour 56 Spring 和 Hibernate 的集成

    上一章节我们完成了一个简单的Spring 的试验品,这章要让Spring 上战场了,不要慌,步骤都是一样的. Spring 对 Hibernate 的支持是很多方面的,第一个战场是SessionFac ...

  8. Spring第12篇—— Spring对Hibernate的SessionFactory的集成功能

    由于Spring和Hibernate处于不同的层次,Spring关心的是业务逻辑之间的组合关系,Spring提供了对他们的强大的管理能力, 而Hibernate完成了OR的映射,使开发人员不用再去关心 ...

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

    一.概述. Spring与Hibernate的集成在企业应用中是很常用的做法通过Spring和Hibernate的结合能提高我们代码的灵活性和开发效率,下面我就一步一步的给大家讲述Spring如何和H ...

随机推荐

  1. Deferred的那些知识

    在移动开发中的各种中,我们一定会遇到异步回调的问题,比如: 1:Css3执行动画完毕, 回调 2:Jquery Animate动画的执行完毕, 回调 3:Ajax的执行(并行.串行),回调 等等   ...

  2. UVA 10972 RevolC FaeLoN(边连通分量)

    坑了我一天的题目..跑了20ms挂了,就知道有个小毛病= = 无向图转有向图判强连通. 首先要知道什么样的无向图可以转化为强连通图?连通分量(环)自然是可以的:那么扩大范围(存在割顶),发现点连通分量 ...

  3. Azure SQL 数据库新服务级别现已正式发布

    T.K.Ranga Rengarajan   2014 年 9 月 10 日上午 11:00 我们很高兴地宣布,新的 SQL 数据库服务级被基本.标准和高级级别现已正式发布.这些服务级别中含有内置且可 ...

  4. RGB图像数据字符叠加,图像压缩(ijl库),YUV转RGB

    jackyhwei 发布于 2010-01-01 12:02 点击:3218次  来自:CSDN.NET 一些非常有用的图像格式转换及使用的源代码,包括RGB图像数据字符叠加,图像压缩(ijl库),Y ...

  5. (1)quartz集群调度机制调研及源码分析---转载

    quartz2.2.1集群调度机制调研及源码分析 原文地址:http://demo.netfoucs.com/gklifg/article/details/27090179 引言quartz集群架构调 ...

  6. Mac下配置PHP+Apache+phpMyAdmin+MySql远程链接

    最近的项目是微信公众号平台的开发,微信官方给出的Demo是PHP的,发现大部分的学习资料也是PHP,那好吧,放弃Java,来段儿PHP吧 下面说说Mac下搭建PHP环境 数据库:MySQL-5.6.2 ...

  7. K2 blackpearl 安装

    转:http://blog.csdn.net/gxiangzi/article/details/8432188 K2是国外的一款BPM引擎,基于MS的Workflow,关于它的详细介绍在我之前一片博客 ...

  8. 云计算服务模型,第 3 部分: 软件即服务(PaaS)

    英文原文:Cloud computing service models, Part 3: Software as a Service 软件即服务 (SaaS) 为商用软件提供基于网络的访问.您有可能已 ...

  9. TestNG传参的几种方式

    1. 通过parameter传参 java代码部分: import org.testng.annotations.Parameters; import org.testng.annotations.T ...

  10. 一幅图概括Android测试的方方面面

    一幅图概括Android测试的方方面面,来自网络: 另外的一些测试技巧 1,测试应用程序时,环境是很大的一个影响因素:系统时间,网络情况,异常关闭等 2,测试应用程序时,第三方嵌入程序也是有影响的.如 ...