首先,我们创建一张例中用到的表。COFFEES表包含了Coffee Break出售咖啡的基本信息:咖啡名称、价格、本周销售量(磅)及迄今销售量(磅)。COFFEES表的内容如下,后面会更加详细地描述。
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 |
存储咖啡名称的列是COF_NAME,可保存最大长度为32个字符的VARCHAR SQL类型数值。由于销售的每种咖啡使用不同名称,因此它可作为主键,惟一标识一种特定咖啡。第二列(SUP_ID)保存一个数字,标识咖啡供应商;这个数字是INTEGER SQL类型。第三列(PRICE)存储FLOAT SQL类型的数值,因为它需要保存带有小数点的数值(注意,货币一般存储在DECIMAL或NUMERIC SQL类型中,但是因为各DBMS间有区别,为避免与较老版本的JDBC不兼容,所以本教程使用更加标准的FLOAT类型)。SALES这一列存储INTEGER SQL类型,表示本周销售量(磅)。最后一列(TOTAL)包含SQL INTEGER类型,表示迄今销售量(磅)。
数据库的第二张表SUPPLIERS给出了各个供应商的信息:
SUP_ID |
SUP_NAME |
STREET |
CITY |
STATE |
ZIP |
101 |
Acme, Inc. |
99 Market Street |
Groundsville |
CA |
95199 |
49 |
Superior Coffee |
1 Party Place |
Mendocino |
CA |
95460 |
150 |
The High Ground |
100 Coffee Lane |
Meadows |
CA |
93966 |
COFFEES表和SUPPLIERS表都包含SUP_ID列,表明可在SELECT语句中关联这两张表的信息以检索数据。SUP_ID列是SUPPLIERS表的主键,它惟一标识了每个供应商。在COFFEES表中,SUP_ID称为外键(就其是从另一张表引入的而言,外键可认为是外来的)。每个SUP_ID在SUPPLIERS表中只出现一次,因为它是主键。但在COFFEES表中,它却是一个外键,完全有可能出现重复的SUP_ID,因为一个供应商可能销售多种咖啡。本讲后面会例示如何在SELECT语句中使用主键和外键。
下面SQL语句创建了COFFEES表。外括号内的项由列名后跟空格和该列要存储的SQL类型组成。逗号将各个列项(由列名和SQL类型组成)隔开。创建VARCHAR类型时要指定最大长度,因此它带有一个指出最大长度的参数。参数要放在类型后面的括号中。例如,下面的SQL语句指出COF_NAME列中的名称最多只有32个字符:
CREATE TABLE COFFEES
(COF_NAME VARCHAR(32),
SUP_ID INTEGER,
PRICE FLOAT,
SALES INTEGER,
TOTAL INTEGER)
这段代码没有DBMS语句结束符,各种DBMS的语句结束符各不相同。例如,Oracle用分号指出语句结束,Sybase用单词go结束语句。驱动程序会自动提供适当的语句结束符,您不必在JDBC代码中包含它们。
关于SQL语句另外应该指出的一点是它的形式。在CREATE TABLE语句中,关键字都以大写字母输入,每项占一行。SQL不要求这样,这些规定只是让语句易于阅读。SQL的标准是关键字不区分大小写,因此下面的语句可以用各种形式编写。就SQL而言,如下两个版本是等价的:
SELECT First_Name, Last_Name
FROM Employees
WHERE Last_Name LIKE "Washington"
select First_Name, Last_Name from Employees where
Last_Name like "Washington"
但引号内的字符区分大小写:在名称“Washington”中,“W”必须大写,其余字母必须小写。
在标识符名称使用上,DBMS间要求可能不一样。如有些DBMS要求给出的列名和表名与在CREATE TABLE语句中创建时的名称完全相同,而另一些DBMS则无此要求。为安全起见,这里标识符(如COFFEES和SUPPLIERS)都用大写,因为定义时就是用大写。
至此创建表COFFEES的SQL语句已写完。现在将它用引号引起来(使之成为字串),然后赋予变量createTableCoffees,以在后面JDBC代码中使用该变量。如刚才所示,DBMS不关心分行位置,但在Java编程语言中,超过一行的String对象将不能编译。因此,当使用字串时,要将每行放在引号中,再用一个加号(+)将其连接起来:
String createTableCoffees = "CREATE TABLE COFFEES " +
"(COF_NAME VARCHAR(32), SUP_ID INTEGER, PRICE FLOAT, " +
"SALES INTEGER, TOTAL INTEGER)";
CREATE TABLE语句中使用的数据类型是类java.sql.Types中定义的通用SQL类型(亦称JDBC类型)。DBMS一般使用这些标准数据类型,因此要试验一些JDBC应用程序时,就可以使用包含CREATE TABLE语句的CreateCoffees.java应用程序。如果您的DBMS使用自己的局部类型名称,我们会为您提供另一应用程序(后面有完整解释)。
在运行程序前,我们还是先来学习一下JDBC的基础知识。
创建JDBC语句
Statement对象可将SQL语句发送到DBMS。这只要创建一个Statement对象,将想要执行的SQL语句传递给适当的执行方法,然后执行该Statement对象。对于SELECT语句,使用的方法是executeQuery。对于创建或修改表的语句,使用的方法是executeUpdate。
Statement对象是用活动连接实例创建的。下面的例子使用Connection对象con来创建Stetement对象stmt:
Statement stmt = con.createStatement();
至此stmt对象已存在,但它没有要在DBMS上执行的SQL语句。您需供应用于执行stmt的方法。下面代码段中将上例的SQL语句传递给executeUpdate:
stmt.executeUpdate("CREATE TABLE COFFEES " +
"(COF_NAME VARCHAR(32), SUP_ID INTEGER, PRICE FLOAT, " +
"SALES INTEGER, TOTAL INTEGER)");
由于SQL语句已转成字符串并赋给了变量createTableCoffees,因此可用如下代码替换:
stmt.executeUpdate(createTableCoffees
);
执行语句
这里使用executeUpdate方法,因为createTableCoffees中的SQL语句是一条DDL(数据描述语言)语句。创建、修改或删除表的语句都是DDL语句,要用executeUpdate方法执行。顾名思义,executeUpdate方法也执行更新表的SQL语句。在实际应用中,executeUpdate方法常用于更新表,而不是创建表,因为表只创建一次,但可能多次更新。
执行SQL语句最常用的方法是executeQuery。这个方法用于执行涵盖了大多数SQL语句的SELECT语句。您马上会看到这种方法的使用。
在表中插入数据
我们已经例示了通过指定列名及其数据类型创建COFFEES表,但这只是创建表结构。表中还没有任何数据。通过提供行中要存储的列信息,就可在表中每次添加一行数据。但插入到列中的数值要与创建表时声明的列顺序(默认顺序)一致。
下面代码插入了一行数据:COF_NAME列的值是Colombian,SUP_ID列是101,PRICE列是7.99,SALES列是0,TOTAL列是0(由于Coffee Break刚开张,所有咖啡才开始销售,所以本周销售量和迄今销售量都为0)。如同创建COFFEESS表的代码所做的一样,我们将创建一个Statement对象,然后用executeUpdate方法执行它。
因为SQL语句在页面的一行中放不下,所以要把它分成两个字符串,再用加号(+)将它连起来,使得它可以编译。特别要注意的是,需要在COFFEES和VALUES间加一个空格。这个空格必须放在引号内,可位于COFFEES之后或VALUES之前;没有这个空格,SQL语句将错误认为是“ INSERT INTO COFFEESVALUES . . .”,接着DBMS将查找COFFEESVALUES表。还要注意在咖啡名上用单引号,因为它嵌套在双引号中。对于多数DBMS,一般规则是切换双引号和单引号以指明嵌套。
Statement stmt = con.createStatement();
stmt.executeUpdate(
"INSERT INTO COFFEES " +
"VALUES ('Colombian', 101, 7.99, 0, 0)");
下面代码在COFFEES表中插入第二行数据。您不必为每次执行创建新的Statement对象,完全可以重用Statement对象stmt。
stmt.executeUpdate("INSERT INTO COFFEES " +
"VALUES ('French_Roast', 49, 8.99, 0, 0)");
插入的其他行数据如下:
stmt.executeUpdate("INSERT INTO COFFEES " +
"VALUES ('Espresso', 150, 9.99, 0, 0)");
stmt.executeUpdate("INSERT INTO COFFEES " +
"VALUES ('Colombian_Decaf', 101, 8.99, 0, 0)");
stmt.executeUpdate("INSERT INTO COFFEES " +
"VALUES ('French_Roast_Decaf', 49, 9.99, 0, 0)");
从表中取数据
既然COFFEES表中有了数据,您就可以编写SELECT语句访问这些数据了。下面SQL语句中的星号(*)指出所有的列都应该选出。由于没有WHERE语句限制要选出的行,所以下面的SQL语句将检出整张表:
SELECT * FROM COFFEES
执行结果是检出整张表,如下所示:
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
如果直接在数据库系统中输入上面的SQL查询,就可在屏幕上看到上面的结果。Java应用程序访问数据库时要先检出数据以便使用。下一节会看到如何实现。
下面是另一条SELECT语句;这条语句将检出咖啡价格表(每磅):
SELECT COF_NAME, PRICE FROM COFFEES
这个查询的结果如下:
COF_NAME PRICE
-------- ---------- -----
Colombian 7.99
French_Roast 8.99
Espresso 9.99
Colombian_Decaf 8.99
French_Roast_Decaf 9.99
上面SELECT语句列出所有咖啡的名称及价格。下面的SQL语句将列出每磅单价小于$9.00的咖啡:
SELECT COF_NAME, PRICE
FROM COFFEES
WHERE PRICE < 9.00
执行结果如下:
COF_NAME PRICE
-------- ------- -----
Colombian 7.99
French_Roast 8.99
Colombian Decaf 8.99
相关推荐
### JDBC详解(基础版本) #### 一、JDBC概述 **1.1 什么是JDBC?** JDBC(Java Database Connectivity)是Java平台上的数据库访问技术。简而言之,它是Java语言与各种数据库进行交互的桥梁。通过JDBC,开发者...
### JDBC基础知识总结 #### 一、概述 JDBC(Java Database Connectivity)是一种标准的Java API,用于连接并操作各种类型的数据库。它从物理结构上说就是一套Java语言访问数据库的接口集合,本质上则是调用者...
### JDBC基础教程之ResultSet对象详解 #### 一、ResultSet对象概览 `ResultSet`对象是Java Database Connectivity (JDBC) API中的一个核心组件,用于处理SQL查询结果。它充当了一个临时的数据存储,其中包含了所有...
二、JDBC基础 1. 驱动加载:JDBC操作的第一步是加载数据库驱动,通过Class.forName()方法指定驱动类名,如"com.mysql.jdbc.Driver"。 2. 数据库连接:使用DriverManager.getConnection()方法建立到数据库的连接,...
二、JDBC的API * java.sql包和javax.sql包 * Driver接口(驱动):在加载某一Driver类时,它应该创建自己的实例并向DriverManager注册该实例。 * DriverManager类(驱动管理器):可以创建连接,它本身就是一个创建...
### JDBC基础教程之概述 #### 一、JDBC简介与概念理解 JDBC(Java Database Connectivity)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC的...
### JDBC基础 1. **JDBC简介**:JDBC是Java API,用于与各种数据库进行连接,执行SQL语句并处理结果。它提供了一套统一的接口,使得开发者无需关心底层数据库的细节。 2. **JDBC驱动**:根据不同的数据库系统,...
### JDBC基础教程之连接知识点详解 #### 一、Connection对象及其作用 - **Connection对象**:在JDBC中,`Connection`对象代表了一个与数据库之间的连接。通过这个连接,应用程序可以执行SQL语句并获取结果集。 - *...
总之,JDBC规范文档是了解Java数据库编程的基础,无论是数据库开发者、还是应用程序开发者,都需要对其规范有深入的理解。通过遵循JDBC规范,开发者可以编写出能够在多种数据库系统中移植的代码,同时确保代码的可...
**JDBC 入门知识详解** ...综上所述,JDBC是Java与数据库交互的基础,理解其工作原理和最佳实践对于任何Java开发者来说都至关重要。通过深入学习,我们可以更有效地构建健壮且高效的数据库应用程序。
### JDBC基础知识点详解 #### 一、JDBC概述 **JDBC** (Java Database Connectivity) 是 Java 开发者用来访问数据库的重要技术之一。它提供了一组标准的接口和类,使得开发者可以使用 Java 语言来编写数据库应用...
- `java.sql`包含基础的JDBC类和接口,如`Connection`, `Statement`, `ResultSet`等。 - `javax.sql`包含高级功能,例如`DataSource`等。 - **`DriverManager`类**: - **作用**:用于创建与数据库的连接。 - *...
### JDBC基础教程之驱动设置详解 #### 一、概述与DriverManager的作用 JDBC(Java Database Connectivity)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和...
### JDBC基础教程之PreparedStatement知识点详解 #### 一、概述 `PreparedStatement`是Java数据库连接(JDBC)API中的一种重要接口,它继承自`Statement`接口,并在其基础上进行了扩展和优化。`PreparedStatement`...
**JDBC基础应用详解** **一、JDBC概述** JDBC(Java Database Connectivity)是Java语言与各种数据库之间通信的标准接口,由Sun Microsystems公司开发并引入Java平台,它允许Java程序通过标准API来访问和操作...
一、JDBC基础 1. JDBC驱动管理:在Java程序中,我们需要加载对应的JDBC驱动来建立与Oracle数据库的连接。Oracle提供了四种类型的JDBC驱动,从早期的JDBC-ODBC桥接驱动到现代的 thin 驱动,每种都有其特定的应用场景...