作者:axeon
創(chuàng)建表
首先,我們在我們的示例數(shù)據(jù)庫創(chuàng)建其中一張表 coffees,包含在咖啡店所賣咖啡的必要的信息,包括咖啡名字,他們的價(jià)格,本星期賣了多少磅及迄今為止賣的數(shù)目。關(guān)于 coffees 表我們以后會詳細(xì)描述,如下:
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 數(shù)據(jù)類型是 varchar,最大的長度為 32 個(gè)字符。因?yàn)槲覀兯u的每種類型咖啡都使用不同的名字,名字可用于作為唯一識別咖啡的標(biāo)識,因此可用于作主鍵。第二個(gè)列叫 sup_id,用于保存咖啡供應(yīng)商標(biāo)識;其 sql 數(shù)據(jù)類型為 integer。第 3 列叫 price,因?yàn)樗枰4鎺?shù)的十進(jìn)制數(shù),因此它的 sql 類型為 float。(注意,通常錢的 sql 類型為 decimal 或 numeric,但在不同 dbmss 間存在差異,為了避免于老版本的 jdbc 的不兼容性在本教程我們采用更標(biāo)準(zhǔn)的 float 類型)sales 列的 sql 類型為 integer,其值為本星期所賣咖啡的磅數(shù)。最后一列,total 的 sql 類型為 integer,保存了迄今為止所賣咖啡的總磅數(shù)。
數(shù)據(jù)庫里的第二個(gè)表 suppliers,保存了每個(gè)供應(yīng)商的信息:
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 語句從這兩張表中取得有關(guān)信息。列 sup_id 是 suppliers 表的主鍵,用于唯一識別每個(gè)咖啡供應(yīng)商。在 coffees 表中,sup_id 列被稱外鍵。注意每個(gè) sup_id 值在 suppliers 表里只出現(xiàn)一次;這對主鍵是必須的。在 coffees 表里,它作為外鍵,顯然它可以有重復(fù)的 sup_id 值,因?yàn)橥还?yīng)商可以提供很多種的咖啡。在本節(jié)的最后,你將看見如何在 select 語句中使用主鍵及外鍵的一個(gè)例子。
下面的 sql 語句用于創(chuàng)建 coffees 表。列由列名跟空格跟 sql 類型組成。列(包括列名及其 sql 類型)跟下一個(gè)之間用逗號分隔。varchar 類型創(chuàng)建定義了最大長度, 因此它需要有一個(gè)參數(shù)來表示最大長度。參數(shù)必須在類型后面的括號內(nèi)。sql 語句如下,列 cof_name 的長度 被限定為不得超過 32 個(gè)字符:
create table coffees
(cof_name varchar(32),
sup_id integer,
price float,
sales integer,
total integer)
這些代碼不帶 dbms 語句結(jié)束符, 因?yàn)槊總€(gè) dbms 都可能不同。例如, oracle 使用一個(gè)分號 (;) 作為語句的結(jié)束,而 sybase 使用 go。你所使用的驅(qū)動程序會自動提供合適的語句結(jié)束符,因此你無須把它包括在你的 jdbc 代碼中。
另外,我們應(yīng)該指出的的是 sql 語句的格式。在 create table 語句中,關(guān)鍵字采用大寫字符,并且每個(gè)項(xiàng)目都另起一行。sql 并沒有此要求;僅僅是為了更容易閱讀。sql 標(biāo)準(zhǔn)是不區(qū)分關(guān)鍵詞的大小寫的, 因此,如下例中的 select 語句可以有多種寫法。因此下面兩個(gè)不同寫法的語句對 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"
然而,引號里的內(nèi)容是區(qū)分大小寫的:在名字"washington" 里 "w" 必須被大寫,并且余下的字符必須是小寫的。
對于標(biāo)識,不同的 dbms 有不同的要求,例如, 某些 dbmss 要求那些列名及表名必須跟創(chuàng)建時(shí)的一樣,有些則沒有此要求。為安全起見,我們?nèi)渴褂么髮憳?biāo)識如 coffees、suppliers,因?yàn)槲覀兪悄菢佣x他們的。
到止我們寫了創(chuàng)建 coffees 表的 sql 語句。現(xiàn)在我們在它外面加上引號(使它成為字符串),并且字符串賦值給變量 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 語句中使用的數(shù)據(jù)類型是通用的 sql 類型(也稱 jdbc 類型)它們在類 java.sql.types 中定義。dbmss 通常使用這些標(biāo)準(zhǔn)的類型,因此,當(dāng)你要嘗試一些 jdbc 應(yīng)用程序時(shí),你可以直接使用 createcoffees.java 應(yīng)用程序,它使用了 create table 語句。如果你的 dbms 使用了它的自己的本地的類型名字,我們?yōu)槟愎?yīng)其它的應(yīng)用程序,我們將在后面詳細(xì)解釋。
在運(yùn)用任何應(yīng)用程序前,當(dāng)然,我們將讓你了解 jdbc 的基礎(chǔ)。
創(chuàng)建 jdbc statements 對象
statement 對象用于把 sql 語句發(fā)送到 dbms 。你只須簡單地創(chuàng)建一個(gè) statement 對象并且然后執(zhí)行它,使用適當(dāng)?shù)姆椒▓?zhí)行你發(fā)送的 sql 語句。對 select 語句來說,可以使用 executequery。要創(chuàng)建或修改表的語句,使用的方法是 executeupdate。
需要一個(gè)活躍的連接的來創(chuàng)建 statement 對象的實(shí)例。在下面的例子中,我們使用我們的 connection 對象 con 創(chuàng)建 statement 對象 stmt:
statement stmt = con.createstatement();
到此 stmt 已經(jīng)存在了,但它還沒有把 sql 語句傳遞到 dbms。我們需要提供 sql 語句作為參數(shù)提供給我們使用的 statement 的方法。例如,在下面的代碼段里,我們使用上面例子中的 sql 語句作為 executeupdate 的參數(shù):
stmt.executeupdate("create table coffees " +
"(cof_name varchar(32), sup_id integer, price float, " +
"sales integer, total integer)");
因?yàn)槲覀円呀?jīng)把 sql 語句賦給了 createtablecoffees 變量,我們可以如下方式書寫代碼:
stmt.executeupdate(createtablecoffees);
執(zhí)行語句
我們使用 executeupdate 方法是因?yàn)樵?createtablecoffees 中的 sql 語句是 ddl (數(shù)據(jù)定義語言)語句。創(chuàng)建表,改變表,刪除表都是 ddl 語句的例子,要用 executeupdate 方法來執(zhí)行。你也可以從它的名字里看出,方法 executeupdate 也被用于執(zhí)行更新表 sql 語句。實(shí)際上,相對于創(chuàng)建表來說,executeupdate 用于更新表的時(shí)間更多,因?yàn)楸碇恍枰獎?chuàng)建一次,但經(jīng)常被更新。
被使用最多的執(zhí)行 sql 語句的方法是 executequery。這個(gè)方法被用來執(zhí)行 select 語句,它幾乎是使用最多的 sql 語句。馬上你將看到如何使用這個(gè)方法。
在表中輸入數(shù)據(jù)
我們已經(jīng)顯示了如何通過指定列名、數(shù)據(jù)類型來創(chuàng)建表 coffees,但是這僅僅建立表的結(jié)構(gòu)。表還沒有任何數(shù)據(jù)。我們將次輸入一行數(shù)據(jù)到表中,提供每列的信息,注意插入的數(shù)據(jù)顯示順序跟表創(chuàng)建時(shí)候是一樣的,既缺省順序。
下列代碼插入一個(gè)行數(shù)據(jù),cof_name 的值為 colombian,sup_id 為 101,price 為 7.99,sales 0,total 0。就象創(chuàng)建 coffees 表一樣,我們創(chuàng)建一 statement 對象,并執(zhí)行 executeupdate 方法。
因?yàn)?sql 語句一行顯示不下,因此我們把它分為兩行,并用加號 (+) 相連。特別要注意的是,在 coffees 和 values 之間要有空格。這個(gè)空格必須在引號之內(nèi)并且要在 coffees 跟 values 之間;沒有這個(gè)空格,sql 語句將被錯(cuò)誤地被讀作為 "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 對象而無須為每次執(zhí)行創(chuàng)建一個(gè)新的。
stmt.executeupdate("insert into coffees " +
"values ('french_roast', 49, 8.99, 0, 0)");
剩下行的數(shù)據(jù)如下:
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)");
從表中取得數(shù)據(jù)
既然表 coffees 中已經(jīng)有數(shù)據(jù)了,我們就可以寫一個(gè) select 語句來取得這些值。下面的 sql 語句中星號 (*) 表示選擇所有的列。因?yàn)闆]有用 where 子句來限制所選的行,因此下面的 sql 語句選擇的是整個(gè)表。
select * from coffees
結(jié)果是整個(gè)表的數(shù)據(jù),如下:
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
如果你直接在數(shù)據(jù)庫系統(tǒng)里輸入 sql 查詢語句,你將在你的終端上看到如上的結(jié)果。當(dāng)我們通過一個(gè) java 應(yīng)用程序存取一個(gè)數(shù)據(jù)庫時(shí),正如我們馬上要做的一樣,我們需要檢索結(jié)果以便我們能使用他們。你將在下一節(jié)看到如何實(shí)現(xiàn)。
這是 select 語句的另一個(gè)例子,這將得到咖啡及其各自每磅單價(jià)的列表。
select cof_name, price from coffees
查詢的結(jié)果集將具有如下形式:
cof_name price
-------- ---------- -----
colombian 7.99
french_roast 8.99
espresso 9.99
colombian_decaf 8.99
french_roast_decaf 9.99
上面 select 語句取得了所有咖啡的名字及價(jià)格。而下面的 select 語句限制那些每磅價(jià)格低于 $9.00 的咖啡才被選擇。
select cof_name, price
from coffees
where price < 9.00
結(jié)果集將具有如下形式:
cof_name price
-------- ------- -----
colombian 7.99
french_roast 8.99
colombian decaf 8.99
新聞熱點(diǎn)
疑難解答
圖片精選