仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1383|回复: 18
打印 上一主题 下一主题

[学习教程] JAVA编程:Java 进修杂谈(十三):ORM仓酷云

[复制链接]
活着的死人 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:36:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
诸如RMI,EJB等一些技术并不是你说的那么复杂,而是它们把一些复杂的工具封装成不复杂的工具了,理解这些工具是需要些时间。我问你,.net网页编程里有这些工具吗?要简单多少?。这是最初一篇Java杂谈了,以ORM框架的议论扫尾,也算是把J2ee的最初一方面给涵盖到了,之以是这么晚才总结出ORM这方面,一是笔者这两周对照忙,另外一方面也想有头有尾,细心的先本人好好研讨一下ORM框架手艺,不想轻率的敷衍塞责。

实在J2ee的标准指南内里就已包含了一些对象耐久化手艺,比方JDO(JavaDataObject)就是Java对象耐久化的新标准,一个用于存取某种数据堆栈中的对象的尺度化API,供应了通明的对象存储,对开辟职员来讲,存储数据对象完整不必要分外的代码(如JDBCAPI的利用)。这些烦琐的事情已转移到JDO产物供应商身上,使开辟职员摆脱出来,从而会合工夫和精神在营业逻辑上。别的,JDO很天真,由于它能够在任何数据底层上运转。JDBC只是面向干系数据库(RDBMS)JDO更通用,供应就任何数据底层的存储功效,好比干系数据库、文件、XML和对象数据库(ODBMS)等等,使得使用可移植性更强。我们假如要了解对象耐久化手艺,起首要问本人一个成绩:为何传统的JDBC来耐久化不再能满意人人的需求了呢?

笔者以为最好是能用JDBC真正编写历程序了才干真正体味ORM的优点,一样的事理,真正拿Servlet/Jsp做过项目了才干体味到Struts、Spring等框架的便利的地方。很侥幸的是笔者这二者都已经履历过,用凌乱的内嵌Java代码的Jsp加Servlet转发写过完全的Web项目,也用JDBC搭建过一个完全C/S项目标背景。以是如今打仗到新框架才更能体味它们头脑和完成的优胜的地方,回忆夙昔的代码,真是丑恶不胜啊。^_^

回到正题,我们来研讨一下为何要从JDBC开展到ORM。复杂来讲,传统的JDBC要花大批的反复代码在初始化数据库毗连上,每次增编削查都要取得Connection对象,初始化Statement,实行失掉ResultSet再封装成本人的List大概Object,如许形成了在每一个数据会见办法中都含有大批冗余反复的代码,思索到平安性的话,还要加上大批的事件把持和log纪录。固然我们进修了计划形式以后,能够本人界说Factory来匡助削减一部分反复的代码,可是仍旧没法制止冗余的成绩。其次,跟着OO头脑不得人心,连典范的历程化言语Perl等都堂而皇之的加上了OO的外壳,况且是Java中冗杂的数据库会见耐久化手艺呢?夸大面向对象编程的了局就是找到一个桥梁,使得干系型数据库存储的数据能正确的映照到Java的对象上,然后针对Java对象来计划对象和办法,假如我们把数据库的Table看成Class,Record看成Instance的话,就能够完整用面向对象的头脑来编写数据层的代码。因而乎,ObjectRelationshipMapping的观点入手下手广泛遭到器重,只管很早很早就已有人提出来了。

弱点我们已也许分明了,那末怎样改善呢?有的放矢,起首我们要办理的是怎样从DataSchema筹办完善的映照到ObjectSchema,别的要供应对数据库毗连对象性命周期的办理,对事件分歧粒度的把持和思索到扩大性后供应对XML、Properties等可设置化的文件的撑持。到今朝为止,有良多框架和手艺在实验着如许做。比方仿佛是封装办理得过了头的EJB、很早就呈现今朝已不在开辟和晋级了的ApacheOJB、起首撑持ManualSQL的iBATIS,另有公认十分优异的Hibernate等等。在分离先容它们之前,我还想重复夸大这些框架都在试图做甚么:

究竟JavaObject和数据库的每条Record仍是有很年夜的区分,就是范例下去说,DB是没有Boolean范例的。而Java也不能不用封装类(Integer、Double等)为了能映照上数据库中为null的情形,究竟Primitive范例是没有null值的。另有一个对照分明的成绩是,数据库有主键和外键,而Java中仍旧只能经由过程基础范例来对应字段值罢了,没法划定Unique等特性,更别提外键束缚、事件把持和级联操纵了。别的,经由过程JavaObject预设某Field值往取数据库纪录,是不是在如许的纪录也是不克不及包管的。真的要计划到完整映照的话,Java的Static被一切对象共享的变量怎样办?在数据库中怎样体现出来……
我们能看到大批的成绩像一座座年夜山横在那些框架计划者们眼前,他们并非没有办理举措,而是从分歧的角度往思索,会失掉良多分歧的办理计划,成绩是应当接纳哪种呢?乃至只要比及真正计划出来了投进临盆利用了,才干印证出现在的假想是不是真的能为项目开辟带来更多的好处。笔者援用一份文档中提到一个强健的耐久化框架应当具有的特性:
Arobustpersistencelayershouldsupport----
1.Severaltypesofpersistencemechanism
2.Fullencapsulationofthepersistencemechanism.
3.Multi-objectactions
4.TransactionsControl
5.Extensibility
6.Objectidentifiers
7.Cursors:logicalconnectiontothepersistencemechanism
8.Proxies:commonlyusedwhentheresultsofaqueryaretobedisplayedinalist
9.Records:avoidtheoverheadofconvertingdatabaserecordstoobjectsandthenbacktorecords
10.Multiarchitecture
11.Variousdatabaseversionand/orvendors
12.Multipleconnections
13.Nativeandnon-nativedrivers
14.Structuredquerylanguagequeries(SQL)

如今来冗长的先容一下笔者用过的一些耐久化框架和手艺,之以是后面夸大那末多共通的常识,是但愿人人不要顺从盛行框架,必定要掌控它的实质和出色的头脑幸亏那里。
1.ApacheOJB
OJB代表ApacheObjectRelationalBridge,是Apache开辟的一个数据库耐久型框架。它是基于J2ee标准指南下的耐久型框架手艺而计划开辟的,比方完成了ODMG3.0标准的API,完成了JDO标准的API,中心完成是PersistenceBrokerAPI。OJB利用XML文件来完成映照并静态的在Metadatalayer听过一个Meta-Object-Protocol(MOP)来改动底层数据的举动。更初级的特性包含对象缓存机制、锁办理机制、Virtual代办署理、事件断绝性级别等等。举个OJBMapping的复杂例子ojb-repository.xml:

<class-descriptorclass=”com.ant.Employee”table=”EMPLOYEE”>
<field-descriptorname=”id”column=”ID”
jdbc-type=”INTEGER”primarykey=”true”autoincrement=”true”/>

<field-descriptorname=”name”column=”NAME”jdbc-type=”VARCHAR”/>
</class-descrptor>

<class-descriptorclass=”com.ant.Executive”table=”EXECUTIVE”>
<field-descriptorname=”id”column=”ID”
jdbc-type=”INTEGER”primarykey=”true”autoincrement=”true”/>

<field-descriptorname=”department”column=”DEPARTMENT”jdbc-type=”VARCHAR”/>

<reference-descriptorname=”super”class-ref=”com.ant.Employee”>
<foreignkeyfield-ref=”id”/>
</reference-descriptor>
</class-descrptor>

2.iBATIS
iBATIS最年夜的特性就是同意用户本人界说SQL来组配Bean的属性。由于它的SQL语句是间接写进XML文件中往的,以是能够最年夜水平上使用到SQL语法自己能把持的全体特征,同时也能同意你利用特定命据库服务器的分外特征,其实不范围于相似SQL92如许的尺度,它最年夜的弱点是不撑持列举范例的耐久化,即把列举范例的几个对象属性拼成与数据库一个字段比方VARCHAR对应的举动。这里也举一个Mapping文件的例子sqlMap.xml:
<sqlMap>
<typeAliastype=”com.ant.Test”alias=”test”/>

<resultMapclass=”test”id=”result”>
<resultproperty=”testId”column=”TestId”/>
<resultproperty=”name”column=”Name”/>
<resultproperty=”date”column=”Date”/>
</resultMap>

<selectid=”getTestById”resultMap=”result”parameterClass=”int”>
select*fromTestwhereTestId=#value#
</select>

<updateid=”updateTest”parameterClass=”test”>
UpdateTestssetName=#name#,Date=”date”whereTestId=#testId#
</update>
</sqlMap>

3.Hibernate
Hibernate无疑是使用最普遍最受接待的耐久型框架,它天生的SQL语句长短常优异。固然一度由于不克不及撑持手工SQL而功能遭到范围,但跟着新一代Hibernate3.x推出,良多弱点都被改善,Hibernate也因而变得加倍通用而时髦。一样先看一个Mapping文件的例子customer.hbm.xml来有一个也许印象:

<hibernate-mapping>
<classname=”com.ant.Customer”table=”Customers”>
<idname=”customerId”column=”CustomerId”type=”int”unsaved-value=”0”>
<generatorclass=”sequence”>
<paramname=”sequence”>Customers_CustomerId_Seq</param>
</generator>
</id>

<propertyname=”firstName”column=”FirstName”/>
<propertyname=”lastName”column=”LastName”/>

<setname=”addresses”outer-join=”true”>
<keycolumn=”Customer”/>
<one-to-manyclass=”com.ant.Address”/>
</set>


</class>

</hibernate-mapping>

Hibernate有良多明显的特征,最凸起的就是它有本人的查询言语叫做HQL,在HQL中selectfrom的不是Table而是类名,一方面加倍面向对象,别的一方面经由过程在hibernate.cfg.xml中设置Dialect为HQL可使得全部背景与数据库离开耦合,由于不论用那种数据库我都是基于HQL来查询,Hibernate框架卖力帮我终极转换成特定命据库里的SQL语句。别的Hibernate在Object-Caching这方面也做得相称杰出,它同时办理两个级其余缓存,当数据被第一次掏出后,真正利用的时分对象被放在一级缓存办理,这个时分任何修改城市影响到数据库;而余暇时分会把对象放在二级缓存办理,固然这个时分与数据库字段能对应上但未绑定在一同,修改不会影响到数据库的纪录,次要目标是为了在反复读取的时分更快的拿到数据而不必再次哀求毗连对象。实在关于这类缓存的计划倡议人人研讨一下Oracle的存储机制(道理是相通的),Oracle就义了空间换来工夫依附于很强健的缓存算法来包管最优的企业级数据库会见速度。

以上是一些Mapping的例子,真正在Java代码中利用多数是承继各个框架中默许的Dao完成类,然后能够经由过程Id来查找对象,大概经由过程Example来查找,更盛行的是更具Criteria查找对象。Criteria是完整封装了SQL前提查询语法的一个工具类,任何一个查询前提都能够在Criteria中找到办法与之对应,如许能够在Java代码级别完成SQL的完整把持。别的,如今很多ORM框架的最新版本跟着JDk5.0到场Annotation特征都入手下手撑持用XDoclet来主动依据Annotation来天生XML设置文件了。

笔者不成能具体的解说每个框架,大概更多的人在用Hibernate,笔者是从OJB入手下手打仗ORM手艺的,它很原始却更简单让人了解从JDBC到ORM的过渡。更多的细节是能够从官方文档和书本中学到的,但我们应当加倍看中它们计划头脑的来历和闪光点,不是顺从它们的利用办法。

到这里全体Java杂谈这个主题就正式停止了,笔者也能够长叹一口吻,拿到毕设标题后也该入手下手忙本人的卒业计划了。比来看了良多SpringAOP的材料,练习上班回家还会研讨Ajax和极限编程,假如偶然间了话,会把本人的进修条记拿出来分享的。衷心但愿人人都能不休的前进,在喜好的路途上不转头的走下往……^_^
来自:http://topic.csdn.net/u/20070924/21/18482496-082f-4907-8751-b80ab5d56622.html?seed=1386683868

轮性能微软曾做过一个例子,就是同一个项目用java和.net网页编程来作,结果开发周期,.net网页编程是java的一半,性能java是.net网页编程的十分之一,代码量java是.net网页编程的三倍。呵呵,这说明了什么,.net网页编程的全方位比java好。但是有的人说.net网页编程不能跨平台,这个问题我和我同学曾讨论过,都认为微软的.net网页编程很可能早都可以跨平台了,但是微软为了保护他们的操作系统,所以才没有推出跨平台的.net网页编程,只是推出了跨语言的.net网页编程,
因胸联盟 该用户已被删除
沙发
发表于 2015-1-21 10:55:19 | 只看该作者
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
板凳
发表于 2015-1-23 14:01:20 | 只看该作者
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
小妖女 该用户已被删除
地板
发表于 2015-1-31 17:45:11 | 只看该作者
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
爱飞 该用户已被删除
5#
发表于 2015-2-6 20:43:21 | 只看该作者
《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。
海妖 该用户已被删除
6#
发表于 2015-2-9 04:31:39 | 只看该作者
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
只想知道 该用户已被删除
7#
发表于 2015-2-9 16:22:04 | 只看该作者
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
愤怒的大鸟 该用户已被删除
8#
发表于 2015-2-26 22:26:28 | 只看该作者
Java 编程语言的风格十分接近C、C++语言。
蒙在股里 该用户已被删除
9#
发表于 2015-3-8 18:18:49 | 只看该作者
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
变相怪杰 该用户已被删除
10#
发表于 2015-3-16 09:31:21 | 只看该作者
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
精灵巫婆 该用户已被删除
11#
发表于 2015-3-22 22:09:19 | 只看该作者
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
兰色精灵 该用户已被删除
12#
发表于 2015-3-24 02:44:01 | 只看该作者
Java 编程语言的风格十分接近C、C++语言。
活着的死人 该用户已被删除
13#
 楼主| 发表于 2015-4-4 10:55:05 | 只看该作者
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
飘飘悠悠 该用户已被删除
14#
发表于 2015-4-24 03:34:00 | 只看该作者
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
小女巫 该用户已被删除
15#
发表于 2015-5-10 22:20:59 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
山那边是海 该用户已被删除
16#
发表于 2015-6-23 21:54:12 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
柔情似水 该用户已被删除
17#
发表于 2015-6-29 09:01:52 | 只看该作者
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
乐观 该用户已被删除
18#
发表于 2015-7-3 21:03:30 | 只看该作者
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
不帅 该用户已被删除
19#
发表于 2015-7-4 07:48:20 | 只看该作者
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-1 10:07

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表