📄 如何用jdo开发数据库应用.htm
字号:
<P>点击“OK”后,我们就到了主窗口,在主窗口中,我们可以进行metadata的编辑工作。我们通过菜单Meta-->Add
Classes将前面的两个数据类加入到元数据中,表示这两个类是需要存储的。其余的数据表结构等等繁琐的事务,我们全部留给JDOGenie自动完成。添加数据类的过程中需要创建一个元数据文件,根据JDO的标准,一般情况下我们只需要在CLASSPATH根目录下创建一个“system.jdo”即可。加入数据类后的界面如下:</P>
<P><IMG height=500 src="如何用JDO开发数据库应用.files/CSDN_Dev_Image_2003-7-212531510.jpg"
width=750></P>
<P>而自动生成的元数据文件system.jdo内容非常简单,实际上直接用手工写也不难:</P><PRE><?xml version="1.0" encoding="UTF-8"?>
<jdo>
<package name="credit.system">
<class name="CreditCard" />
<class name="TransactionRecord" />
</package>
</jdo>
</PRE>
<P>不过如果类比较多,之间关系也比较复杂的时候,就最好通过工具完成,以免出现语法和语义错误,除非你已经很有经验。</P>
<P>之后,我们选择菜单的Build-->Recreate
Schema来创建相应的数据库。数据库的表结构是自动生成的,如果你对其中一些表名或字段名或字段长度有异议,可以在主窗口中自定义。这里为简明扼要,全部采用自动生成。如果你想在建表之前看看数据结构,可以选择菜单“Build-->View
Schema”先预览一下生成的表结构SQL代码:</P><PRE>-- credit.system.CreditCard
create table credit_card (
credit_card_id INTEGER not null, -- <PK>
address VARCHAR(255), -- address
allow_over_draft FLOAT, -- allowOverDraft
balance FLOAT, -- balance
create_time DATETIME, -- createTime
idcard VARCHAR(255), -- idcard
initial_balance FLOAT, -- initialBalance
last_transaction_time DATETIME, -- lastTransactionTime
nme VARCHAR(255), -- name
phone VARCHAR(255), -- phone
jdo_version SMALLINT not null, -- <OPT-LOCK>
constraint pk_credit_card primary key (credit_card_id)
) TYPE = InnoDB;
-- za.co.hemtech.jdo.server.jdbc.sql.HighLowJdbcKeyGenerator
create table jdo_keygen (
table_name VARCHAR(64) not null,
last_used_id INTEGER not null,
constraint pk_jdo_keygen primary key (table_name)
) TYPE = InnoDB;
-- credit.system.TransactionRecord
create table transaction_record (
transaction_record_id INTEGER not null, -- <PK>
amount FLOAT, -- amount
credit_card_id INTEGER, -- card
create_time DATETIME, -- createTime
note VARCHAR(255), -- note
jdo_version SMALLINT not null, -- <OPT-LOCK>
constraint pk_transaction_record primary key (transaction_record_id)
) TYPE = InnoDB;
</PRE>
<P>接下来,我们保存这个Project,也就是将配置信息写入“creditSys.jdogenie”。下面我们就可以继续开发了,也就是说,我们所有的数据类包装工作就全部完成了,已经可以享受JDO的自动维护的对象存储和灵活的面向对象的JDOQL查询语言的好处了。</P>
<P>JDOGenie1.4.7还有一个好处,是它新增的UML类图功能,简洁明了地给出数据类之间的关系,对于理解别人的数据模型非常有用。选择菜单“Meta-->Diagrams”,将所有的类都加到图中,即可看到本文中的数据模型:</P>
<P><IMG height=524 src="如何用JDO开发数据库应用.files/CSDN_Dev_Image_2003-7-212531512.jpg"
width=588></P>
<P>如果类比较多的话,可能这些关系线段会有交叉,那就需要我们手动地调整一下各个类的位置,做到尽量减少交叉。一个复杂一点的类图示范如下(未调整位置):</P>
<P><IMG height=506 src="如何用JDO开发数据库应用.files/CSDN_Dev_Image_2003-7-212531514.jpg"
width=700></P>
<H3>4.4. 增强我们的数据对象类代码</H3>
<P>配置信息写完了,metadata也生成好了,下面就是用JDOGenie的类代码增强器增强我们编译生成的类代码。在这里,由于需要配置一些CLASSPATH、JDO文件路径等,我们写了一段Ant脚本来完成这些麻烦的工作。</P>
<P>这个Ant脚本保存在我们的项目根目录下,名为“build.xml”:</P><PRE><?xml version="1.0" encoding="GB2312" ?>
<project name="creditSys" default="enhance">
<property name="src" location="src" />
<property name="build" location="classes" />
<property name="jdbc.jar" location="d:/bak/lib/mysql.jar" />
<path id="cp">
<pathelement path="${build}"/>
<pathelement path="${jdbc.jar}"/>
<fileset dir="." includes="*.jar" />
</path>
<target name="cleanup" description="清除所有编译生成的class文件">
<delete>
<fileset dir="${build}" includes="**/*.class"/>
</delete>
</target>
<target name="compile">
<javac debug="true" destdir="${build}" srcdir="${src}" classpathref="cp"/>
</target>
<target name="enhance" depends="cleanup, compile">
<taskdef classpathref="cp" resource="jdogenie.tasks"/>
<jdo-enhance project="${ant.project.name}.jdogenie" outputdir="${build}" />
</target>
<target name="run" description="运行credit.system.Main类,测试功能"><BR> <java classname="credit.system.Main" classpathref="cp" fork="true" /><BR> </target></PRE><PRE></project>
</PRE>
<P>这样,我们需要增强类代码的时候,在DOS框中,在build.xml所在的目录下运行“ant”,即可完成增强过程。另外,要运行测试程序类credit.system.Main的话(后面会讲到),只需要运行“ant
run”即可,这样可以解决没有类似JBuilder的IDE的问题。</P>
<P></P>
<H3>4.5. 编写业务逻辑方法:永远不能回避的任务</H3>
<P>业务逻辑,好象在面向对象编程中常常提到,但到底什么是业务逻辑呢?难道仅仅是为了显示自己很高深,所以张口闭口就业务逻辑?确实有这样一些人,谈论开发的分析与设计时,脱口而出就是“业务逻辑”,实际上可能他们自己也不知道到底什么才是业务逻辑。</P>
<P>我个人的理解可能也不是很充分。我是这样理解的:在应用中与存储无关的对象之间的协作(即属性的关联性的变化)就是业务逻辑,一般体现为一些规则,比如:当新生成一个交易时,就将信用卡的总交易次数加1,将系统的总交易次数也加1。类似这样的规则就是业务逻辑,这些是每个应用特定的,是工具无法自动为你实现的,必须在你自己的应用代码中体现,不论是作为Java代码,还是作为数据库存储过程,总之,必须有一段代码来体现这些业务逻辑。</P>
<P>采用JDO解决了存储的问题之后,我们就可以编写工具类(独立于数据类的包含业务逻辑方法的类)来完成需求中描述的功能了。注意我们在下面的代码中用到的JDO
API。具体API的使用参见JDO文档以及本文末的<A
href="file:///C:/temp/如何用JDO开发数据库应用.htm#reference_articles">参考文章</A>中的《Java Data
Objects第一章翻译》。</P>
<P>在完成第一个功能需求之前,我们先建立一些基础代码以将JDO集成起来。我们写一个名为“credit.system.Main”的工具类(也可称为控制类),来提供这些基础的方法:</P><PRE>package credit.system;
import javax.jdo.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
System.out.println("开始测试功能……");
}
/**
* 本方法专用于获取JDO API的核心对象:存储管理器PersistenceManager
*/
public static PersistenceManager getPersistenceManager() {
if(pmf == null) {
java.util.Properties p = new java.util.Properties();
try {
//从配置文件读入配置信息
p.load(Main.class.getClassLoader().getResourceAsStream("/creditSys.jdogenie"));
} catch(IOException ex) {
throw new RuntimeException(ex);
}
pmf = JDOHelper.getPersistenceManagerFactory(p);
}
return pmf.getPersistenceManager();
}
private static PersistenceManagerFactory pmf;
}
</PRE>为能让我们的代码能够编译并运行,我们还需要JDO的API包和JDOGenie的支持包,这些支持包都被合成到JDOGenie的lib目录下的“jdogenie.jar”文件中,还有一个JTA包也是JDOGenie运行时必须的,即其lib目录下的jta.jar。我们将这两个jar文件拷贝到我们的项目目录下,以便与JDOGenie的目录划清界限,另外,还需要将JDOGenie的license目录下的“jdogenie.license”文件(也就是通过邮件获取的license文件),放到我们的CLASSPATH中。当然,也可以将该license文件和JTA包一并压缩到jdogenie.jar中,我就喜欢这样做,这样可以使对JDOGenie的依赖浓缩到一个jar文件中,方便在不同JDO产品间切换(因为我一般会让一个应用在不同的JDO产品下工作,以保证规范性和兼容性)。<BR>
<H4>4.5.1. 录入信用卡资料</H4>
<P>为了放置业务逻辑方法,为简便起见,我们将在Main类中用静态方法来完成这些业务功能。首先,我们写一个方法来完成添加信用卡资料的功能:</P><PRE> /**
* 录入新信用卡,只需要录入必须的资料,其它的信息自动产生。
* @return 生成的新信用卡对象
* @throws IdCardDuplicatedException 身份证号重复,不允许创建新卡
*/
public static CreditCard inputCard(
String name,
String address,
String idcard,
String phone,
float initialBalance,
float allowOverDraft
) throws IdCardDuplicatedException {
CreditCard cc = new CreditCard();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -