日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Derby 輕量級(jí)數(shù)據(jù)庫

 孫中熙——路 2012-02-16
Derby 輕量級(jí)數(shù)據(jù)庫
2007-12-24 21:54

Derby是Apache Database工程的一個(gè)輕量級(jí)關(guān)系數(shù)據(jù)庫,其源碼公開,現(xiàn)在被JDK6中。它的最出色之處就是可以嵌入到你的應(yīng)用程序中工作,這為我們編寫應(yīng)用軟件時(shí)對(duì)數(shù)據(jù)存儲(chǔ)提供了極大的便利,它也可以作為服務(wù)運(yùn)行,但我認(rèn)為這并非它的優(yōu)勢(shì),聽說IBM為它增加了高端性能支持,但我認(rèn)為它沒有必要發(fā)展的太龐大。

下面轉(zhuǎn)一篇它的簡(jiǎn)單上手指南

        它是一個(gè)理想的,并且開源的,100% Java編寫的,容易管理的關(guān)系數(shù)據(jù)庫管理系統(tǒng),它可以和一些商業(yè)產(chǎn)品的特性進(jìn)行交付。這篇文章是關(guān)注Apache Derby項(xiàng)目——一個(gè)兩全其美的關(guān)系數(shù)據(jù)庫管理系統(tǒng)。Derby是一個(gè)名為Cloudscape的小公司構(gòu)思的;當(dāng)Cloudscape賣給Informix后,該產(chǎn)品得到了加強(qiáng);當(dāng)IBM加入時(shí),在“big blue”期間,它的高端工程特性得到增強(qiáng);現(xiàn)在已經(jīng)成為一個(gè)有最自由的許可的開源項(xiàng)目而存在。

兩種靈活的使用模式
         Derby可以工作在嵌入式模式下,或在完全的客戶端/服務(wù)器模式下。Derby引擎可以嵌入在你的應(yīng)用程序里。當(dāng)工作在嵌入式模式,你的應(yīng)用程序訪問數(shù)據(jù)庫是直接和專有的。這就意味著其他應(yīng)用程序不可能在同一時(shí)間訪問該數(shù)據(jù)庫。嵌入式模式的主要優(yōu)點(diǎn)是不需要進(jìn)行網(wǎng)絡(luò)和服務(wù)器設(shè)置。因?yàn)槟愕膽?yīng)用程序包含了Derby引擎,使用者并不知道你使用了一個(gè)關(guān)系數(shù)據(jù)庫。
         當(dāng)使用Derby的嵌入式模式時(shí),并沒有復(fù)雜的配置和特殊的API需要你去學(xué)習(xí)。實(shí)際上,你僅僅需要做:
1. 確保Derby JARs文件在你的應(yīng)用程序classpath里
2. 使用嵌入式JDBC驅(qū)動(dòng)
3. 寫數(shù)據(jù)庫訪問代碼到JDBC
這是正確的,Derby根本沒有特殊的APIs。只需要為你的應(yīng)用程序編碼到JDBC,然后Derby會(huì)為你工作得很好。事實(shí)上,如果你已經(jīng)有了JDBC代碼,而想把代碼轉(zhuǎn)換到Derby嵌入式模式下運(yùn)行是十分容易的。
如果你使用過ORACLE,DB2,SQL Server或MySQL,你應(yīng)該對(duì)網(wǎng)絡(luò)模式(客戶端/服務(wù)器模式)的工作原理相當(dāng)熟悉。一個(gè)獨(dú)立的Java進(jìn)程運(yùn)行作為Derby的網(wǎng)絡(luò)服務(wù)器,通過網(wǎng)絡(luò)監(jiān)聽客戶端的連接。該Derby網(wǎng)絡(luò)服務(wù)器能唯一的訪問數(shù)據(jù)庫存儲(chǔ)器,并能同時(shí)接受多個(gè)客戶端連接。這就允許多個(gè)用戶在同一時(shí)間通過網(wǎng)絡(luò)方式訪問該關(guān)系數(shù)據(jù)庫管理系統(tǒng)。
當(dāng)不適合使用嵌入式模式進(jìn)行操作時(shí)(例如:你必須運(yùn)行和管理個(gè)別的服務(wù)器進(jìn)程,或許在不同的機(jī)器上),當(dāng)你需要多用戶訪問數(shù)據(jù)庫時(shí),Derby的客戶端-服務(wù)器模式能提供一個(gè)有效的解決方案。
配置Derby數(shù)據(jù)庫
為了完全體會(huì)Derby設(shè)置和使用的好處,你需要自己親身體驗(yàn)它。首先,下載和安裝Derby。然后,確保你的classpath環(huán)境變量包含:
derby_installation_directory\lib\derby.jar;和derby_installation_directory\lib\derbytools.jar;
你也可以編輯提供給你的sp.bat文件,設(shè)置你的Derby安裝目錄,然后運(yùn)行設(shè)置你的classpath。
一旦你設(shè)置好了classpath,就修改工作目錄。數(shù)據(jù)庫將被創(chuàng)建在這個(gè)目錄里面。從db\createdb目錄復(fù)制createdb.sql文件到工作目錄。然后,啟動(dòng)命令行界面(執(zhí)行ij)進(jìn)入Derby:
java org.apache.derby.tools.ij
你也可以使用在batch子目錄下提供的ij.bat,在使用前一定要編輯該批處理文件,添加你的Derby安裝目錄路徑。這樣才能進(jìn)入正確的命令行,使用嵌入式Derby引擎。你看到的提示將與下面的類似:
ij version 10.0
ij>

         你可以輸入“help”;來查看可以使用的命令。要?jiǎng)?chuàng)建數(shù)據(jù)庫和表來使用,僅僅需要運(yùn)行createdb.sql文件。使用ij命令:
run ‘createdb.sql’;
         run命令將調(diào)用一個(gè)腳本文件并執(zhí)行它里面的Derby命令,類似于Windows的批處理文件。下面顯示的是createdb.sql文件的內(nèi)容。
connect
                 'jdbc:derby:vsjdb;create=true';
drop table orders;
drop table custs;
create table custs
                 (id char (5) not null,
                                 name char(40) not null,
                                                primary key(id));
create table orders
                 (id char(8) not null,
                                 custid char(5) not null,
                                                total integer,
                                                               primary key(id,custid));
insert into custs values (
                 '1', 'John Smith');
insert into custs values (
                 '2', 'Mary Todd');
insert into orders values(
                 '0001', '1', 39999);
insert into orders values(
                 '0002', '1', 2999);
insert into orders values(
                 '0003', '1', 1904);
insert into orders values(
                 '0004', '2', 3232);
insert into orders values(
                 '0005', '2', 109900);
在每一行都需要一個(gè)分號(hào),這與命令行輸入命令是一樣的。腳本的第一行是連接命令,指明連接的嵌入式Derby驅(qū)動(dòng)名字。在腳本里的連接命令為:
connect
                ‘jdbc:derby:vsjdb;create=true’;
         使用jdbc:derby說明Derby驅(qū)動(dòng)是使用的JDBC協(xié)議,而vsjdb是一個(gè)數(shù)據(jù)庫的名字,它能通過嵌入式驅(qū)動(dòng)創(chuàng)建和訪問。create=true屬性說明如果該數(shù)據(jù)庫不存在時(shí),就創(chuàng)建該數(shù)據(jù)庫。
         該createdb.sql腳本將創(chuàng)建一個(gè)名為vsjdb(當(dāng)它不存在時(shí))的數(shù)據(jù)庫,并在該數(shù)據(jù)庫中創(chuàng)建custs和orders表。它將在表中添加兩個(gè)用戶和五個(gè)定單。如果你使用過其他數(shù)據(jù)庫的SQL語句,你應(yīng)該相當(dāng)熟悉在腳本里的SQL語句。
         你可以查看你的工作目錄,現(xiàn)在你將看到一個(gè)vsjdb子目錄。數(shù)據(jù)將保存在里面。數(shù)據(jù)庫可以很簡(jiǎn)單的的進(jìn)行備份,就是復(fù)制這個(gè)子目錄。
表格1和表格2是custs和orders表的信息
Table 1: The custs table

Field Name
Data Type
Note

Id
char(5)
primary key

Name
char(40)
  
Table 2: The orders table

Field Name
Data Type
Note

Id
char(8)
primary key (compound)

Custid
char(5)
primary key (compound)

Total
int

與關(guān)系數(shù)據(jù)庫管理系統(tǒng)數(shù)據(jù)操作
要查看顧客記錄信息,在ij提示行后使用SQL SELECT語句:
select * from custs;
要查看定單,使用下面的命令:
select * from orders;
要?jiǎng)h除顧客,嘗試使用下面的命令:
delete from custs where id=’1’;
你可以選擇custs表里的某一行,并能查看到哪個(gè)用戶被刪除。要?jiǎng)h除與這個(gè)用戶相關(guān)聯(lián)的定單信息,使用下面的命令:
delete from orders where custid=’1’;

你現(xiàn)在可以查看orders表,并能看見所有關(guān)于一號(hào)顧客的定單都被刪除了。
在你離開ij前,刪除數(shù)據(jù)庫里的所有記錄:
delete from custs;
delete from orders;
著它將是一個(gè)空數(shù)據(jù)庫,在下一部分,將寫入自定義的Java代碼。
使用exit命令離開ij:
exit;
自從連接URL指定了嵌入式驅(qū)動(dòng),只有ij能唯一的訪問這個(gè)數(shù)據(jù)庫。
嵌入Derby到你的Java應(yīng)用程序中
         時(shí)間加速我們的Java編譯和編寫某些代碼。這些代碼將放入Derby做一個(gè)小測(cè)試,給你一個(gè)關(guān)系數(shù)據(jù)庫管理系統(tǒng)能處理現(xiàn)實(shí)世界大量數(shù)據(jù)能力的信心。
         下面是名為FillTable.java的代碼,將創(chuàng)建1000個(gè)用戶,每個(gè)用戶有10條定單——總共10000條定單。在嵌入子目錄下你可以找到FillTable.java的源代碼。
import java.sql.*;
public class TableFiller {
                 Connection conn = null;
                 PreparedStatement insertCust
                                 = null;
                 PreparedStatement insertOrder
                                 = null;
         上面的申明是標(biāo)準(zhǔn)的JDBC申明。conn控制JDBC連接。insertCust和insertOrder將分別處理插入記錄到custs和orders表里的SQL語句。PreparedStatement的使用使關(guān)系數(shù)據(jù)庫管理系統(tǒng)得到優(yōu)化的可能。
         其次,下面的代碼,driverName包含我們裝載和使用的JDBC驅(qū)動(dòng)器的類名。這是一個(gè)嵌入式驅(qū)動(dòng)器。連接的URL是url值。你可以看見是使用的絕對(duì)路徑定位這個(gè)數(shù)據(jù)庫(注意:你必須要使用正斜線來分離路徑)。如果你總是在你的工作目錄運(yùn)行這個(gè)程序的話,你可以僅使用”jdbc:derby:vsjdb”。也可以可以設(shè)置derby.system.home屬性來改變Derby數(shù)據(jù)庫文件的位置(例如:java –D derby.system.home=c:\mydbdir org.apche.derby.tools.ij)。
String driverName =
"org.apache.derby.jdbc.EmbeddedDriver";
String url =
                 "jdbc:derby:c:/derby1021/vsjdb";

         loadDrivers()方法裝載JDBC驅(qū)動(dòng)類并創(chuàng)建獲得一個(gè)Derby的JDBC連接。并準(zhǔn)備兩個(gè)插入語句。
public void loadDrivers()
                 throws SQLException,
                 ClassNotFoundException {
                 Class.forName(driverName);
                 conn = DriverManager.getConnection(
                                 url);
                 insertCust = conn.prepareStatement(
                                 "INSERT INTO custs VALUES(
                                 , ?)");
                 insertOrder =
                                 conn.prepareStatement(
                                 "INSERT INTO orders VALUES(
                                 , ?, ?)");
}

         TableFiller的main()方法創(chuàng)建一個(gè)TableFiller的實(shí)例,并調(diào)用它的addCustomer()方法去創(chuàng)建1000個(gè)用戶。它也調(diào)用addOrder()方法去創(chuàng)建10000條定單信息。為了顯示進(jìn)度,它打印顧客編號(hào)和’.’到系統(tǒng)輸出中。
public static void main(String args[])
                 throws Exception {
                 TableFiller tf = new TableFiller();
                 tf.loadDrivers();
                 int orderNum = 1;
                 for (int i=1; i<1001; i++) {
                                 String custNum = "" + i;
                                 tf.addCustomer(
                                                custNum, "customer #" + i);
                                 System.out.print("\n"
                                                + custNum);
                                 for (int j=1; j<11; j++) {
                                                tf.addOrder( ""+ orderNum,
                                                               custNum, j * 99);
                                                orderNum++;
                                                System.out.print(".");
                                 }
                 }
                 tf.closeAll();
}

addCustomer()方法獲得參數(shù)并執(zhí)行insertCust的預(yù)編譯語句。
public void addCustomer(
                 String id, String custname)
                 throws SQLException {
                 insertCust.setString(1, id);
                 insertCust.setString(2, custname);
                 insertCust.executeUpdate();
}

addOrder()方法獲得參數(shù)并執(zhí)行insertOrder的預(yù)編譯語句。
public void addOrder(String id,
                 String custid, int total)
                 throws SQLException {
                 insertOrder.setString(1, id);
                 insertOrder.setString(2, custid);
                 insertOrder.setInt(3, total);
                 insertOrder.executeUpdate();
}
closeAll()整理和關(guān)閉兩個(gè)預(yù)編譯語句和JDBC連接,通知Derby釋放被控制的資源。
public void closeAll()
                 throws SQLException {
                 insertCust.close();
                 insertOrder.close();
                 conn.close();
}
}
         當(dāng)顧客和定單被創(chuàng)建,程序?qū)⒋蛴☆櫩途幪?hào)到屏幕上。編號(hào)從1到1000表明每個(gè)顧客被創(chuàng)建。而打印的每個(gè)’.’則表明定單被創(chuàng)建。
         要編譯這個(gè)代碼,你僅僅需要確信你已經(jīng)設(shè)置了classpath,并且使用標(biāo)準(zhǔn)的Java編譯命令:
java TableFiller.java

你要確保沒有ij或其他Derby會(huì)話在運(yùn)行。在嵌入式模式你需要唯一的訪問數(shù)據(jù)庫。在編譯成功后,需要復(fù)制TableFiller.class文件到你的工作目錄下,然后從那里運(yùn)行TableFiller:
java TableFiller
你應(yīng)該看見打印出來的狀態(tài)和寫入數(shù)據(jù)庫的記錄。
檢驗(yàn)被創(chuàng)建的記錄
         現(xiàn)在,去看看你創(chuàng)建的顧客和定單信息,確保你在工作目錄并再次登錄到ij。連接vsjdb數(shù)據(jù)庫。
connect ‘jdbc:derby:vsjdb’;
然后使用下面的SELECT語句查看所有1000條顧客信息。
select * from custs;
同樣的使用下面的SELECT語句查看所有10000條定單信息。
select * from orders;
當(dāng)然,使用類似于FillTable.java里的標(biāo)準(zhǔn)JDBC代碼,你可以整合Derby的關(guān)系數(shù)據(jù)庫的訪問功能到你的任何一個(gè)工程中。當(dāng)你的項(xiàng)目需要一個(gè)嵌入式數(shù)據(jù)庫時(shí),有能力簡(jiǎn)單和快速處理產(chǎn)生大量的數(shù)據(jù)的Derby是你最好的選擇。Derby的自由Apache許可允許你綁定它到你的程序上,即使你決定把你的產(chǎn)品進(jìn)行商業(yè)買賣。
配置Derby的網(wǎng)絡(luò)模式
         要訪問Derby的網(wǎng)絡(luò)服務(wù)器模式,首先你需要把下面的JAR文件地址添加到你的classpath值里。
derby_installation_directory\lib\derbynet.jar
         你還需要為客戶端訪問下載一個(gè)網(wǎng)絡(luò)JDBC驅(qū)動(dòng)。如果你使用IBM DB2 JDBC普通驅(qū)動(dòng),你則需要把下面的JAR文件地址添加到你的classpath值里:
derby_installation_directory\lib\db2_jcc.jar
derby_installation_directory\lib\db2_jcc_license_c.jar
         batch子目錄里的sp.bat文件里的classpath值已經(jīng)包含了這些JARs文件地址。
         啟動(dòng)網(wǎng)絡(luò)服務(wù)器,使用下面的命令:
java org.apache.derby.drda.NetworkServerControl start
你也可以使用batch子目錄下的netsvr.bat文件。
在默認(rèn)情況下,服務(wù)器將監(jiān)聽TCP1527端口來接收客戶端請(qǐng)求。你可以使用”-p <port number>”參數(shù)來改變端口。
         如果你需要關(guān)閉服務(wù)器,使用下面的命令:
java org.apache.derby.drda.NetworkServerControl shutdown
         或者你可以使用batch子目錄下的netstop.bat文件。
         現(xiàn)在服務(wù)器已經(jīng)準(zhǔn)備好了,為我們下面的探究鋪上了臺(tái)階。
自動(dòng)層疊刪除
         現(xiàn)在你有超過一萬條的定單數(shù)據(jù),你需要保證這些在數(shù)據(jù)庫里的數(shù)據(jù)沒有被破壞。固定這些數(shù)據(jù)是毫無疑問的。
         讓我舉例說明一個(gè)潛在的問題,這個(gè)問題的中心是圍繞在刪除一個(gè)顧客后。問題就有可能會(huì)出現(xiàn)。
         使用標(biāo)準(zhǔn)的SQL語句,只從custs表中刪除顧客信息:
delete from custs where id='838';
         這是從數(shù)據(jù)庫中刪除顧客編號(hào)為838的消費(fèi)者。好極了!
         如果這是你所做的,數(shù)據(jù)庫的數(shù)據(jù)正式被破壞了。為什么呢?這是因?yàn)樵跀?shù)據(jù)庫里有10定單信息沒有關(guān)聯(lián)到消費(fèi)者!
         這可能引起應(yīng)用程序各種各樣的錯(cuò)誤。所有應(yīng)用程序取得定單信息并嘗試打印顧客信息時(shí),都會(huì)涉及到這個(gè)異常。當(dāng)你列出所有用戶和他們的定單信息時(shí),有些定單信息永遠(yuǎn)都不會(huì)顯示出來。
         在關(guān)系數(shù)據(jù)庫管理系統(tǒng)的條款中,數(shù)據(jù)庫引用完整性是不允許這樣的情況的。這是因?yàn)橐粭l顧客記錄被刪除,而沒有刪除相應(yīng)的定單信息。
         因此,我們需要這樣做:
delete from custs where id='838';
delete from orders where custid='838';
         而且,我們需要確保兩條刪除命令在同一個(gè)事務(wù)中執(zhí)行。要么兩條語句都執(zhí)行成功,要么都執(zhí)行失敗。
         這個(gè)稱為刪除層疊,因?yàn)閯h除顧客記錄導(dǎo)致刪除定單信息。
         Derby有能力處理引用完整性。

Derby觸發(fā)器
          保證引用完整性的方法是定義一個(gè)觸發(fā)器。一個(gè)觸發(fā)器是一段代碼或SQL語句,當(dāng)數(shù)據(jù)發(fā)生修改或存取時(shí),它將在數(shù)據(jù)庫服務(wù)器里執(zhí)行。Derby支持定義觸發(fā)器(使用SQL語句或Java代碼),當(dāng)顧客記錄被刪除時(shí),可以編碼實(shí)現(xiàn)刪除關(guān)聯(lián)的定單信息。然而,在Derby里有一個(gè)更簡(jiǎn)單的方法。
          它可以告訴Derby,使用標(biāo)準(zhǔn)的SQL DDL(數(shù)據(jù)定義)語句,這涉及到orders表和custs表。你也可以告訴Derby去完成自動(dòng)層疊刪除。
添加參考約束
          要添加自動(dòng)層疊刪除,就要修改原始的createdb.sql里的語句。在db\ref子目錄下找到createdbref.sql文件。你需要對(duì)orders表定義進(jìn)行修改。添加下面蘭色字體的內(nèi)容:
create table orders
          (id char(8) not null,
          custid char(5) not null
          references custs (id) on delete
          cascade, total integer,
          primary key(id,custid));
          另外一個(gè)不同是連接數(shù)據(jù)庫的URL值。這時(shí),網(wǎng)絡(luò)驅(qū)動(dòng)器是指定的。一定要注意網(wǎng)絡(luò)驅(qū)動(dòng)器是需要用戶名和密碼的,默認(rèn)的用戶名和密碼都是APP,所以URL值將修改為:
connect 'jdbc:derby:net://localhost/
          vsjdb:user=APP;password=APP;';

          你現(xiàn)在可以強(qiáng)行創(chuàng)建帶參考約束的新表。確保復(fù)制createdbref.sql到你的工作目錄。再次啟動(dòng)ij?,F(xiàn)在,使用下面的命令可以刪除所有記錄并創(chuàng)建新表:
run 'createdbref.sql';
          在創(chuàng)建了表后,你可以再次運(yùn)行TableFiller.java文件去在表中添加10000條定單數(shù)據(jù)。使用network子目錄的修改版本。在原始的TableFiller.java里修改的部分如下面蘭色字體顯示的:內(nèi)容:
import java.sql.*;
import java.util.Properties;
public class TableFiller {
          Connection conn = null;
          PreparedStatement insertCust
                 = null;
          PreparedStatement insertOrder
                 = null;
          String driverName=
                 “com.ibm.db2.jcc.DB2Driver”;
          String url =
                 “jdbc:derby:net://localhost/
                 vsjdb:user=APP;password=APP;”;
          ...
          裝載的驅(qū)動(dòng)器將要改為網(wǎng)絡(luò)驅(qū)動(dòng)器(com.ibm.db2.jcc.DBDriver),URL值最好還是改成訪問網(wǎng)絡(luò)JDBC驅(qū)動(dòng)器的值。否則,這個(gè)代碼將與原始的TableFill.java文件一樣。如果你要寫你自己的JDBC代碼,你可以設(shè)置一個(gè)string從外部文本文件里讀取參數(shù),這樣你將不需要修改代碼就能在嵌入式關(guān)系數(shù)據(jù)庫管理系統(tǒng)和網(wǎng)絡(luò)關(guān)系數(shù)據(jù)庫管理系統(tǒng)之間轉(zhuǎn)換。
多用戶并發(fā)訪問
          現(xiàn)在,來關(guān)注多用戶連接,在另一個(gè)控制臺(tái)窗口啟動(dòng)ij會(huì)話,并連接到服務(wù)器使用下面的命令:
connect 'jdbc:derby:net://localhost/
          vsjdb:user=APP;password=APP;';
          在原始的控制臺(tái)窗口,編譯并運(yùn)行新的TableFiller.java文件。這將創(chuàng)建1000個(gè)顧客記錄和10000條定單記錄。當(dāng)這些操作執(zhí)行完畢后,回到新的ij窗口并使用下面的命令:
select * from custs;
…and:
select * from orders;
          當(dāng)你執(zhí)行這個(gè)命令的時(shí)候,你將發(fā)現(xiàn)所有用戶和定單信息都已經(jīng)被創(chuàng)建。網(wǎng)絡(luò)服務(wù)器允許多用戶并發(fā)訪問數(shù)據(jù)。

測(cè)試層疊刪除
          一旦你創(chuàng)建了數(shù)據(jù)記錄,試著在ij里執(zhí)行下面的語句:
select * from custs where id='700';
接著執(zhí)行下面的語句:
select * from orders where
                  custid='700';
          你將看到顧客記錄和這個(gè)顧客的10條定單信息。
          現(xiàn)在,嘗試刪除顧客,使用下面的命令:
delete from custs where id='700';
          這將刪除用戶記錄,層疊將會(huì)刪除關(guān)聯(lián)的定單信息?,F(xiàn)在嘗試再次使用上面的select語句查看,你將發(fā)現(xiàn)那10條定單信息也被刪除了。
寫一個(gè)Derby存儲(chǔ)過程
          在實(shí)驗(yàn)的最后,你將用Java編程語言創(chuàng)建一個(gè)Derby存儲(chǔ)過程。你也可以存儲(chǔ)代碼到存儲(chǔ)過程進(jìn)入Derby數(shù)據(jù)庫內(nèi)部,Derby能輕松的區(qū)分?jǐn)?shù)據(jù)和代碼。
          該存儲(chǔ)過程將調(diào)用deleteAll(),從它的名字可以理解到,它將刪除數(shù)據(jù)庫里的所有記錄。在stored子目錄下可以找到實(shí)現(xiàn)該存儲(chǔ)過程的Java代碼,它的名字為CleanTables.java。代碼內(nèi)容如下:
import java.sql.*;
public class CleanTables {
                  public static void delAll ()
                                  throws SQLException {
                                  Connection conn =
                                  DriverManager.getConnection(
                                                 "jdbc:default:connection");
                                  Statement delCusts =
                                                 conn.createStatement();
                                  delCusts.executeUpdate(
                                                 "delete from custs");
                                  delCusts.close();
                                  conn.close();
                                  return;
                  }
}
你可以看到,該存儲(chǔ)程序在Java類里是一個(gè)public static的方法。JDBC連接器的內(nèi)容是代碼里url的值:
jdbc:default:connection
這會(huì)告訴Derby服務(wù)器提供一個(gè)默認(rèn)的連接到代碼。Derby將管理這些連接。實(shí)際上的語句是執(zhí)行:
delete from custs;
          自從層疊刪除生效,刪除custs表的任何數(shù)據(jù),也將刪除orders表里相關(guān)聯(lián)的數(shù)據(jù)。
在Derby數(shù)據(jù)庫里存儲(chǔ)Java代碼
          要在Derby數(shù)據(jù)庫里存入Java代碼,你首先需要編譯該代碼并創(chuàng)建成JAR文件。編譯CleanTables.java代碼:
javac CleanTables.java
          創(chuàng)建JAR文件:
jar cvf vsjstproc.jar *.class
          或者你可以使用makejar.bat文件來完成上述操作,復(fù)制生成的vsjstporc.jar文件到工作目錄。
          在工作目錄,你需要設(shè)置該JAR文件到數(shù)據(jù)庫中。在ij中使用下面的命令(確保你的連接會(huì)話是通過網(wǎng)絡(luò)驅(qū)動(dòng)器獲得的):
call sqlj.install_jar('vsjstproc.jar',
                  'APP.cleanTable', 0);
          這個(gè)命令實(shí)際上是調(diào)用一個(gè)存儲(chǔ)過程,它將設(shè)置vsjstporc.jar文件到數(shù)據(jù)庫并為它設(shè)置是內(nèi)部名cleanTable。APP引用應(yīng)用程序計(jì)劃。讓JAR文件在數(shù)據(jù)庫里是非常方便的。當(dāng)你復(fù)制數(shù)據(jù)庫時(shí),這些代碼將跟著被移動(dòng)。
          如果你需要從數(shù)據(jù)庫里刪除該JAR文件,你可以使用:
call sqlj.remove_jar(
                  'APP.cleanTable', 0);
          在刪除調(diào)用中僅僅需要內(nèi)部名。
          當(dāng)把JAR設(shè)置到數(shù)據(jù)庫里后,當(dāng)它需要讀取Java代碼時(shí),你需要告訴Derby去識(shí)別該JAR文件。這些都需要通過存儲(chǔ)過程設(shè)置一個(gè)屬性:
call syscs_util.syscs_set_database_
                  property('derby.database.
                  classpath', 'APP.cleanTable');
          當(dāng)裝載Java類時(shí),Derby都會(huì)查看內(nèi)部的APP.cleanTable JAR文件。你最后準(zhǔn)備定義一個(gè)名為deleteAll()的存儲(chǔ)過程。使用下面的命令:
create procedure deleteAll() parameter
                  style java language java modifies
                  sql data external name
                  'CleanTables.delAll';
          Derby將從APP.cleanTable JAR文件找到CleanTable類,并鎖定該類的static delAll()方法。如果你需要?jiǎng)h除該存儲(chǔ)過程,你可以使用下面的命令:
drop procedure deleteAll;
          有了該存儲(chǔ)過程,你可以刪除這兩個(gè)表的所有數(shù)據(jù),只需要簡(jiǎn)單的在ij下調(diào)用存儲(chǔ)過程deleteAll():
call deleteAll();
          在這個(gè)存儲(chǔ)過程執(zhí)行完畢后,你將發(fā)現(xiàn)這兩個(gè)表是空的了。
結(jié)論
          Derby是一個(gè)具有豐富特性的關(guān)系數(shù)據(jù)庫系統(tǒng),并能集成到你的項(xiàng)目中。
          它支持嵌入式模式和客戶端-服務(wù)器模式操作,它能適應(yīng)部署多變的情況。它是100%用Java實(shí)現(xiàn)的,并與你的Java應(yīng)用程序一樣的享受‘隨時(shí)發(fā)布’。它能快速執(zhí)行和處理大量數(shù)據(jù),同時(shí)也支持高級(jí)特性,例如引用完整性和存儲(chǔ)項(xiàng)目,它以達(dá)到理想化的持久化的數(shù)據(jù)存儲(chǔ)所必須的。最后但并不是最小,它自由的Apache許可讓你自由的綁定它到你的產(chǎn)品中。

下載和安裝Derby
          你可以在incubator area of the Apache site里找到Derby
          一旦你解壓下載的Derby,注意你的解壓目錄,這是你的Derby安裝目錄。你需要使用這個(gè)目錄去設(shè)置的你的classpath。
下載Derby JDBC的網(wǎng)絡(luò)驅(qū)動(dòng)器
          為了在網(wǎng)絡(luò)模式下訪問Derby,你將需要一個(gè)JDBC網(wǎng)絡(luò)驅(qū)動(dòng)器。IBM捐贈(zèng)了這個(gè)驅(qū)動(dòng)器給Derby項(xiàng)目,但是直到寫本文時(shí),它都不是一個(gè)標(biāo)準(zhǔn)版本。
          暫時(shí),你將需要下載IBM DB2 JDBC Universal driver for Apache Derby Network Server。根據(jù)地址里的說明去設(shè)置你的classpath。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多