设置表格
本页描述了 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
表中的每个列:
-
COF_NAME
:存储咖啡名称。保留 SQL 类型为VARCHAR
的值,最大 Long 度为 32 个字符。因为每种出售的咖啡的名称都不相同,所以该名称唯一地标识特定的咖啡并用作主键。 -
SUP_ID
:存储标识咖啡供应商的编号。保留 SQL 类型为INTEGER
的值。它被定义为引用SUPPLIERS
表中的SUP_ID
列的外键。因此,DBMS 将强制此列中的每个值与SUPPLIERS
表中相应列中的值之一匹配。 -
PRICE
:存储每磅咖啡的成本。保留 SQL 类型为FLOAT
的值,因为它需要保留带小数点的值。 (请注意,货币值通常存储在 SQL 类型DECIMAL
或NUMERIC
中,但是由于 DBMS 之间存在差异,并且为了避免与 JDBC 的早期版本不兼容,本教程使用了更标准的类型FLOAT
.) -
SALES
:存储当前一周出售的咖啡磅数。保留 SQL 类型为INTEGER
的值。 -
TOTAL
:存储迄今为止出售的咖啡磅数。保留 SQL 类型为INTEGER
的值。
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
表中的每个列:
-
SUP_ID
:存储标识咖啡供应商的编号。保留 SQL 类型为INTEGER
的值。它是此表中的主键。 -
SUP_NAME
:存储咖啡供应商的名称。 -
STREET
,CITY
,STATE
和ZIP
:这些列存储咖啡供应商的地址。
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
表中的每个列:
-
WAREHOUSE_ID
:存储标识仓库的编号。 -
COF_NAME
:存储特定类型的咖啡的名称。 -
SUP_ID
:存储标识供应商的编号。 -
QUAN
:存储一个数字,指示可用的商品数量。 -
DATE
:存储时间戳值,该值指示上次更新该行的时间。
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
表中的每个列:
-
ITEM_ID
:存储用于标识项 Object 数字。 -
ITEM_NAME
:存储项 Object 名称。 -
SUP_ID
:存储标识供应商的编号。 -
QUAN
:存储一个数字,指示该项目可用的数量。 -
DATE
:存储时间戳值,该值指示上次更新该行的时间。
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
表中的每个列:
-
STORE_ID
:存储标识咖啡馆的数字。除其他事项外,它指示咖啡馆所在的状态。以 10 开头的值表示该 State 为加利福尼亚 State。以 32 开头的STORE_ID
值表示俄勒冈 State,以 33 开头的STORE_ID
值表示华盛顿 State。 -
CITY
:存储咖啡馆所在城市的名称。 -
COFFEE
:存储一个数字,指示出售的咖啡量。 -
MERCH
:存储一个数字,指示已售商品的数量。 -
TOTAL
:存储一个数字,指示出售的咖啡和商品的总量。
DATA_REPOSITORY Table
表 DATA_REPOSITORY 存储 URL,这些 URL 引用了 The Coffee Break 的文档和其他感兴趣的数据。脚本populate_tables.sql
不会向该表添加任何数据。下面介绍了此表中的每个列:
-
DOCUMENT_NAME
:存储标识 URL 的字符串。 -
URL
:存储 URL。
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 | 语句失败时执行的操作;可能的值为continue ,stop 和abort 。值abort 指定如果发生错误,则事务中止。 |
该示例将这些参数的值存储在单独的文件中。构建文件build.xml
通过import
任务检索以下值:
<import file="${ANTPROPERTIES}"/>
transaction
元素指定一个包含要执行的 SQL 语句的文件。文件create-tables.sql
包含创建此页上描述的所有表的 SQL 语句。例如,此文件的以下摘录创建表SUPPLIERS
和COFFEES
:
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(); }
}
}
在这两种方法中,con
是Connection
对象,而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
的摘录,该摘录填充了表SUPPLIERS
和COFFEES
:
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();
}
}
}