仓酷云

标题: JAVA网页设计Java数据对象(JDO)的使用 [打印本页]

作者: 不帅    时间: 2015-1-18 11:40
标题: JAVA网页设计Java数据对象(JDO)的使用
你说是sun公司对她研究的透还是微软?针对自己工具开发的.net性能上肯定会站上风的。对象|数据在本篇文章中,我们将具体地会商Sun公司的Java数据对象(JDO)尺度。JDO同意我们利用Java对象,撑持事件和多用户。与ODBC分歧的是,它使我们无需思索SQL和与数据库有关的其他工具。它与串行化也有所区分,由于它撑持多个用户和事件。JDO同意Java开辟职员将他们的数据模子用作数据模子,无需在“数据端”、“对象端”之间的转移方面消费大批的工夫。
包含CocoBase、WebGainTOPLink和CastorJDO在内的多种产物都能够完成了JDO尺度。既然有一种尺度的办法,我们就能够只进修个中的一种,就象有了ODBC,我们就能够利用任何供应了驱动程序的数据库那样。
在本篇文章中,我们将利用Prism手艺公司的OpenFusionJDO。读者在前面会发明,只要很小一部分代码利用了PrismTechAPI,其他部分都利用了尺度的JDO尺度。
创立Person对象
我们将起首创立一个Person对象,该对象遵守了JavaBean的常规,能够对其属性实行get和set操纵。必要注重的是,只管我们是在创立这个类,但它并没有甚么出格的,它没有承继或完成任何基础类。对一个可坚持类的请求是:
1、一切域必需可以被JDO类会见(public或set*办法)
2、域的数据范例必需切合JDO规格。
3、不克不及撑持一些范例的字段(比方Thread、File、Socket等不克不及串行化的字段)。
上面是切合上述请求的Person.java:

publicclassPerson{
privateStringname;
privateStringaddress;
privateStringssn;
privateStringemail;
privateStringhomePhone;
privateStringworkPhone;

//同意我们利用机关器创立Person对象
publicPerson(Stringname,Stringaddress,Stringssn,
Stringemail,StringhomePhone,StringworkPhone){
this.name=name;
this.address=address;
this.ssn=ssn;
this.email=email;
this.homePhone=homePhone;
this.workPhone=workPhone;
}


//办法
publicStringgetName(){returnname;}

publicStringgetAddress(){returnaddress;}

publicStringgetSsn(){returnssn;}

publicStringgetEmail(){returnemail;}

publicStringgetHomePhone(){returnhomePhone;}

publicStringgetWorkPhone(){returnworkPhone;}

publicvoidsetName(Stringname){this.name=name;}

publicvoidsetAddress(Stringaddress){
this.address=address;
}

publicvoidsetSsn(Stringssn){this.ssn=ssn;}

publicvoidsetEmail(Stringemail){this.email=email;}

publicvoidsetHomePhone(StringhomePhone){
this.homePhone=homePhone;
}
publicvoidsetWorkPhone(StringworkPhone){
this.workPhone=workPhone;
}
}
创立PersonPersist对象办理可坚持性
如今已有了Person对象,我们必要创立一些代码来办理这类可坚持性。上面我们将具体会商这些代码,并进修怎样:
1、初始化JDO可坚持性办理器。
2、向数据库中输出三团体的材料。
3、从数据库中显现人的材料。
4、修正个中一团体的名字。
5、从数据库中删除一团体的材料。
6、在main()办法中举行相干的处置。
第一步:初始化JDO可坚持性办理器
我们从OpenFusion完成中导进了尺度的JDO类和ManagedConnectionFactory,固然了我们也能够将它们笼统成一个自力的类。机关器利用javax.jdo.PersistenceManagerFactoryClass属性设置毗连代办署理,这一点与在JDBC中设置数据库驱动程序的属性很类似。
packageaddressbook;

importjava.util.*;
importjavax.jdo.*;

import
com.prismt.j2ee.connector.jdbc.ManagedConnectionFactoryImpl;

publicclassPersonPersist
{
privatefinalstaticintSIZE=3;
privatePersistenceManagerFactorypmf=null;
privatePersistenceManagerpm=null;
privateTransactiontransaction=null;

//必要坚持的人的数组
privatePerson[]people;
//现有对象标识符的向量
privateVectorid=newVector(SIZE);

publicPersonPersist(){
try{
Propertiesprops=newProperties();

props.setProperty("javax.jdo.PersistenceManagerFactoryClass",
"com.prismt.j2ee.jdo.PersistenceManagerFactoryImpl");
pmf=JDOHelper.getPersistenceManagerFactory(props);
pmf.setConnectionFactory(createConnectionFactory());
}catch(Exceptionex){
ex.printStackTrace();
System.exit(1);
}
}
毗连代办署理是在名字为createConnectionFactory()的静态办法中创立的,该代办署理必要JDBCURL、JDBC驱动程序、用户名和口令。
publicstaticObjectcreateConnectionFactory(){
ManagedConnectionFactoryImplmcfi=new
ManagedConnectionFactoryImpl();
ObjectconnectionFactory=null;

try{
mcfi.setUserName("scott");
mcfi.setPassword("tiger");
mcfi.setConnectionURL(
"jdbc:oracle:thin:@localhost:1521:thedb");

mcfi.setDBDriver("oracle.jdbc.driver.OracleDriver");

connectionFactory=mcfi.createConnectionFactory();
}catch(Exceptione){
e.printStackTrace();
System.exit(1);
}
returnconnectionFactory;
}


第二步:在数据库中输出三团体的材料

PersistPeople()利用Person.java文件中的机关器创立了3团体的材料。。我们要作的第一件事是经由过程
getPersistenceManager()取得一个可坚持性办理器,然后创立一个实行我们的义务的事件。为了坚持这一对象布局图,我们复杂地挪用makePersistentAll(Object[])办法便可。代码底部的for()轮回取得每一个坚持对象的独一的ID,并保留起来供今后利用。
publicvoidpersistPeople(){
//创立人的材料的数组
people=newPerson[SIZE];

//创立3团体的材料
people[0]=newPerson("GarySegal","123FoobarLane",
"123-123-1234","gary@segal.com",
"(608)294-0192","(608)029-4059");
people[1]=newPerson("MichaelOwen",
"222BazzaLane,Liverpool,MN",
"111-222-3333","michael@owen.com",
"(720)111-2222","(303)222-3333");
people[2]=newPerson("RoyKeane",
"222TraffordAve,Manchester,MN",
"234-235-3830","roy@keane.com",
"(720)940-9049","(303)309-7599)");

//坚持这3团体的材料
pm=pmf.getPersistenceManager();
transaction=pm.currentTransaction();
pm.makePersistentAll(people);
transaction.commit();

//猎取被坚持对象的对象ID
for(inti=0;i<people.length;i++){
id.add(pm.getObjectId(people[i]));
}

//封闭现有的坚持性办理器,包管对象是从数据库而不是从坚持性办理器的缓存中读取的
pm.close();
}
上面是一些能够针对坚持性办理器的其他办法:
使实例成为可坚持的:取得一个一时对象,并坚持它。
删除可坚持实例:从数据存储库中删除信息。
使实例一时化:使实例与可坚持性办理器分别,而不删除在数据存储库中的信息。
使实例处于坚持形态删除坚持的实例使实例处于一时形态
makePersistent(Objecto)deletePersistent(Objecto)makeTransient(Objecto)
makePersistentAll(Object[]os)deletePersistentAll(Object[]os)makeTransientAll(Object[]os)
makePersistentAll(Collectionos)deletePersistentAll(Collectionos)makeTransientAll(Collectionos)
(这里是一个4X3的表格,能够参阅原稿中的英文表格)

第三步:显现数据库中人的信息
显现信息代码以取得可坚持性办理器入手下手。我们利用下面代码顶用persistPeople()办法保留的对象ID取得对象,挪用对象的办法━━在本例中是gets,来失掉我们输出的信息。我们能够发明,要坚持我们的对象,其实不必要编写大批的代码。
publicvoiddisplay(intend){
Personperson;
intmax=end<=SIZE?end:SIZE;

//取得一个新的可坚持性办理器
pm=pmf.getPersistenceManager();
//从数据库中猎取对象并举行显现
for(inti=0;i<max;i++){



person=(Person)pm.getObjectById(id.elementAt(i),
false);
System.out.println("Name:"+person.getName());
System.out.println("Address:"+
person.getAddress());
System.out.println("SSN:"+person.getSsn());
System.out.println("Email:"+person.getEmail());
System.out.println("HomePhone:"+
person.getHomePhone());
System.out.println("WorkPhone:"+
person.getWorkPhone());
}
pm.close();
}
第四步:改动个中一团体的名字
改动存储在数据库中的一团体的信息的代码也非常复杂,它与显现数据库中人的信息的代码十分相似。在这里,我们必要创立一个事件(由于要修正个中的纪录),利用界说的setName()办法修正一团体的名字,终极提交该事件,保留所作的修正。这类操纵与处置一时对象之间真实的不同是,我们思索是事件。
publicvoidchange(){
Personperson;

//从数据存储库中猎取对象
pm=pmf.getPersistenceManager();
transaction=pm.currentTransaction();
//修正第二个坚持纪录的DataString字段
person=(Person)pm.getObjectById(id.elementAt(1),
false);
person.setName("SteveGerrard");
//提交事件并封闭可坚持性办理器
transaction.commit();
pm.close();
}
第五步:删除一团体的材料
你本人可以设想出从数据库中删除第二团体材料的代码吗?由于我们已懂得了一切编写这一代码所必要的常识。细心地研讨一下上面的代码就会发明,我们利用了第二步中的可坚持性办理器办法中提到的deletePersistent()办法。
publicvoiddelete(){
//从数据库中猎取对象
pm=pmf.getPersistenceManager();
transaction=pm.currentTransaction();
//从数据库中删除第二团体的信息,并从ID向量中删除其ID
pm.deletePersistent(pm.getObjectById(id.remove(1),
false));
//提交事件并封闭可坚持性办理器
transaction.commit();
pm.close();
}
第六步:在main()办法中运转下面的代码
最初,全部代码必要有一个main()串起来,在数据库中输出人的信息、改动个中一团体的名字,然后删除该人的材料。假如运转这一程序,就会看到程序运转到每步时的地点簿。
publicstaticvoidmain(String[]args){
System.out.println("CreatePersonPersist");
PersonPersistpersonPersist=newPersonPersist();

System.out.println("Setupandpersistagroupofpeople");
personPersist.persistPeople();

System.out.println("Displaythepersistedpeople");
personPersist.display(SIZE);

System.out.println("Changeaname");
personPersist.change();
personPersist.display(SIZE);

System.out.println("Deleteaperson");
personPersist.delete();
personPersist.display(SIZE-1);
}
JDOEnhancer:创立JDOEnhancer的JDO形貌符

如今,我们已编写好了全部使用程序的源代码,下一步必要作的就是创立一个JDOEnhancer将要利用的
JDO形貌符。读者必定会问,JDOEnhancer是甚么?JDO架构是基于上面的理念的:一个JDO完成可以猎取类的字节码,对它们举行处置,增加一些需要的功效。比方,JDOEnhancer将使类完成PersistanceCapable接口(因而我们不必本人编程完成这一接口),并且可以完成该接口中的一些办法。因而在对代码编译后我们就会发明,我们必需运转JDOEnhancer对字节码举行得当的处置。我们必要创立一个给出我们必要坚持的类的信息的形貌符文件,这一文件以下所示:

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEjdoSYSTEM
"file:/D:/Apps/OpenFusionJDO/xml/schema/jdo.dtd">
<jdo>
<packagename="addressbook">
<classname="Person"identity-type="datastore">
</class>
</package>
</jdo>
这只是一个最基础的文件,但可以满意我们的请求。固然了,另有很多更庞大的映照。上面是OpenFusion例子中一个略微庞大一些的映照:
<classname="Department"identity-type="datastore">
<fieldname="name"/>
<fieldname="employees">
<collectionelement-
type="com.prismt.j2ee.jdo.examples.appKeyDepartment.Employee">
</collection>
</field>
<fieldname="manager"/>
</class>
</package>
</jdo>
如今我们已编写好了代码和JDO形貌符文件,我们将对它们举行整合,并会商怎样创建全部体系。要创建全部体系,我们只必要复杂的几步事情便可:
1、编译代码。
2、运转JDOEnhancer。
3、利用JDOEnhancer的输入创建数据库。
4、运转使用程序。
第一步:编译代码
我想宽大的读者想必已晓得怎样运转javac了吧。在运转javac之前,我们只需包管准确地设置CLASSPATH就能够了。上面是一个在Windows平台上运转javac的例子:
%setOPENFUSION_DIR=D:AppsOpenFusionJDO
%set
CLASSPATH=%OPENFUSION_DIR%libconnector.jar;%OPENFUSION_DIR%
libjndi.jar;%OPENFUSION_DIR%liblog4j.jar;%OPENFUSION_DIR%l
ibxerces.jar;%OPENFUSION_DIR%libclasses12.zip;%OPENFUSION_D
IR%libjdo.jar;%OPENFUSION_DIR%libjta-
spec1_0_1.jar;%OPENFUSION_DIR%libofjdo.jar;.

%javac?d.Person*.java
第二步:运转JDOEnhancer
JDOEnhancer必要利用在上一步编译中失掉的字节码和我们先前创建的JDO形貌符文件。上面是OpenFusionJDOEnhancer的完全语法:
javacom.prismt.j2ee.jdo.enhancer.JDOEnhancer

命令选项:
-cp入手下手搜刮必要强化的类的基础路径,与CLASSPATH分歧,它是编译后的可坚持类地点的目次
-oc存储强化后的类的目次
-pdJDO形貌符文件

可选项:
-db指定方针数据库[oracle、sybase等]
-od天生SQL剧本的目次

上面是为创建我们的使用程序而运转JDOEnhancer的一个例子:
%javacom.prismt.j2ee.jdo.enhancer.JDOEnhancer-oc.-pd
person.jdo-dboracle-oddb-cp.
第三步:利用JDOEnhancer的输入创建数据库
,只需利用?db和-od可选项,JDOEnhancer就可以够创立创建数据库的数据库剧本。它可以创立很多剧本,但个中有一个的名字叫load_all.sql,翻开该文件并将它加载到一个SQL提醒符中。(比方sqlplusforOracle)

CREATESEQUENCEinstid_seqINCREMENTBY1
;

CREATETABLEJDO_addressbook_Person_SCO
(
inst_idINTEGERNOTNULL,
classINTEGERNOTNULL,
JDO_addressVARCHAR2(255),
JDO_emailVARCHAR2(255),
JDO_homePhoneVARCHAR2(255),
JDO_nameVARCHAR2(255),
JDO_ssnVARCHAR2(255),
JDO_workPhoneVARCHAR2(255)
)
;
CREATETABLEJDO_addressbook_Person
(
inst_idINTEGERNOTNULL,
classINTEGERNOTNULL,
JDO_addressVARCHAR2(255),
JDO_emailVARCHAR2(255),
JDO_homePhoneVARCHAR2(255),
JDO_nameVARCHAR2(255),
JDO_ssnVARCHAR2(255),
JDO_workPhoneVARCHAR2(255)
)
;
CREATETABLEprismjdoProp
(
nameVARCHAR2(255)PRIMARYKEY,
valueVARCHAR2(255)
)
;
CREATETABLEprismjdoExtents
(
class_idNUMBER(38,0)PRIMARYKEY,
class_nameVARCHAR2(255)UNIQUE,
app_keyVARCHAR2(255)
)
;
ALTERTABLEJDO_addressbook_Person_SCOADDPRIMARYKEY
(inst_id,class)
;
ALTERTABLEJDO_addressbook_PersonADDPRIMARYKEY(inst_id,
class)
;

INSERTINTOprismjdoExtentsVALUES(0,addressbook.Person,
com.prismt.j2ee.jdo.spi.DBKey)
;
COMMITWORK
;

INSERTINTOprismjdoPropVALUES(USE.RDBMS.TRIGGERS,true)
;
COMMITWORK
;
第四步:运转使用程序
如今已创建了数据库,我们就能够运转使用程序了。怎样,分享一下本人的休息功效吧!
%javaaddressbook.PersonPersist
停止语
我们已会商了怎样利用OpenFusionJDO完成来处置JDO尺度。这是一个全新的范畴,开辟职员能够会合精神处置营业需乞降对象,而无需对SQL非常精晓。




首先第一点:jsp,servlet,javabean这些最基本的,嘿嘿,就算你是高手的话,在大行的企业级应用的话还是需要框架的,一个好的框架确实能构解决许多问题。
作者: 因胸联盟    时间: 2015-1-21 12:33
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
作者: 若相依    时间: 2015-1-29 20:45
Java 编程语言的风格十分接近C、C++语言。
作者: 透明    时间: 2015-2-2 11:06
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
作者: 灵魂腐蚀    时间: 2015-2-6 20:50
是一种使用者不需花费很多时间学习的语言
作者: 不帅    时间: 2015-2-18 17:47
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
作者: 谁可相欹    时间: 2015-3-4 01:10
是一种将安全性(Security)列为第一优先考虑的语言
作者: 分手快乐    时间: 2015-3-11 14:26
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
作者: 深爱那片海    时间: 2015-3-12 09:36
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
作者: 第二个灵魂    时间: 2015-3-17 09:11
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
作者: 小妖女    时间: 2015-3-22 00:09
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
作者: 活着的死人    时间: 2015-4-6 23:08
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
作者: 愤怒的大鸟    时间: 2015-4-10 14:27
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
作者: 精灵巫婆    时间: 2015-4-12 17:05
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
作者: 乐观    时间: 2015-4-12 20:51
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
作者: 小女巫    时间: 2015-4-14 03:42
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
作者: 变相怪杰    时间: 2015-4-21 07:38
Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)
作者: 飘飘悠悠    时间: 2015-5-1 07:11
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
作者: 山那边是海    时间: 2015-5-1 17:37
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
作者: 冷月葬花魂    时间: 2015-5-6 22:09
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2