⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 如何用jdo开发数据库应用.htm

📁 本文将介绍如何使用Sun公司的最新《Java Data Objects 》规范来进行基于数据库的简单应用程序的开发
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<P>点击“OK”后,我们就到了主窗口,在主窗口中,我们可以进行metadata的编辑工作。我们通过菜单Meta--&gt;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>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;jdo&gt;
    &lt;package name="credit.system"&gt;
        &lt;class name="CreditCard" /&gt;
        &lt;class name="TransactionRecord" /&gt;
    &lt;/package&gt;
&lt;/jdo&gt;
</PRE>
<P>不过如果类比较多,之间关系也比较复杂的时候,就最好通过工具完成,以免出现语法和语义错误,除非你已经很有经验。</P>
<P>之后,我们选择菜单的Build--&gt;Recreate 
Schema来创建相应的数据库。数据库的表结构是自动生成的,如果你对其中一些表名或字段名或字段长度有异议,可以在主窗口中自定义。这里为简明扼要,全部采用自动生成。如果你想在建表之前看看数据结构,可以选择菜单“Build--&gt;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--&gt;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>&lt;?xml version="1.0" encoding="GB2312" ?&gt;
&lt;project name="creditSys" default="enhance"&gt;
    &lt;property name="src" location="src" /&gt;
    &lt;property name="build" location="classes" /&gt;
    &lt;property name="jdbc.jar" location="d:/bak/lib/mysql.jar" /&gt;

    &lt;path id="cp"&gt;
        &lt;pathelement path="${build}"/&gt;
        &lt;pathelement path="${jdbc.jar}"/&gt;
        &lt;fileset dir="." includes="*.jar" /&gt;
    &lt;/path&gt;

    &lt;target name="cleanup" description="清除所有编译生成的class文件"&gt;
        &lt;delete&gt;
            &lt;fileset dir="${build}" includes="**/*.class"/&gt;
        &lt;/delete&gt;
    &lt;/target&gt;

    &lt;target name="compile"&gt;
        &lt;javac debug="true" destdir="${build}" srcdir="${src}" classpathref="cp"/&gt;
    &lt;/target&gt;

    &lt;target name="enhance" depends="cleanup, compile"&gt;
        &lt;taskdef classpathref="cp" resource="jdogenie.tasks"/&gt;
        &lt;jdo-enhance project="${ant.project.name}.jdogenie" outputdir="${build}" /&gt;
    &lt;/target&gt;

    &lt;target name="run" description="运行credit.system.Main类,测试功能"&gt;<BR>        &lt;java classname="credit.system.Main" classpathref="cp" fork="true" /&gt;<BR>    &lt;/target&gt;</PRE><PRE>&lt;/project&gt;
</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 + -