在使用之前,需要配置環(huán)境變量DERBY_HOME指向db所在目錄,本機(jī)JAVA_HOME為G:\Java\jdk1.8.0_73,則DERBY_HOME應(yīng)該配置為G:\Java\jdk1.8.0_73\db,或%JAVA_HOME%\db,如果希望后面在命令行里用起來(lái)方便點(diǎn),也可以將%DERBY_HOME%\db\bin添加到path里去
bin目錄下有幾個(gè)主要的文件,有兩個(gè)不同的方式,沒(méi)有.bat后綴的文件為L(zhǎng)inux平臺(tái)下運(yùn)行的腳本,bat文件為Windows平臺(tái)使用的批處理
NetworkServerControl:提供網(wǎng)絡(luò)服務(wù),主要被startNetworkServer和stopNetworkServer調(diào)用
幾個(gè)以CP結(jié)束的批處理,主要用于在不同模式下設(shè)置CLASSPATH用的,如果把lib目錄下的jar文件添加到CLASSPATH中,就可以不用通過(guò)執(zhí)行批處理來(lái)設(shè)置CLASSPATH了
3.用命令行方式開(kāi)啟數(shù)據(jù)庫(kù)
G:\Java\jdk1.8.0_73\db\bin>ij
ij 版本 10.11
ij> connect 'jdbc:derby:mydb;create=true';
加上create=true表明如果庫(kù)mydb不存在,則創(chuàng)建,數(shù)據(jù)庫(kù)文件存放位置為當(dāng)前目錄,接下來(lái)創(chuàng)建一個(gè)表,可以把三個(gè)字段定義信息寫(xiě)在一行里面,結(jié)束時(shí)要加分號(hào)
ij> create table stu(id int not null generated by default as identity,
> stuname varchar(20),
> email varchar(30));
已插入/更新/刪除 0 行
向表中寫(xiě)入一條記錄,并進(jìn)行查詢
ij> insert into stu(stuname,email) values('Tom','tom@test.com');
已插入/更新/刪除 1 行
ij> select * from stu;
ID |STUNAME |EMAIL
---------------------------------------------------------------
1 |Tom |tom@test.com
已選擇 1 行
退出命令行狀態(tài)
重新進(jìn)入命令行方式,進(jìn)行數(shù)據(jù)驗(yàn)證
G:\Java\jdk1.8.0_73\db\bin>ij
ij 版本 10.11
ij> connect 'jdbc:derby:mydb';
ij> select * from stu;
ID |STUNAME |EMAIL
---------------------------------------------------------------
1 |Tom |tom@test.com
已選擇 1 行
查看當(dāng)前表結(jié)構(gòu)可以用describe <表名>
ij> describe stu;
COLUMN_NAME |TYPE_NAME|DEC&|NUM&|COLUM&|COLUMN_DEF|CHAR_OCTE&|IS_NULL&
------------------------------------------------------------------------------
ID |INTEGER |0 |10 |10 |GENERATED&|NULL |NO
STUNAME |VARCHAR |NULL|NULL|20 |NULL |40 |YES
EMAIL |VARCHAR |NULL|NULL|30 |NULL |60 |YES
已選擇 3 行
ij>
這是在命令行方式下的基本使用
4.在Java工程中使用JavaDB
在Eclipse中創(chuàng)建一個(gè)Java工程,導(dǎo)入derby.jar包,代碼如下
package com.db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class EmbedDB {
private static String driver = "org.apache.derby.jdbc.EmbeddedDriver";
private static String protocol = "jdbc:derby:db3;create=true"; // 在工程目錄下創(chuàng)建數(shù)據(jù)庫(kù)
// private static String protocol = "jdbc:derby:db/db3;create=true"; //在工程目錄下db目錄中創(chuàng)建數(shù)據(jù)庫(kù)
// private static String protocol = "jdbc:derby:D:/mydbs/db3;create=true"; //在D:/mydbs/目錄下創(chuàng)建數(shù)據(jù)庫(kù)
public static void main(String[] args) {
try {
Class.forName(driver).newInstance();
System.out.println("Loaded the appropriate driver");
Connection conn = DriverManager.getConnection(protocol);
Statement stmt = conn.createStatement();
stmt.executeUpdate("create table stu(id int not null generated by default as identity,stuname varchar(20),email varchar(30))");
for (String str : "one,two,three,four,five".split(",")) {
String sql = "insert into stu(stuname,email) values('" + str + "','" + str + "@test.com')";
System.out.println(sql);
stmt.addBatch(sql);
}
stmt.executeBatch();
System.out.println("insert over");
conn.commit();
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
運(yùn)行結(jié)果
Loaded the appropriate driver
insert into stu(stuname,email) values('one','one@test.com')
insert into stu(stuname,email) values('two','two@test.com')
insert into stu(stuname,email) values('three','three@test.com')
insert into stu(stuname,email) values('four','four@test.com')
insert into stu(stuname,email) values('five','five@test.com')
insert over
5.網(wǎng)絡(luò)數(shù)據(jù)庫(kù)模式
JavaDB是跑在JVM中的,如果此時(shí)再開(kāi)啟一個(gè)新的窗口,打開(kāi)當(dāng)前數(shù)據(jù)庫(kù),會(huì)報(bào)錯(cuò),如果希望有多個(gè)客戶端連接,如開(kāi)發(fā)階段,一邊在Eclipse里運(yùn)行程序,一邊在命令行里查看數(shù)據(jù)記錄,這種情況就可以使用JavaDB的網(wǎng)絡(luò)啟動(dòng)模式
G:\Java\jdk1.8.0_73\db\bin>startNetworkServer
Tue Jan 10 09:10:54 CST 2017 : 已使用基本服務(wù)器安全策略安裝了 Security Manager。
Tue Jan 10 09:11:04 CST 2017 : Apache Derby 網(wǎng)絡(luò)服務(wù)器 - 10.11.1.2 - (1629631) 已啟動(dòng)并準(zhǔn)備接受端口 1527 上的連接
表示當(dāng)前窗口正在監(jiān)聽(tīng),即網(wǎng)絡(luò)服務(wù)已開(kāi)啟
查看數(shù)據(jù)庫(kù)的基本情況可以用dblook
G:\Java\jdk1.8.0_73\db\bin>dblook -d 'jdbc:derby://localhost:1527/mydb'
-- 時(shí)間戳記:2017-01-10 09:18:30.232
-- 源數(shù)據(jù)庫(kù)為:mydb
-- 連接 URL 為:jdbc:derby://localhost:1527/mydb
-- appendLogs: false
-- ----------------------------------------------
-- 表的 DDL 語(yǔ)句
-- ----------------------------------------------
CREATE TABLE "APP"."STU" ("ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1), "STUNAME" VARCHAR(20), "EMAIL" VARCHAR(30));
以命令行方式進(jìn)行數(shù)據(jù)庫(kù)連接并測(cè)試
G:\Java\jdk1.8.0_73\db\bin>ij
ij 版本 10.11
ij> connect 'jdbc:derby://localhost:1527/mydb'
ij> show tables in app;
TABLE_SCHEM |TABLE_NAME |REMARKS
------------------------------------------------------------------------
APP |STU |
已選擇 1 行
ij> select * from stu;
ID |STUNAME |EMAIL
---------------------------------------------------------------
1 |Tom |tom@test.com
已選擇 1 行
ij>
此時(shí)也可以在Eclipse中使用Java程序進(jìn)行數(shù)據(jù)庫(kù)訪問(wèn),需要加載derbyclient.jar包,代碼如下
package com.db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class ClientDB {
private static String driver = "org.apache.derby.jdbc.ClientDriver";
private static String protocol = "jdbc:derby://localhost:1527/mydb";
public static void main(String[] args) {
try {
Class.forName(driver).newInstance();
System.out.println("Loaded the appropriate driver");
Connection conn = DriverManager.getConnection(protocol);
Statement stmt = conn.createStatement();
for (int i = 1; i < 10; i++) {
String sql = "insert into stu(stuname,email) values('user" + i + "','user" + i + "@test.com')";
System.out.println(sql);
stmt.addBatch(sql);
}
stmt.executeBatch();
System.out.println("insert over");
conn.commit();
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
控制以輸出結(jié)果為
Loaded the appropriate driver
insert into stu(stuname,email) values('user1','user1@test.com')
insert into stu(stuname,email) values('user2','user2@test.com')
insert into stu(stuname,email) values('user3','user3@test.com')
insert into stu(stuname,email) values('user4','user4@test.com')
insert into stu(stuname,email) values('user5','user5@test.com')
insert into stu(stuname,email) values('user6','user6@test.com')
insert into stu(stuname,email) values('user7','user7@test.com')
insert into stu(stuname,email) values('user8','user8@test.com')
insert into stu(stuname,email) values('user9','user9@test.com')
insert over
此時(shí)查看數(shù)據(jù)庫(kù)內(nèi)容為
ij> select * from stu;
ID |STUNAME |EMAIL
---------------------------------------------------------------
1 |Tom |tom@test.com
2 |user1 |user1@test.com
3 |user2 |user2@test.com
4 |user3 |user3@test.com
5 |user4 |user4@test.com
6 |user5 |user5@test.com
7 |user6 |user6@test.com
8 |user7 |user7@test.com
9 |user8 |user8@test.com
10 |user9 |user9@test.com
已選擇 10 行
ij>
小結(jié)
終于學(xué)習(xí)了JavaDB,又嘗試了一種嵌入式數(shù)據(jù)庫(kù),在做一些小項(xiàng)目或是應(yīng)用演示時(shí)很方便。在了解過(guò)JavaDB后,覺(jué)得JavaDB也是個(gè)不錯(cuò)的選擇,很多操作都做成了批處理方式,在HSQLDB中也可以自己構(gòu)造批處理,在HSQLDB中有個(gè)圖形界面可以用,相對(duì)直觀一些,對(duì)于體積來(lái)說(shuō),HSQLDB好像更小巧點(diǎn),他們都支持內(nèi)存數(shù)據(jù)庫(kù),目前在數(shù)據(jù)庫(kù)性能上沒(méi)有做比較。總的來(lái)說(shuō),JavaDB是個(gè)不錯(cuò)的選擇,使用起來(lái)比較方便。此文僅做簡(jiǎn)單介紹,如果希望了解得更多,可參考官方文檔http://db.apache.org/derby/manuals/index.html#latest