- 浏览: 257278 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
zoukaiwolai:
...
Java 16进制字符串与2进制字符串相互转换 -
sooxin:
j2ee的事务对连接有自己的管理机制,包括建立和关闭。没进j2 ...
c3p0 spring 包没进事务管理,连接池就不能释放 -
sooxin:
mina 采用一种NIO通信,底层的连接机制没有具体研究过,但 ...
转 Mina框架在项目中的使用 -
tywo45:
写得很好,希望博主把格式调一下!
Tomcat性能参数设置介绍 -
freecode:
采用了cp30,项目中出现很多未关闭的连接,一直在找原因.
c3p0 spring 包没进事务管理,连接池就不能释放
作者:宫生文 王宁出处:计算机与信息技术
摘要 在Java技术中有许多方法可以对数据进行持久化,持久层也是Java应用程序中最重要的部分之一。本文在分析了3种持久层主流解决方案的基础上,介绍了O-R映射开源项目Hibernate,并介绍了在Web应用开发中怎样配置Hibernate的环境,并使用它建立一个应用。
关键字 hibernate,数据持久化,JDBC, EJB,JDO
数据持久层简介
J2EE的三层结构是指表示层(Presentation),业务逻辑层(Business Logic)以及基础架构层(Infrastructure),这样的划分非常经典,但是在实际的项目开发法中,开发者通常对三层结构进行扩展来满足一些项目的具体要求,一个最常用的扩展就是将三层体系扩展为五层体系,即表示层(Presentation),控制/中介层(Controller/Mediator)、领域层(Domain),数据持久层(Data Persistence)和数据源层(Data Source)。它其实是在三层架构中增加了两个中间层。控制/中介层位于表示层和领域层之间,数据持久层位于领域层和基础架构层之间。由于对象范例和关系范例这两大领域之间存在“阻抗不匹配”,所以把数据持久层单独作为J2EE体系的一个层提出来的原因就是能够在对象-关系数据库之间提供一个成功的企业级映射解决方案,尽最大可能弥补这两种范例之间的差异。
三种持久层主流解决方案
1、JDBC
许多开发者用JDBC进行数据库程序的开发。此中方式很多情况下都使用DAO模式,采用SQL进行查询。虽然用此方式可以使应用程序代码与具体的数据库厂商和数据库位置无关,不过JDBC是低级别的数据库访问方式,JDBC并不支持面向对象的数据库表示。JDBC数据库表示完全围绕关系数据库模型。在大型应用程序的DAO中书写这样的代码,维护量是非常大的。
2、EJB
在J2EE的规范中,为EJB定义了两种持久化的解决方案:一种是BMP,另一种是CMP。其中CMP不需要将SQL语句加入到代码中。目前,在采用J2EE的应用中,EJB CMP方式得到了广泛应用。更加引人注意的是,随着EJB规范的发展,CMP也包含了一些高级关系的内容。但是,CMP的使用比较复杂,对很多开发人员来说比较难以掌握。而且,不是在所有的情况下都适合在系统中采用EJB,而且想要非常清楚的了解EJB规范也是非常费时的。在用EJB编码前,先要让专家理解API,然后需要了解每一个容器部署时所要关注的技术。此外,许多情况下商用容器的性能和支持也不是很好。
3、JDO
JDO是一个存储java对象的规范,JDO规范1.0的提出可以使你将精力集中在设计Java对象模型,然后在企业应用软件架构的不同层面中存储传统的Java对象(Plain Old Java Objects,简称POJOs),采用JDOQL语言进行SQL操作。一些公司(包括sun)企图根据JDO规范进行设计并实现JDO产品,然而他们都不能很好的进行实现,并且性能优化上比较差。
数据持久层新的解决方案Hibernate
1、Hibernate介绍
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了轻量级的对象封装,使Java程序员可以随心所欲的使用对象编程思维来操纵数据库。它不仅提供了从Java类到数据表之间的映射,也提供了数据查询和恢复机制。相对于使用JDBC和SQL来手工操作数据库, Hibernate可以大大减少操作数据库的工作量。 另外Hibernate可以利用代理模式来简化载入类的过程,这将大大减少利用Hibernate QL从数据库提取数据的代码的编写量,从而节约开发时间和开发成本Hibernate可以和多种Web服务器或者应用服务器良好集成,如今已经支持几乎所有的流行的数据库服务器。
2、Hibernate原理
Hibernate技术本质上是一个提供数据库服务的中间件。它的架构如图1所示:
关键字 hibernate,数据持久化,JDBC, EJB,JDO
数据持久层简介
J2EE的三层结构是指表示层(Presentation),业务逻辑层(Business Logic)以及基础架构层(Infrastructure),这样的划分非常经典,但是在实际的项目开发法中,开发者通常对三层结构进行扩展来满足一些项目的具体要求,一个最常用的扩展就是将三层体系扩展为五层体系,即表示层(Presentation),控制/中介层(Controller/Mediator)、领域层(Domain),数据持久层(Data Persistence)和数据源层(Data Source)。它其实是在三层架构中增加了两个中间层。控制/中介层位于表示层和领域层之间,数据持久层位于领域层和基础架构层之间。由于对象范例和关系范例这两大领域之间存在“阻抗不匹配”,所以把数据持久层单独作为J2EE体系的一个层提出来的原因就是能够在对象-关系数据库之间提供一个成功的企业级映射解决方案,尽最大可能弥补这两种范例之间的差异。
三种持久层主流解决方案
1、JDBC
许多开发者用JDBC进行数据库程序的开发。此中方式很多情况下都使用DAO模式,采用SQL进行查询。虽然用此方式可以使应用程序代码与具体的数据库厂商和数据库位置无关,不过JDBC是低级别的数据库访问方式,JDBC并不支持面向对象的数据库表示。JDBC数据库表示完全围绕关系数据库模型。在大型应用程序的DAO中书写这样的代码,维护量是非常大的。
2、EJB
在J2EE的规范中,为EJB定义了两种持久化的解决方案:一种是BMP,另一种是CMP。其中CMP不需要将SQL语句加入到代码中。目前,在采用J2EE的应用中,EJB CMP方式得到了广泛应用。更加引人注意的是,随着EJB规范的发展,CMP也包含了一些高级关系的内容。但是,CMP的使用比较复杂,对很多开发人员来说比较难以掌握。而且,不是在所有的情况下都适合在系统中采用EJB,而且想要非常清楚的了解EJB规范也是非常费时的。在用EJB编码前,先要让专家理解API,然后需要了解每一个容器部署时所要关注的技术。此外,许多情况下商用容器的性能和支持也不是很好。
3、JDO
JDO是一个存储java对象的规范,JDO规范1.0的提出可以使你将精力集中在设计Java对象模型,然后在企业应用软件架构的不同层面中存储传统的Java对象(Plain Old Java Objects,简称POJOs),采用JDOQL语言进行SQL操作。一些公司(包括sun)企图根据JDO规范进行设计并实现JDO产品,然而他们都不能很好的进行实现,并且性能优化上比较差。
数据持久层新的解决方案Hibernate
1、Hibernate介绍
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了轻量级的对象封装,使Java程序员可以随心所欲的使用对象编程思维来操纵数据库。它不仅提供了从Java类到数据表之间的映射,也提供了数据查询和恢复机制。相对于使用JDBC和SQL来手工操作数据库, Hibernate可以大大减少操作数据库的工作量。 另外Hibernate可以利用代理模式来简化载入类的过程,这将大大减少利用Hibernate QL从数据库提取数据的代码的编写量,从而节约开发时间和开发成本Hibernate可以和多种Web服务器或者应用服务器良好集成,如今已经支持几乎所有的流行的数据库服务器。
2、Hibernate原理
Hibernate技术本质上是一个提供数据库服务的中间件。它的架构如图1所示:
图1 |
图1显示了hibernate的工作原理,它是利用数据库以及其他一些配置文件如hibernate.properties,XML Mapping等来为应用程序提供数据持久化服务的。
Hibernate具有很大的灵活性,但同时它的体系结构比较复杂,提供了好几种不同的运行方式。在轻型体系中,应用程序提供JDBC连接,并且自行管理事务,这种方式使用了Hibernate的一个最小子集;在全面解决体系中,对于应用程序来说,所有底层的JDBC/JTA API都被抽象了,Hibernate会替你照管所有的细节。
使用Hibernate建立一个应用
1、配置Hibernate
在src 目录下创建名为hibernate.cfg.xml 的配置文件,并且将它的路径添加到应用的类路径中就可以完成Hibernate 的配置。该配置文件由Hibernate 用来连接到数据库、生成模式和获得其它特定数据库信息的属性组成。要将底层数据库内的变动反射到整个应用,只需要修改该文件内的属性值。该配置文件的内容如下:
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">COM.ibm.db2.jdbc.app.DB2Driver</property> <property name="hibernate.connection.url">jdbc:db2:cipDB</property> <property name="hibernate.connection.username">admin</property> <property name="hibernate.connection.password">rubipass</property> <property name="dialect">cirrus.hibernate.sql.DB2Dialect</property> <mapping resource="com/ubipass/cip/data/Event.hbm.xml"/> </session-factory> </hibernate-configuration> |
<!--文章页底部广告开始-->2、创建映射文档
映射文档是用来定义持久数据和在需要时保存关于对象的持久域、关联、子类和代理的XML文档。对于每个持久对象和以名字class_name.hbm.xml保存的文件来说,都要创建一个映射文档。在class_name.hbm.xml中class_name就是对象的类名,下面是Event.hbm.xml的内容。
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> <hibernate-mapping> <class name="com.ubipass.cip.Event" table="EVENTS"> <id name="id" column="uid" type="long"> <generator class="increment"/> </id> <property name="date" column="event_date" type="timestamp"/> <property name="title" column="event_title" type="string"/> </class> </hibernate-mapping> |
映射文档在应用启动时编译,它可为Hibernate 提供关于持久对象的相应类、它们的结构、它们应该映射到哪个数据库表格、以及如何映射的信息。Hibernate 也使用这些映射文档,分别利用内建设备SchemaExport和CodeGenerator来生成相应的数据库模式和stub Java类。
3、生成用于持久对象的stub Java类
在创建了映射文档之后这个任务就变得简单的多。stub类的创建使用Hibernate的内建设备 CodeGenerator ,执行一个简单的命令就可以完成。,命令的语法如下:
java -cp classpath net.sf.hibernate.tool.hbm2java.CodeGenerator
options mapping_files
它为classpath、options、和mapping_files参数提供了恰当的值。下面是通过映射文档Event.hbm.xml生成的stub java 类的部分代码。
package com.ubipass.cip public class Event { private String title; …… Event(){ } public Long getId() { return id; } private void setId(Long id) { this.id = id; } …… } |
4、生成数据库模式
要使用Hibernate的 SchemaExport 来生成数据库模式,在提交了用于参数的恰当值之后执行下列命令:
java -cp classpath net.sf.hibernate.tool.hbm2ddl.SchemaExport options mapping_files
此命令为classpath、options、和mapping_files 参数提供了恰当的值。图2显示了由映射文档生成的模式的外形。
图2 |
5、初始化并运行Hibernate的代码
要初始化和运行hibernate,需要采取以下步骤:
·在恰当的类中,初始化和组装想要的持久对象 ;
·在应用启动时使用net.sf.hibernate.cfg.Configuration 对象获取net.sf.hibernate.SessionFactory 对象 ;
·调用SessionFactory 对象上的openSession() 方法来打开net.sf.hibernate.Session ;
·保存想要的对象,关闭Session。
下面的代码显示了如何对上述的步骤进行实现:
// 初始化持久对象 Event ev = new Event(); ev.setDate("1/4/2004") ev.setTitle("Hibernate startup"); try { //开始Hibernate Configuration cfg = new Configuration().addClass(Event.class); SessionFactory sf = cfg.buildSessionFactory(); //打开 Session Session sess = sf.openSession(); } catch (HibernateException e) { e.printStackTrace(); } //保存 Product 并关闭 Session Transaction t = sess.beginTransaction(); sess.save(ev); t.commit(); sess.close(); |
总结
Hibernate是一个功能强大,可以有效地进行数据库数据到业务对象的O/R映射方案。Hibernate推动了基于普通Java对象模型,用于映射底层数据结构的持久对象的开发。通过将持久层的生成自动扩展到一个更大的范围,Hibernate 使开发人员专心实现业务逻辑而不用分心于繁琐的数据库方面的逻辑,同时提供了更加合理的模块划分的方法。
<!--文章页底部广告开始-->
发表评论
-
Java中序列化的好处及意义
2019-07-26 15:38 11081、序列化是干什么的? ... -
小学语文课堂教学三维目标的制定和落实-广安齐祥娥
2019-07-06 11:31 15教学目标是教学过程中重要的一部分,它是教学的出发点 也是教学 ... -
深入研究Servlet线程安全性问题
2019-05-11 12:27 369Servlet(Server Applet)是 ... -
Java线程池
2019-05-11 12:25 457介绍new Thread的弊端及Java四种线程池的使用, ... -
Spring 事务的配置和使用详解(包括手动对事务的控制部分)
2019-04-05 15:28 820事务隔离级别 隔离级别是指若干个并发的事务之间的隔离程度 ... -
java 数据越界奇异问题
2016-05-19 00:31 601public class yy { public stat ... -
mysql 要 innodb引擎才支持事务
2015-04-03 21:53 822如题 ---------- -
Centos系统的单网卡绑定双ip的设置
2014-07-24 16:22 1130单个网卡,一个公网,一个内网ip的设置,可以参考下面的例子。 ... -
centeros java 显示乱码问题
2014-05-31 00:44 642vi /etc/sysconfig/i18n LANG=&q ... -
SmartFoxServer项目完成总结
2013-09-16 17:41 1151总体来说,如果是想做一个比较简单的虚拟现实服务,拿sfs来做还 ... -
centos6.2安装jdk1.6.0_30
2012-03-25 03:03 31141,卸载原来的openJDK:yum -y remove ja ... -
C3P0连接池详细配置
2011-10-09 17:21 849<c3p0-config> <defaul ... -
synchronized
2011-09-27 17:13 843synchronized 关键字,代表 ... -
c3p0 spring 包没进事务管理,连接池就不能释放
2011-05-25 16:20 3387c3p0 spring 包没进事务管理,连接池就不能释放 -
com.mysql.jdbc.CommunicationsException
2011-05-11 11:10 1049异常代码** BEGIN NESTED EXCEPTION * ... -
Eclipse 快捷键
2010-10-29 12:11 787Ctrl+1 快速修复(最经典的快捷键,就不用多说了)Ctrl ... -
静态方法、单例模式区别
2010-10-28 21:54 3597关于这个问题,下面是一些同仁的观点:观点一:(单例)单例模 ... -
接口与抽象类有什么区别
2010-10-28 18:45 948abstract class和interface是Ja ... -
Java接口和Java抽象类 转
2010-10-25 17:24 871在没有好好地研习面向 ... -
as里回调函数
2010-10-16 14:44 1229/*** 回调函数 示例* 2010-8-26 9:52* @ ...
相关推荐
集成SSH框架的系统从职责上分为四层:表示层、业务逻辑层、数据持久层和域模块层,以帮助开发人员在短期内搭建结构清晰、可复用性好、维护方便的Web应用程序。其中使用Struts作为系统的整体基础架构,负责MVC的分离...
如果你真能只用一个dao解决,那么祝贺你,你得到了一个虚拟数据层(高度抽象的数据接口)。这是一个比dao更高级的存在。 欢迎大家指正 -_- 虚心求教 代码层次: bean-->dao-->service-->action 技术概述:1....
结合JSR168,这个项目可能是创建了一个支持portlet的Web应用,其中Struts2负责前端用户界面的控制流,Spring2.5用于管理portlet的依赖和服务,而Hibernate3.3则作为数据访问层,处理数据库交互。这种架构允许开发者...
SDO与其他技术的关系密切,它可以作为JDBC、JSR-114、实体EJB、JDO、Hibernate等持久性框架、Java-XML绑定、XQuery、JSR-225、Web UI数据绑定、JCA与JMS等技术的补充。例如,SDO可以与JDBC结合使用,提供更高级别的...
通过分析和研究这个源码,开发者可以深入理解如何在实际项目中运用J2EE技术栈,包括Servlet、JSP、JDBC、EJB、Spring、Hibernate等,以及如何设计和实现一个功能完善的电子商务系统。 【标签】"j2ee在线购物网实例...
4. **JPA and Hibernate**: Java持久层API和其最常用的实现,用于操作数据库。 5. **Thymeleaf or other Template Engines**: 用于渲染动态视图,将数据与HTML模板结合。 6. **RESTful API**: 设计API遵循REST原则,...
这篇文章可能探讨了在Java中如何设计和实现数据持久化层,特别是如何将数据库中的记录映射到Java对象(ORM,对象关系映射)。可能涉及JPA(Java Persistence API)或Hibernate等框架,讲解如何创建实体类,配置映射...
如果你真能只用一个dao解决,那么祝贺你,你得到了一个虚拟数据层(高度抽象的数据接口)。这是一个比dao更高级的存在。 欢迎大家指正 -_- 虚心求教 代码层次: bean-->dao-->service-->action 技术概述:1....
MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan ...