Spring 与 Hibernate 整合

smallbug

贡献于2013-02-19

字数:0 关键词: Spring JEE框架

1 吴 青 QQ:16910735 wuqing_bean@126.com 吴老师教学讲义 http://blog.sina.com/accpwulaoshi 忽然抚尺一下,群响毕绝。撤屏视之,一人、一桌、一椅、一扇、一抚 尺 而 已 吴老师教学讲义 2 http://shop34513748.taobao.com/ Copyright©2010 吴青版权所有 Spring 与 Hibernate 整合 前面我们学习了 Hibernate 框架,它是一个数据持久层框架。 Hibernate 大大简化 了数据持久层的访问,但使用 Hibernate 进行持久层访问时,还存在一些问题,如访问 步骤重复多,事务难以控制,以及基于 Hibernate 的 DAO 组件编写复杂等。 Spring 在 Hibernate 基础上,进一步简化了持久层讨问,其模板的操作大大降低 Hibernate 的重复操作; Spring 提供的 DAO 支持简化了 DAO 组件的开发; 1. 为什么要将 Spring 与 Hibernate 进行整合 我们在典型的三层结构的应用中,业务逻辑层需要调用数据访问层的 DAO 对数据进 行操作,业务逻辑层需要使用 DAO 对象,调用 DAO 对象的方法来完成数据访问的任务, 所以业务层是依赖于 DAO 的。为了降低业务层与数据访问层之间的耦合,也就是将业务 层与数据访问层之间进行解耦,我们可以使用接口来进行解耦。即在业务逻辑层中使用 DAO 的接口来进行编码,这样业务层就不依赖于具体的 DAO 的实现了,使用的时候再将 DAO 的具体实现对象“注入”到业务层中,这样就实现了业务层与数据访问层之间的解 耦了。 利用 Spring 的 IoC 容器,我们可以很方便的将具体的 DAO 对象“注入”到业务层 的对象中。即:在 Spring 容器中创建具体的业务对象,和具体的 DAO 对象,然后 将 DAO 对象“注入”到业务对象中。即 Spirng 的 IoC 容器解决了业务对象和 DAO 对象的创建 和维护了他们之间的依赖关系,当我们需要修改的依赖的时候,只需要修改 Spirng 的配 置即可。 既然 DAO 对象是由 SpingIoC 容器来托管的,而 DAO 需要访问数据库,如果数据 访问使用 Hibernate,那么在我们编写的 DAO 类中就必然要用到 Hibernate 中的 Session, 我们当然可以在 Spring 来创建 Hibernate 中的 session 对象,然后将 session 对象注入 到我们的DAO中。也就是说Hibernate中的session交给Spring托管了,也就是将Spring 与 Hibernate 进行了整合。 所以所谓 Spring 与 Hibernate 的整合其实就是将 Hibernate 中的 session 放到 Spring 的 Ioc 容器中交给 Sping 进行托管,Spring 再将 session“注入”到我们编写的 DAO 中。 既然 Spirng 托管了 Hibernate,我们就可以使用 Spring 的 AOP 特性很方便的对数 据访问进行事务控制了,在 Spring 中进行事务控制是一种声明式的配置,也就是说只需 要在配置文件中进行配置,不用编写代码实现就可以做到事务的控制。 吴老师教学讲义 3 http://shop34513748.taobao.com/ Copyright©2010 吴青版权所有 而且 Spring 中提供了一些类,这些类使我们对 DAO 的操作变得更加的简单,使得 我们编写 DAO 的代码更加简洁。基于上面的原因我们需要将 Spirng 与 Hibernate 进行 整合。下面的图形来表示了它们之间的关系: 2. 让 Spring 管理 Hibernate 从上图中我们可以看到 DAO 组件中需要的是 Hibernate Session,我们为 DAO 组 件注入进去的是 Hibernate SessionFactory。因为从 Hibernate SessionFactory 可以直 接获取 Session 对象 所以让 Spring 管理 Hibernate 实际上就是让 Spring 来创建 hibernate 的 SessionFactory,和维护它的生命周期。 2.1hibernate 如何工作 我们可以先回顾一下我们单独使用 Hibernate 的时候是如何使用的。下图说明了 hibernate 的使用过程 SpringIoC 容器 业务逻辑组件 DAO 接口 DAO 组件 注入 Hibernate Session Factory 注入 Hibernate Data Base 吴老师教学讲义 4 http://shop34513748.taobao.com/ Copyright©2010 吴青版权所有 2.2Spring IoC 容器中创建 sessionFactory 一旦 hibernate 处于 Spring 的管理下,hibernate 所需要的基础资源都由 Spring 提供 ,也就是需要在 Spring 的配置文件中配置 hibernate 的基础资源 在 hibernate 中我们是通过编程的方式获 SessionFactory 的,而在 spring 中提供 了一个类,这个类中封装了编程代码,所以我们不用通过编程获得 SessionFactory.这个 类是:org.springframework.orm.hibernate3.LocalSessionFactoryBean.这个类的继承 关系: Configuration 创建SessionFactory 打开Session 开始事务 持久化操作 提交事务 关闭Session 数据库连接信息 即数据源信息 映射文件信息 可以看到,要想取得 hibernate session 对象, 就得用到 sessionFactory,而创建 sessionFactory 对象又需要配置信息,即“数据库数据源信息”还有 映射文件(实体关系映射文件)的配置信息,这两个 信息交给 Configuration 对象, Configuration 对应的是配置文件 hibernate.cfg.xml 文件 吴老师教学讲义 5 http://shop34513748.taobao.com/ Copyright©2010 吴青版权所有 该类通过 sping 的 applicationContext.xml 管理。我们只需要向该类注入 Spring 所需要的数据源和 hibernate 的映射文件即可。 所以 LocalSessionFactoryBean 中需要注入两个属性: dataSource: 由 Spring 提供 dataSource,数据库连接的相关的信息 mappingResources :是一个 String 数组,值是所有的 po 映射文件。 这些信息原来是在 hibernate.cfg.xml 文件中配置的,现在这些配置都移到了 applicationcontext.xml 文件中,这样,我们就不用编写 hibernate.cfg.xml 配置文件了。 3. 动手配置 为了能理解全部过程,我们使用手工配置的方式来进行。下面是演示用数据库表: 学生表:student 数据: 考试信息表:exam 数据 3.1 新建 java 项目 新建一个 java 项目,加入 Spirng 所需的 jar 包与 hibernate jar 包。这里使用的是 spirng 的完整 jar 包 关系图 吴老师教学讲义 6 http://shop34513748.taobao.com/ Copyright©2010 吴青版权所有 3.2 创建 Spring 配置文件,配置数据源 Hibernate 需要的数据库相关的信息,由 Spring 来负责提供,所以我们在 Spring 的 applicationContext.xml 配置文件中配置数据源. 首先在 MyEclipse 的 database Explorer 透视图中新建一个数据库的连接。 在 spirng 的配置文件的 applicationContext.xml 文件中使用鼠标右键 spirngnew dataSources,可以用来配置数据源。 选择在 database Explorer 透视图中建立的数据源连接: 吴老师教学讲义 7 http://shop34513748.taobao.com/ Copyright©2010 吴青版权所有 选择 Finish 之后,在 Spring 的配置文件中就会出现如下的配置: 可以看到 MyEclipse 工具自动为我们添加的是 dbcp 连接池数据源,所以我们要检查项目 中的 jar 包中有没有 dbcp 连接池所需的 jar 包,如果没有,可以到 Spring 发行包中拷 贝,DBCP 需要如下几个 jar 包: 吴老师教学讲义 8 http://shop34513748.taobao.com/ Copyright©2010 吴青版权所有 3.3 配置 LocalSessionFactoryBean 有了数据源,就可以将数据源注入到 LocalSessionFactoryBean 中 了 , LocalSessionFactoryBean 是由 Spring 提供的类,这个类主要用于与 hibernate 进行整合, 我们需要为这个类“注入”数据源,这样 hibernate 就知道去连接哪里的数据库了。还有 hibernate 的一些属性也可以”注入”到这个对象中。 ①注入 DataSource 数据源 ②hibernate 的属性配置。它是一个 Properties 类型的属性 ③他是一个 String【】 即字符串数组类型的。这里目前还没有编写任何映射文件。 关于数据要注入的属性的类型可以参看 Spring 的 API 手册,也可以直接查看源代码。 3.4 编写映射文件,将映射文件配置到 applicationContext 中 这里省去映射文件的编写过程,配置文件如下: org.hibernate.dialect.MySQLDialect true true 吴老师教学讲义 9 http://shop34513748.taobao.com/ Copyright©2010 吴青版权所有 4. HibernateDaoSupport 到目前为止,spirng 容器中已经有了 SessionFactory,就可以利用 SessionFactory 来创建 Session 对象,然后就可以访问数据库了。我们在前面使用 Hibernate 的时候,是 利用MyEclipse工具为我们创建的HibernateSessionFactory类来取得session对象的。 而现在 Spirng 容器中已经有了 SessionFactory 了 ,那么就不需要创建象 HibernateSessionFactory 这样的辅助类了。我们只需要将 sessionFactory“注入”给我 们自己编写的 DAO 中即可。 Spring 为了简化 DAO 的编写,为我们提供了 org.springframework.orm.hibernate3.support.HibernateDaoSupport 类,我们自己编 写的 DAO 类只需要继承这个类即可。 在 HibernateDaoSupport 类中定义了 sessionFactory 属性,所以我们自己编写的 DAO 继承了 HibernateDaoSupport 之后, 就可以将前面在 Spirng 容器中定义的 SessionFactory“注入到”我们自己定义的 DAO 中 我们自己的 DAO 继承 HibernateDaoSupport 最大的好处在于,Spring 提供了 org.springframework.orm.hibernate3.HibernageTemplate,用于持久层访问。该模板 类无须打开 Session 及关闭 Session,它只需要获得 SessionFactory 的引用,就可以智能 的打开 Session,并在持久化访问结束后关闭 Session。HibernateDaoSupport 中对 HibernageTemplate 进行了封装,在 自定义的 DAO 类中通过 org.hibernate.dialect.MySQLDialect true true com/wq/po/Student.hbm.xml com/wq/po/Exam.hbm.xml 吴老师教学讲义 10 http://shop34513748.taobao.com/ Copyright©2010 吴青版权所有 getHibernateTemplate() 获得 HibernageTemplate 对象 下面是我们自己定义的 DAO 类,继承了 HibernateDaoSupport。 先定义一个 StudentDAO 接口: 再定义一个接口的实现类,并继承 HibernateDaoSupport 类,继承之后,我们就可以为它 注入 SessionFactory 了。 我们的 DAO 继承了 HibernateDaoSupport 之后,主要是在代码中使用模板对象完 成数据操作。 HibernateTemplate 常用方法: void delete(Object entity) :删除指定持久化实例 deleteAll(Collection entities) :删除集合中所有持久化类实例 find(String queryString) :根据 HQL 查询字符串来返回实例集合 findByNamedQuery(String queryName):根据命名查询返回实例集合 Object get(Class entityClass,Serializable id):根据主键加载特定持久化类的实例 save(Object entity) :保存新的实例 saveOrUpdate(Object entity) :根据实例状态,选择保存或者更新。 Update(Object entity) :更新实例的状态,要求 entity 是持久状态。 setMaxResults(int maxResults):设置分页的大小。 public interface StudentDAO { public void saveStudent(Student student); } public class StudentDAOImpl extends HibernateDaoSupport implements StudentDAO { public void saveStudent(Student student) { //取得模板对象 HibernateTemplate template=super.getHibernateTemplate(); template.save(student); } } 吴老师教学讲义 11 http://shop34513748.taobao.com/ Copyright©2010 吴青版权所有 5. 配置自己的 DAO,注入为其 SessionFactory 以下代码是 applicationContext.xml 文件中的代码: 6. 编写测试类 public static void main(String[] args) { Student stu=new Student(); stu.setStuName("张大三"); stu.setStuAge(23); ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml"); StudentDAO sdao=(StudentDAO) ctx.getBean("studentDAO"); sdao.saveStudent(stu); }

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 3 金币 [ 分享文档获得金币 ] 4 人已下载

下载文档

相关文档