Raible's Wiki

Raible Designs
Wiki Home
News
Recent Changes

AppFuse

Homepage
  - Korean
  - Chinese
  - Italian
  - Japanese

QuickStart Guide
  - Chinese
  - French
  - German
  - Italian
  - Korean
  - Portuguese
  - Spanish
  - Japanese

User Guide
  - Korean
  - Chinese

Tutorials
  - Chinese
  - German
  - Italian
  - Korean
  - Portuguese
  - Spanish

FAQ
  - Korean

Latest Downloads

Other Applications

Struts Resume
Security Example
Struts Menu

Set your name in
UserPreferences


Referenced by
Articles
Articles_cn
Articles_pt
Articles_zh
CreateManager_zh
LeftMenu
SandBox




JSPWiki v2.2.33

[RSS]


Hide Menu

CreateDAO_zh


This is version 11. It is not the current version, and thus it cannot be edited.
[Back to current version]   [Restore this version]


Part I: 在AppFuse建立DAO和对象 - 一个建立对象(代表数据库的表)和把这些对象存储到数据库的Java类的教程。

关于本教程

本教程将向你展示如何在一个数据库里创建表,以及如何完成访问这些表的Java代码。

我们将建立一个对象以及处理(保存/检索/删除)这些类到数据库的一些代码。用Java术语,我们叫它Plain Old Java Object(a.k.a. a POJO)。这个对象通常代表了数据库中的一个表,其他的类包括:

  • 一个数据访问对象Data Access Object (a.k.a. a DAO), 一个 Interface和一个Hibernate实现
  • 一个 JUnit 类来测试我们的DAO对象
NOTE: 如果你使用MySQL并且希望使用事务 (很有可能是这个情况),你需要使用InnoDB tables,为了做到这一点, 添加以下两句话到 (/etc/my.cnf 或者 c:\Windows\my.ini)。 其中第二个设置 (设置使用UTF-8字符)是4.1.7+所必需的。
[mysqld]
default-table-type=innodb
default-character-set=utf8
如果你使用PostgreSQL并且在成批处理时得到许多迷惑的错误,试着把关闭它,方法是增加 <prop key="hibernate.jdbc.batch_size">0</prop> 到你的 src/dao/**/hibernate/applicationContext-hibernate.xml文件。

AppFuse使用Hibernate 作为持久化层, Hibernate是一套对象/关系Object/Relational (O/R)框架,他允许你把Java对象和数据库之间联系起来,它可以很方便的对你的对象执行CRUD (Create, Retrieve, Update, Delete)操作。

你也可以选择使用iBATIS作为持久化层,如果要在AppFuse里安装iBATIS, 请查看extras/ibatis中的README.txt。如果你选择iBATIS而不是Hibernate, 希望你有自己的原因并且熟悉这个框架,我也希望你能够领会到如何将教程应用到iBATIS ;-)

字体惯例 (进行中)

要在命令行下执行的命令是这个样子: ant test-all.
对目录或者包中的文件的引用是这个样子: build.xml.
我在“真实世界”中实际操作的方式用蓝色斜体表示。

让我们继续在AppFuse项目的结构下创建一个新的对象、DAO和测试。

目录

  • [1] 建立一个对象,并且作XDoclet标记
  • [2] 使用Ant根据对象建立数据库中的表
  • [3] 创建一个DaoTest来运行DAO对象的JUnit测试
  • [4] 创建一个新的DAO来执行关于这个对象的CRUD操作
  • [5] 在spring里配置Person和PersonDao
  • [6] 运行DaoTest

建立一个对象,并且作XDoclet标记 [#1]

我们要做的第一件事情就是建立一个需要持久化的对象,我们要在src/dao/**/model目录下建立一个简单的Person对象,这个对象包括id、firstName和lastName属性。

注意: 直接拷贝本教程的代码 &#22312;FireFox&#19979;&#26080;&#25928;,但我们可以通过CTRL+Click选定一个代码所在的工作区(OS X下是Command+Click),然后再拷贝。


package org.appfuse.model;

public class Person extends BaseObject {
    private Long id;
    private String firstName;
    private String lastName;

    /*
     Generate your getters and setters using your favorite IDE: 
     In Eclipse:
     Right-click -> Source -> Generate Getters and Setters
    */
}

这个类必须扩展BaseObject,而这个BaseObject有三个抽象方法(equals(), hashCode()和toString())需要你在Person类里实现,前两个是Hibernate的需要。为了完成这部分工作最简单的方式是使用Commonclipse,关于这个工具更多的信息可以在Lee Grey&#30340;&#32593;&#31449;里看到,另外一个你可以使用的Eclipse的插件是Commons4E,我还没有使用过,这里不便对其功能作出评论。

如果你使用IntelliJ IDEA,你可以自动产生equals()和hashCode(),但没有toString(),有一个 ToStringPlugin插件做得非常不错

现在我们已经创建了这个POJO对象,我们需要增加XDoclet标记来产生Hibernate的映射文件,这些文件用来映射对象→ 表和属性(变量) → 字段。

首先,我们增加@hibernate.class 来告诉Hibernate我们将要和那个表作关联:


/**
 * @hibernate.class table="person"
 */
public class Person extends BaseObject {

我们也要增加主键的映射,否则XDoclet会在产生映射文件时出错,注意所有的@hibernate.*标签必须在getters'的Javadocs里面。


    /**
     @return Returns the id.
     * @hibernate.id column="id"
     *  generator-class="increment" unsaved-value="null"
     */

    public Long getId() {
        return this.id;
    }

我使用generator-class="increment"而不使用generate-class="native" 是因为我对数据库使用"native"时&#21457;&#29616;&#20102;&#19968;&#20123;&#38382;&#39064;,如果你只是希望使用MySQL,推荐使用"native"值,本教程使用increment。

使用Ant根据对象产生数据库表[#2]

在这种情况下,你可以通过运行ant setup-db来建立person表,这个任务会产生文件Person.hbm.xml并且会建立叫做"person"的表,从Ant的控制台窗口,你可以看到Hibernate为你建立的表结构的内容。
[schemaexport] create table person (
[schemaexport]    id bigint not null,
[schemaexport]    primary key (id)
[schemaexport] );

如果你查看Hibernate生成的文件Person.hbm.xml,可以到build/dao/gen/**/model目录,这里是Person.hbm.xml的内容(目前的内容):


<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 2.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>
    <class
        name="org.appfuse.model.Person"
        table="person"
        dynamic-update="false"
        dynamic-insert="false"
    >

        <id
            name="id"
            column="id"
            type="java.lang.Long"
            unsaved-value="null"
        >
            <generator class="increment">
            </generator>
        </id>

        <!--
            To add non XDoclet property mappings, create a file named
                hibernate-properties-Person.xml
            containing the additional properties and place it in your merge dir.
        -->

    </class>

</hibernate-mapping>

现在我们要为其它的字段(first_name, last_name)添加额外的@hibernate.property标签:


    /**
     * @hibernate.property column="first_name" length="50"
     */
    public String getFirstName() {
        return this.firstName;
    }

    /**
     * @hibernate.property column="last_name" length="50"
     */
    public String getLastName() {
        return this.lastName;
    }

在这个例子里,添加column属性的唯一原因是因为这个字段名与它的属性名不相同,如果他们相同,你没有必要来指定column属性,关于其它可以使用的标签请看@hibernate.property

再次运行ant setup-db把新加的属性加到数据库表里。

[schemaexport] create table person (
[schemaexport]    id bigint not null,
[schemaexport]    first_name varchar(50),
[schemaexport]    last_name varchar(50),
[schemaexport]    primary key (id)
[schemaexport] );

如果期望修改字段的长度,修改@hibernate.property标签的length属性,如果希望把字段改为必添字段(NOT NULL),可以增加属性not-null="true"。

建立新的DaoTest来对你的DAO运行JUnit测试[#3]



Go to top   More info...   Attach file...
This particular version was published on 06-Nov-2006 13:52:47 MST by rocksun.