📄 0019.htm
字号:
<html>
<head>
<title>新时代软件教程:操作系统 主页制作 服务器 设计软件 网络技术 编程语言 文字编辑</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style>
<!--
body, table {font-size: 9pt; font-family: 宋体}
a {text-decoration:none}
a:hover {color: red;text-decoration:underline}
.1 {background-color: rgb(245,245,245)}
-->
</style>
</head>
<p align="center"><script src="../../1.js"></script></a>
<p align="center"><big><strong>JDBC 入门 -- 设置表</strong></big></p>
<p align="right">---摘自Jsper</p>
创建表<BR> 首先,我们在我们的示例数据库创建其中一张表
COFFEES,包含在咖啡店所卖咖啡的必要的信息,包括咖啡名字,他们的价格,本星期卖了多少磅及迄今为止卖的数目。关于 COFFEES
表我们以后会详细描述,如下: <BR><BR>COF_NAME SUP_ID PRICE SALES TOTAL <BR>Colombian 101 7.99
0 0 <BR>French_Roast 49 8.99 0 0 <BR>Espresso 150 9.99 0 0 <BR>Colombian_Decaf
101 8.99 0 0 <BR>French_Roast_Decaf 49 9.99 0 0 <BR><BR> 存储咖啡名的列是 COF_NAME,它的
SQL 数据类型是 VARCHAR,最大的长度为 32
个字符。因为我们所卖的每种类型咖啡都使用不同的名字,名字可用于作为唯一识别咖啡的标识,因此可用于作主键。第二个列叫 SUP_ID,用于保存咖啡供应商标识;其
SQL 数据类型为 INTEGER。第 3 列叫 PRICE,因为它需要保存带小数的十进制数,因此它的 SQL 类型为 FLOAT。(注意,通常钱的 SQL
类型为 DECIMAL 或 NUMERIC,但在不同 DBMSs 间存在差异,为了避免于老版本的 JDBC 的不兼容性在本教程我们采用更标准的 FLOAT
类型)SALES 列的 SQL 类型为 INTEGER,其值为本星期所卖咖啡的磅数。最后一列,TOTAL 的 SQL 类型为
INTEGER,保存了迄今为止所卖咖啡的总磅数。<BR><BR> 数据库里的第二个表 SUPPLIERS,保存了每个供应商的信息:<BR><BR>SUP_ID
SUP_NAME STREET CITY STATE ZIP <BR>101 Acme, Inc. 99 Market Street Groundsville
CA 95199 <BR>49 Superior Coffee 1 Party Place Mendocino CA 95460 <BR>150 The
High Ground 100 Coffee Lane Meadows CA 93966 <BR><BR> COFFEES 跟 SUPPLIERS 都包含列
SUP_ID,它意味着可以用 SELECT 语句从这两张表中取得有关信息。列 SUP_ID 是 SUPPLIERS 表的主键,用于唯一识别每个咖啡供应商。在
COFFEES 表中,SUP_ID 列被称外键。注意每个 SUP_ID 值在 SUPPLIERS 表里只出现一次;这对主键是必须的。在 COFFEES
表里,它作为外键,显然它可以有重复的 SUP_ID 值,因为同一供应商可以提供很多种的咖啡。在本节的最后,你将看见如何在 SELECT
语句中使用主键及外键的一个例子。 <BR><BR> 下面的 SQL 语句用于创建 COFFEES 表。列由列名跟空格跟 SQL 类型组成。列(包括列名及其
SQL 类型)跟下一个之间用逗号分隔。VARCHAR 类型创建定义了最大长度, 因此它需要有一个参数来表示最大长度。参数必须在类型后面的括号内。SQL
语句如下,列 COF_NAME 的长度 被限定为不得超过 32 个字符: <BR><BR>CREATE TABLE COFFEES<BR>(COF_NAME
VARCHAR(32),<BR>SUP_ID INTEGER,<BR>PRICE FLOAT,<BR>SALES INTEGER,<BR>TOTAL
INTEGER)<BR><BR> 这些代码不带 DBMS 语句结束符, 因为每个 DBMS 都可能不同。例如, Oracle 使用一个分号 (;)
作为语句的结束,而 Sybase 使用 go。你所使用的驱动程序会自动提供合适的语句结束符,因此你无须把它包括在你的 JDBC
代码中。<BR><BR> 另外,我们应该指出的的是 SQL 语句的格式。在 CREATE TABLE
语句中,关键字采用大写字符,并且每个项目都另起一行。SQL 并没有此要求;仅仅是为了更容易阅读。SQL 标准是不区分关键词的大小写的, 因此,如下例中的
SELECT 语句可以有多种写法。因此下面两个不同写法的语句对 SQL 来说是一样的。<BR><BR>SELECT First_Name,
Last_Name<BR>FROM Employees<BR>WHERE Last_Name LIKE "Washington"<BR><BR>select
First_Name, Last_Name from Employees where<BR>Last_Name like
"Washington"<BR><BR> 然而,引号里的内容是区分大小写的:在名字"Washington" 里 "W"
必须被大写,并且余下的字符必须是小写的。<BR><BR> 对于标识,不同的 DBMS 有不同的要求,例如, 某些 DBMSs
要求那些列名及表名必须跟创建时的一样,有些则没有此要求。为安全起见,我们全部使用大写标识如
COFFEES、SUPPLIERS,因为我们是那样定义他们的。<BR><BR> 到止我们写了创建 COFFEES 表的 SQL
语句。现在我们在它外面加上引号(使它成为字符串),并且字符串赋值给变量 createTableCoffees,在以后的 JDBC
代码中我们可以使用此变量。正如看到的,DBMS 并不在意分行,但对 Java 语言来,String 对象分行是通不过编译的。因而,我们可以用加号 (+)
把每一行的串连接。<BR><BR>String createTableCoffees = "CREATE TABLE COFFEES "
+<BR>"(COF_NAME VARCHAR(32), SUP_ID INTEGER, PRICE FLOAT, " +<BR>"SALES INTEGER,
TOTAL INTEGER)";<BR><BR> 我们在 CREATE TABLE 语句中使用的数据类型是通用的 SQL 类型(也称 JDBC 类型)它们在类
java.sql.Types 中定义。DBMSs 通常使用这些标准的类型,因此,当你要尝试一些 JDBC 应用程序时,你可以直接使用
CreateCoffees.java 应用程序,它使用了 CREATE TABLE 语句。如果你的 DBMS
使用了它的自己的本地的类型名字,我们为你供应其它的应用程序,我们将在后面详细解释。 <BR><BR> 在运用任何应用程序前,当然,我们将让你了解 JDBC
的基础。<BR><BR>创建 JDBC Statements 对象<BR> Statement 对象用于把 SQL 语句发送到 DBMS
。你只须简单地创建一个 Statement 对象并且然后执行它,使用适当的方法执行你发送的 SQL 语句。对 SELECT 语句来说,可以使用
executeQuery。要创建或修改表的语句,使用的方法是 executeUpdate。<BR><BR> 需要一个活跃的连接的来创建 Statement
对象的实例。在下面的例子中,我们使用我们的 Connection 对象 con 创建 Statement 对象 stmt:<BR><BR>Statement
stmt = con.createStatement();<BR><BR> 到此 stmt 已经存在了,但它还没有把 SQL 语句传递到
DBMS。我们需要提供 SQL 语句作为参数提供给我们使用的 Statement 的方法。例如,在下面的代码段里,我们使用上面例子中的 SQL 语句作为
executeUpdate 的参数:<BR><BR>stmt.executeUpdate("CREATE TABLE COFFEES "
+<BR>"(COF_NAME VARCHAR(32), SUP_ID INTEGER, PRICE FLOAT, " +<BR>"SALES INTEGER,
TOTAL INTEGER)");<BR><BR> 因为我们已经把 SQL 语句赋给了 createTableCoffees
变量,我们可以如下方式书写代码:<BR><BR>stmt.executeUpdate(createTableCoffees);<BR><BR>执行语句<BR> 我们使用
executeUpdate 方法是因为在 createTableCoffees 中的 SQL 语句是 DDL (数据定义语言)语句。创建表,改变表,删除表都是
DDL 语句的例子,要用 executeUpdate 方法来执行。你也可以从它的名字里看出,方法 executeUpdate 也被用于执行更新表 SQL
语句。实际上,相对于创建表来说,executeUpdate 用于更新表的时间更多,因为表只需要创建一次,但经常被更新。<BR><BR> 被使用最多的执行
SQL 语句的方法是 executeQuery。这个方法被用来执行 SELECT 语句,它几乎是使用最多的 SQL 语句。马上你将看到如何使用这个方法。
<BR><BR>在表中输入数据<BR> 我们已经显示了如何通过指定列名、数据类型来创建表
COFFEES,但是这仅仅建立表的结构。表还没有任何数据。我们将次输入一行数据到表中,提供每列的信息,注意插入的数据显示顺序跟表创建时候是一样的,既缺省顺序。
<BR><BR> 下列代码插入一个行数据,COF_NAME 的值为 Colombian,SUP_ID 为 101,PRICE 为 7.99,SALES
0,TOTAL 0。就象创建 COFFEES 表一样,我们创建一 Statement 对象,并执行 executeUpdate 方法。<BR><BR> 因为
SQL 语句一行显示不下,因此我们把它分为两行,并用加号 (+) 相连。特别要注意的是,在 COFFEES 和 VALUES
之间要有空格。这个空格必须在引号之内并且要在 COFFEES 跟 VALUES 之间;没有这个空格,SQL 语句将被错误地被读作为 "INSERT INTO
COFFEESVALUES ...",并且 DBMS 将寻找表 COFFEESVALUES。还要注意的是在 coffee name
上我们使用了单引号。<BR><BR>Statement stmt =
con.createStatement();<BR>stmt.executeUpdate(<BR>"INSERT INTO COFFEES " +
<BR>"VALUES ('Colombian', 101, 7.99, 0, 0)");<BR><BR> 下面的代码把第二行插入到表 COFFEES
中。我们可以在使用 Statement 对象而无须为每次执行创建一个新的。<BR><BR>stmt.executeUpdate("INSERT INTO
COFFEES " +<BR>"VALUES ('French_Roast', 49, 8.99, 0,
0)");<BR><BR> 剩下行的数据如下:<BR><BR>stmt.executeUpdate("INSERT INTO COFFEES "
+<BR>"VALUES ('Espresso', 150, 9.99, 0, 0)");<BR>stmt.executeUpdate("INSERT INTO
COFFEES " +<BR>"VALUES ('Colombian_Decaf', 101, 8.99, 0,
0)");<BR>stmt.executeUpdate("INSERT INTO COFFEES " +<BR>"VALUES
('French_Roast_Decaf', 49, 9.99, 0, 0)");<BR><BR>从表中取得数据<BR> 既然表 COFFEES
中已经有数据了,我们就可以写一个 SELECT 语句来取得这些值。下面的 SQL 语句中星号 (*) 表示选择所有的列。因为没有用 WHERE
子句来限制所选的行,因此下面的 SQL 语句选择的是整个表。 <BR><BR>SELECT * FROM
COFFEES<BR><BR> 结果是整个表的数据,如下:<BR><BR>COF_NAME SUP_ID PRICE SALES
TOTAL<BR>--------------- ------ ----- ----- -----<BR>Colombian 101 7.99 0
0<BR>French_Roast 49 8.99 0 0<BR>Espresso 150 9.99 0 0<BR>Colombian_Decaf 101
8.99 0 0<BR>French_Roast_Decaf 49 9.99 0 0<BR><BR> 如果你直接在数据库系统里输入 SQL
查询语句,你将在你的终端上看到如上的结果。当我们通过一个 Java
应用程序存取一个数据库时,正如我们马上要做的一样,我们需要检索结果以便我们能使用他们。你将在下一节看到如何实现。 <BR><BR>这是 SELECT
语句的另一个例子,这将得到咖啡及其各自每磅单价的列表。<BR><BR>SELECT COF_NAME, PRICE FROM
COFFEES<BR><BR>查询的结果集将具有如下形式:<BR><BR>COF_NAME PRICE<BR>-------- ----------
-----<BR>Colombian 7.99<BR>French_Roast 8.99<BR>Espresso 9.99<BR>Colombian_Decaf
8.99<BR>French_Roast_Decaf 9.99<BR><BR>上面 SELECT 语句取得了所有咖啡的名字及价格。而下面的 SELECT
语句限制那些每磅价格低于 $9.00 的咖啡才被选择。 <BR>SELECT COF_NAME, PRICE<BR>FROM COFFEES<BR>WHERE
PRICE < 9.00<BR><BR>结果集将具有如下形式:<BR><BR>COF_NAME PRICE<BR>-------- -------
-----<BR>Colombian 7.99<BR>French_Roast 8.99<BR>Colombian Decaf 8.99<BR><BR>
</table>
<p align="center"><script src="../../2.js"></script></a>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -