JDBC 入門(三) - 設定表

來源:互聯網
上載者:User

作者:axeon
建立表
   首先,我們在我們的樣本資料庫建立其中一張表 COFFEES,包含在咖啡店所賣咖啡的必要的資訊,包括咖啡名字,他們的價格,本星期賣了多少磅及迄今為止賣的數目。關於 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,它的 SQL 資料類型是 VARCHAR,最大的長度為 32 個字元。因為我們所賣的每種類型咖啡都使用不同的名字,名字可用於作為唯一識別咖啡的標識,因此可用於作主鍵。第二個列叫 SUP_ID,用於儲存咖啡供應商標識;其 SQL 資料類型為 INTEGER。第 3 列叫 PRICE,因為它需要儲存帶小數的十進位數,因此它的 SQL 類型為 FLOAT。(注意,通常錢的 SQL 類型為 DECIMAL 或 NUMERIC,但在不同 DBMSs 間存在差異,為了避免於老版本的 JDBC 的不相容性在本教程我們採用更標準的 FLOAT 類型)SALES 列的 SQL 類型為 INTEGER,其值為本星期所賣咖啡的磅數。最後一列,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 標準是不區分關鍵詞的大小寫, 因此,如下例中的 SELECT 語句可以有多種寫法。因此下面兩個不同寫法的語句對 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 有不同的要求,例如, 某些 DBMSs 要求那些列名及表名必須跟建立時的一樣,有些則沒有此要求。為安全起見,我們全部使用大寫標識如 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 語句中使用的資料類型是通用的 SQL 類型(也稱 JDBC 類型)它們在類 java.sql.Types 中定義。DBMSs 通常使用這些標準的類型,因此,當你要嘗試一些 JDBC 應用程式時,你可以直接使用 CreateCoffees.java 應用程式,它使用了 CREATE TABLE 語句。如果你的 DBMS 使用了它的自己的本地的類型名字,我們為你供應其它的應用程式,我們將在後面詳細解釋。

   在運用任何應用程式前,當然,我們將讓你瞭解 JDBC 的基礎。

建立 JDBC Statements 對象
   Statement 對象用於把 SQL 陳述式發送到 DBMS 。你只須簡單地建立一個 Statement 對象並且然後執行它,使用適當的方法執行你發送的 SQL 陳述式。對 SELECT 語句來說,可以使用 executeQuery。要建立或修改表的語句,使用的方法是 executeUpdate。

   需要一個活躍的串連的來建立 Statement 對象的執行個體。在下面的例子中,我們使用我們的 Connection 對象 con 建立 Statement 對象 stmt:

Statement stmt = con.createStatement();

   到此 stmt 已經存在了,但它還沒有把 SQL 陳述式傳遞到 DBMS。我們需要提供 SQL 陳述式作為參數提供給我們使用的 Statement 的方法。例如,在下面的程式碼片段裡,我們使用上面例子中的 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 (資料定義語言 (Data Definition Language))語句。建立表,改變表,刪除表都是 DDL 語句的例子,要用 executeUpdate 方法來執行。你也可以從它的名字裡看出,方法 executeUpdate 也被用於執行更新表 SQL 陳述式。實際上,相對於建立表來說,executeUpdate 用於更新表的時間更多,因為表只需要建立一次,但經常被更新。

   被使用最多的執行 SQL 陳述式的方法是 executeQuery。這個方法被用來執行 SELECT 語句,它幾乎是使用最多的 SQL 陳述式。馬上你將看到如何使用這個方法。

在表中輸入資料
   我們已經顯示了如何通過指定列名、資料類型來建立表 COFFEES,但是這僅僅建立表的結構。表還沒有任何資料。我們將次輸入一行資料到表中,提供每列的資訊,注意插入的資料顯示順序跟表建立時候是一樣的,既預設順序。

   下列代碼插入一個行資料,COF_NAME 的值為 Colombian,SUP_ID 為 101,PRICE 為 7.99,SALES 0,TOTAL 0。就象建立 COFFEES 表一樣,我們建立一 Statement 對象,並執行 executeUpdate 方法。

   因為 SQL 陳述式一行顯示不下,因此我們把它分為兩行,並用加號 (+) 相連。特別要注意的是,在 COFFEES 和 VALUES 之間要有空格。這個空格必須在引號之內並且要在 COFFEES 跟 VALUES 之間;沒有這個空格,SQL 陳述式將被錯誤地被讀作為 "INSERT INTO COFFEESVALUES ...",並且 DBMS 將尋找表 COFFEESVALUES。還要注意的是在 coffee name 上我們使用了單引號。

Statement stmt = con.createStatement();
stmt.executeUpdate(
"INSERT INTO COFFEES " +
"VALUES ('Colombian', 101, 7.99, 0, 0)");

   下面的代碼把第二行插入到表 COFFEES 中。我們可以在使用 Statement 對象而無須為每次執行建立一個新的。

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 語句取得了所有咖啡的名字及價格。而下面的 SELECT 語句限制那些每磅價格低於 $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



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。