设置表格

本页描述了 JDBC 教程中使用的所有表以及如何创建它们:

COFFEES Table

COFFEES表存储有关可在 The Coffee Break 出售的咖啡的信息:

COF_NAME SUP_ID PRICE SALES TOTAL
Colombian 101 7.99 0 0
French_Roast 49 8.99 0 0
Espresso 150 9.99 0 0
Colombian_Decaf 101 8.99 0 0
French_Roast_Decaf 49 9.99 0 0

下面介绍了COFFEES表中的每个列:

SUPPLIERS Table

SUPPLIERS存储有关每个供应商的信息:

SUP_ID SUP_NAME STREET CITY STATE ZIP
101 Acme, Inc. 99 市场街 Groundsville CA 95199
49 Superior Coffee 1 聚会场所 Mendocino CA 95460
150 高地 100 咖啡巷 Meadows CA 93966

下面介绍了SUPPLIERS表中的每个列:

COF_INVENTORY Table

表格COF_INVENTORY存储有关每个仓库中存储的咖啡量的信息:

WAREHOUSE_ID COF_NAME SUP_ID QUAN DATE_VAL
1234 House_Blend 49 0 2006_04_01
1234 House_Blend_Decaf 49 0 2006_04_01
1234 Colombian 101 0 2006_04_01
1234 French_Roast 49 0 2006_04_01
1234 Espresso 150 0 2006_04_01
1234 Colombian_Decaf 101 0 2006_04_01

下面介绍了COF_INVENTORY表中的每个列:

MERCH_INVENTORY Table

MERCH_INVENTORY存储有关库存中非咖啡商品数量的信息:

ITEM_ID ITEM_NAME SUP_ID QUAN DATE
00001234 Cup_Large 00456 28 2006_04_01
00001235 Cup_Small 00456 36 2006_04_01
00001236 Saucer 00456 64 2006_04_01
00001287 Carafe 00456 12 2006_04_01
00006931 Carafe 00927 3 2006_04_01
00006935 PotHolder 00927 88 2006_04_01
00006977 Napkin 00927 108 2006_04_01
00006979 Towel 00927 24 2006_04_01
00004488 CofMaker 08732 5 2006_04_01
00004490 CofGrinder 08732 9 2006_04_01
00004495 EspMaker 08732 4 2006_04_01
00006914 Cookbook 00927 12 2006_04_01

下面介绍了MERCH_INVENTORY表中的每个列:

COFFEE_HOUSES Table

COFFEE_HOUSES表存储了咖啡馆的位置:

STORE_ID CITY COFFEE MERCH TOTAL
10023 Mendocino 3450 2005 5455
33002 Seattle 4699 3109 7808
10040 SF 5386 2841 8227
32001 Portland 3147 3579 6726
10042 SF 2863 1874 4710
10024 Sacramento 1987 2341 4328
10039 Carmel 2691 1121 3812
10041 LA 1533 1007 2540
33005 Olympia 2733 1550 4283
33010 Seattle 3210 2177 5387
10035 SF 1922 1056 2978
10037 LA 2143 1876 4019
10034 San_Jose 1234 1032 2266
32004 Eugene 1356 1112 2468

下面介绍了COFFEE_HOUSES表中的每个列:

DATA_REPOSITORY Table

表 DATA_REPOSITORY 存储 URL,这些 URL 引用了 The Coffee Break 的文档和其他感兴趣的数据。脚本populate_tables.sql不会向该表添加任何数据。下面介绍了此表中的每个列:

Creating Tables

您可以使用 Apache Ant 或 JDBC API 创建表。

使用 Apache Ant 创建表

要创建与教程示例代码一起使用的表,请在目录<JDBC tutorial directory>中运行以下命令:

ant setup

此命令运行多个 Ant 目标,包括以下目标build-tables(来自build.xml文件):

<target name="build-tables"
  description="Create database tables">
  <sql
    driver="${DB.DRIVER}"
    url="${DB.URL}"
    userid="${DB.USER}"
    password="${DB.PASSWORD}"
    classpathref="CLASSPATH"
    delimiter="${DB.DELIMITER}"
    autocommit="false" onerror="abort">
    <transaction src=
  "./sql/${DB.VENDOR}/create-tables.sql"/>
  </sql>
</target>

该示例为以下sql Ant 任务参数指定值:

Parameter Description
driver JDBC 驱动程序的全限定类名。此示例对 Java DB 使用org.apache.derby.jdbc.EmbeddedDriver,对于 MySQL Connector/J 使用com.mysql.jdbc.Driver
url DBMS JDBC 驱动程序用来连接数据库的数据库连接 URL。
userid DBMS 中有效用户的名称。
password userid中指定的用户密码
classpathref 包含driver中指定的类的 JAR 文件的完整路径名
delimiter 分隔 SQL 语句的字符串 或字符。本示例使用分号(;)。
autocommit 布尔值;如果设置为false,则所有 SQL 语句均作为一个事务执行。
onerror 语句失败时执行的操作;可能的值为continuestopabort。值abort指定如果发生错误,则事务中止。

该示例将这些参数的值存储在单独的文件中。构建文件build.xml通过import任务检索以下值:

<import file="${ANTPROPERTIES}"/>

transaction元素指定一个包含要执行的 SQL 语句的文件。文件create-tables.sql包含创建此页上描述的所有表的 SQL 语句。例如,此文件的以下摘录创建表SUPPLIERSCOFFEES

create table SUPPLIERS
    (SUP_ID integer NOT NULL,
    SUP_NAME varchar(40) NOT NULL,
    STREET varchar(40) NOT NULL,
    CITY varchar(20) NOT NULL,
    STATE char(2) NOT NULL,
    ZIP char(5),
    PRIMARY KEY (SUP_ID));

create table COFFEES
    (COF_NAME varchar(32) NOT NULL,
    SUP_ID int NOT NULL,
    PRICE numeric(10,2) NOT NULL,
    SALES integer NOT NULL,
    TOTAL integer NOT NULL,
    PRIMARY KEY (COF_NAME),
    FOREIGN KEY (SUP_ID)
        REFERENCES SUPPLIERS (SUP_ID));

注意 :文件build.xml包含另一个名为drop-tables的目标,该目标删除了教程使用的表。 setup目标在运行build-tables目标之前先运行drop-tables

使用 JDBC API 创建表

以下方法SuppliersTable.createTable创建SUPPLIERS表:

public void createTable() throws SQLException {
    String createString =
        "create table " + dbName +
        ".SUPPLIERS " +
        "(SUP_ID integer NOT NULL, " +
        "SUP_NAME varchar(40) NOT NULL, " +
        "STREET varchar(40) NOT NULL, " +
        "CITY varchar(20) NOT NULL, " +
        "STATE char(2) NOT NULL, " +
        "ZIP char(5), " +
        "PRIMARY KEY (SUP_ID))";

    Statement stmt = null;
    try {
        stmt = con.createStatement();
        stmt.executeUpdate(createString);
    } catch (SQLException e) {
        JDBCTutorialUtilities.printSQLException(e);
    } finally {
        if (stmt != null) { stmt.close(); }
    }
}

以下方法CoffeesTable.createTable创建COFFEES表:

public void createTable() throws SQLException {
    String createString =
        "create table " + dbName +
        ".COFFEES " +
        "(COF_NAME varchar(32) NOT NULL, " +
        "SUP_ID int NOT NULL, " +
        "PRICE float NOT NULL, " +
        "SALES integer NOT NULL, " +
        "TOTAL integer NOT NULL, " +
        "PRIMARY KEY (COF_NAME), " +
        "FOREIGN KEY (SUP_ID) REFERENCES " +
        dbName + ".SUPPLIERS (SUP_ID))";

    Statement stmt = null;
    try {
        stmt = con.createStatement();
        stmt.executeUpdate(createString);
    } catch (SQLException e) {
        JDBCTutorialUtilities.printSQLException(e);
    } finally {
        if (stmt != null) { stmt.close(); }
    }
}

在这两种方法中,conConnection对象,而dbName是在其中创建表的数据库的名称。

要执行 SQL 查询(例如String createString指定的查询),请使用Statement对象。若要创建Statement对象,请从现有Connection对象中调用方法Connection.createStatement。要执行 SQL 查询,请调用Statement.executeUpdate方法。

关闭所有Statement对象时,将关闭所有创建它们的连接。但是,良好的编码习惯是在完成Statement对象后立即将其关闭。这允许立即释放该语句使用的任何外部资源。通过调用方法Statement.close关闭语句。将此语句放在finally中,以确保即使由于抛出异常(例如SQLException)而中断了正常程序流,该语句也可以关闭。

注意 :您必须在COFFEES之前创建SUPPLIERS表,因为COFFEES包含引用SUPPLIERS的外键SUP_ID

Populating Tables

同样,您可以使用 Apache Ant 或 JDBC API 将数据插入表中。

使用 Apache Ant 填充表

除了创建本教程使用的表之外,命令ant setup还会填充这些表。此命令运行 Ant 目标populate-tables,后者运行 SQL 脚本populate-tables.sql

以下是来自populate-tables.sql的摘录,该摘录填充了表SUPPLIERSCOFFEES

insert into SUPPLIERS values(
    49, 'Superior Coffee', '1 Party Place',
    'Mendocino', 'CA', '95460');
insert into SUPPLIERS values(
    101, 'Acme, Inc.', '99 Market Street',
    'Groundsville', 'CA', '95199');
insert into SUPPLIERS values(
    150, 'The High Ground',
    '100 Coffee Lane', 'Meadows', 'CA', '93966');
insert into COFFEES values(
    'Colombian', 00101, 7.99, 0, 0);
insert into COFFEES values(
    'French_Roast', 00049, 8.99, 0, 0);
insert into COFFEES values(
    'Espresso', 00150, 9.99, 0, 0);
insert into COFFEES values(
    'Colombian_Decaf', 00101, 8.99, 0, 0);
insert into COFFEES values(
    'French_Roast_Decaf', 00049, 9.99, 0, 0);

使用 JDBC API 填充表

以下方法SuppliersTable.populateTable将数据插入表中:

public void populateTable() throws SQLException {

    Statement stmt = null;
    try {
        stmt = con.createStatement();
        stmt.executeUpdate(
            "insert into " + dbName +
            ".SUPPLIERS " +
            "values(49, 'Superior Coffee', " +
            "'1 Party Place', " +
            "'Mendocino', 'CA', '95460')");

        stmt.executeUpdate(
            "insert into " + dbName +
            ".SUPPLIERS " +
            "values(101, 'Acme, Inc.', " +
            "'99 Market Street', " +
            "'Groundsville', 'CA', '95199')");

        stmt.executeUpdate(
            "insert into " + dbName +
            ".SUPPLIERS " +
            "values(150, " +
            "'The High Ground', " +
            "'100 Coffee Lane', " +
            "'Meadows', 'CA', '93966')");
    } catch (SQLException e) {
        JDBCTutorialUtilities.printSQLException(e);
    } finally {
        if (stmt != null) { stmt.close(); }
    }
}

以下方法CoffeesTable.populateTable将数据插入表中:

public void populateTable() throws SQLException {

    Statement stmt = null;
    try {
        stmt = con.createStatement();
        stmt.executeUpdate(
            "insert into " + dbName +
            ".COFFEES " +
            "values('Colombian', 00101, " +
            "7.99, 0, 0)");

        stmt.executeUpdate(
            "insert into " + dbName +
            ".COFFEES " +
            "values('French_Roast', " +
            "00049, 8.99, 0, 0)");

        stmt.executeUpdate(
            "insert into " + dbName +
            ".COFFEES " +
            "values('Espresso', 00150, 9.99, 0, 0)");

        stmt.executeUpdate(
            "insert into " + dbName +
            ".COFFEES " +
            "values('Colombian_Decaf', " +
            "00101, 8.99, 0, 0)");

        stmt.executeUpdate(
            "insert into " + dbName +
            ".COFFEES " +
            "values('French_Roast_Decaf', " +
            "00049, 9.99, 0, 0)");
    } catch (SQLException e) {
        JDBCTutorialUtilities.printSQLException(e);
    } finally {
        if (stmt != null) {
          stmt.close();
        }
    }
}
首页