在做一些小的應用系統時,用過嵌入式數據庫,使用過HSQLDB,這個比較小巧,在做了幾個應用之后覺得挺好用的,因為數據量不多,也能夠滿足要求,也就在嵌入式數據庫這條路上越走越遠了。
在JAVA里也有一個嵌入式數據庫,也想嘗試著用一下,便有了下面這篇日志。在安裝jdk的時候會提示安裝一個數據庫,如果勾選的話,則會在安裝Java嵌入式數據庫JavaDB,在JAVA_HOME目錄下多出一個db的目錄(在jdk6版本里目錄名為JavaDB),里面就是與數據庫有關的文件了,如果安裝jdk時沒有選擇安裝,可以在官網http://db.apache.org/derby/derby_downloads.html上下載解壓即可,經過了一段時間的摸索,現小結如下。
1.配置環境變量
在使用之前,需要配置環境變量DERBY_HOME指向db所在目錄,本機JAVA_HOME為G:\Java\jdk1.8.0_73,則DERBY_HOME應該配置為G:\Java\jdk1.8.0_73\db,或%JAVA_HOME%\db,如果希望后面在命令行里用起來方便點,也可以將%DERBY_HOME%\db\bin添加到path里去
2.目錄介紹
在DERBY_HOME目錄下有兩個目錄bin和lib
bin:存放執行批處理文件,用于查看,啟動和停止數據庫的腳本
lib:存放所用到的jar包
bin目錄下有幾個主要的文件,有兩個不同的方式,沒有.bat后綴的文件為Linux平臺下運行的腳本,bat文件為Windows平臺使用的批處理
dblook:用于查看數據庫的基本信息及DDL語句
ij:命令行客戶端程序,提供與數據庫的交互
NetworkServerControl:提供網絡服務,主要被startNetworkServer和stopNetworkServer調用
startNetworkServer:啟動網絡數據庫模式,開啟監聽
stopNetworkServer:關閉網絡數據庫模式,停止監聽
sysinfo:查看當前系統信息,可用于檢測數據庫是否正確安裝
幾個以CP結束的批處理,主要用于在不同模式下設置CLASSPATH用的,如果把lib目錄下的jar文件添加到CLASSPATH中,就可以不用通過執行批處理來設置CLASSPATH了
這是在命令行方式下的基本使用
3.用命令行方式開啟數據庫
G:\Java\jdk1.8.0_73\db\bin>ij
ij 版本 10.11
ij> connect 'jdbc:derby:mydb;create=true';
ij 版本 10.11
ij> connect 'jdbc:derby:mydb;create=true';
加上create=true表明如果庫mydb不存在,則創建,數據庫文件存放位置為當前目錄,接下來創建一個表,可以把三個字段定義信息寫在一行里面,結束時要加分號
ij> create table stu(id int not null generated by default as identity,
> stuname varchar(20),
> email varchar(30));
已插入/更新/刪除 0 行
> stuname varchar(20),
> email varchar(30));
已插入/更新/刪除 0 行
向表中寫入一條記錄,并進行查詢
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 行
已插入/更新/刪除 1 行
ij> select * from stu;
ID |STUNAME |EMAIL
---------------------------------------------------------------
1 |Tom |tom@test.com
已選擇 1 行
退出命令行狀態
ij> exit;
重新進入命令行方式,進行數據驗證
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 行
ij 版本 10.11
ij> connect 'jdbc:derby:mydb';
ij> select * from stu;
ID |STUNAME |EMAIL
---------------------------------------------------------------
1 |Tom |tom@test.com
已選擇 1 行
查看當前表結構可以用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>
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中創建一個Java工程,導入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"; // 在工程目錄下創建數據庫
// private static String protocol = "jdbc:derby:db/db3;create=true"; //在工程目錄下db目錄中創建數據庫
// private static String protocol = "jdbc:derby:D:/mydbs/db3;create=true"; //在D:/mydbs/目錄下創建數據庫
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();
}
}
}
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"; // 在工程目錄下創建數據庫
// private static String protocol = "jdbc:derby:db/db3;create=true"; //在工程目錄下db目錄中創建數據庫
// private static String protocol = "jdbc:derby:D:/mydbs/db3;create=true"; //在D:/mydbs/目錄下創建數據庫
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();
}
}
}
運行結果
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
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.網絡數據庫模式
JavaDB是跑在JVM中的,如果此時再開啟一個新的窗口,打開當前數據庫,會報錯,如果希望有多個客戶端連接,如開發階段,一邊在Eclipse里運行程序,一邊在命令行里查看數據記錄,這種情況就可以使用JavaDB的網絡啟動模式
G:\Java\jdk1.8.0_73\db\bin>startNetworkServer
Tue Jan 10 09:10:54 CST 2017 : 已使用基本服務器安全策略安裝了 Security Manager。
Tue Jan 10 09:11:04 CST 2017 : Apache Derby 網絡服務器 - 10.11.1.2 - (1629631) 已啟動并準備接受端口 1527 上的連接
Tue Jan 10 09:10:54 CST 2017 : 已使用基本服務器安全策略安裝了 Security Manager。
Tue Jan 10 09:11:04 CST 2017 : Apache Derby 網絡服務器 - 10.11.1.2 - (1629631) 已啟動并準備接受端口 1527 上的連接
表示當前窗口正在監聽,即網絡服務已開啟
查看數據庫的基本情況可以用dblook
以命令行方式進行數據庫連接并測試G:\Java\jdk1.8.0_73\db\bin>dblook -d 'jdbc:derby://localhost:1527/mydb'
-- 時間戳記:2017-01-10 09:18:30.232
-- 源數據庫為:mydb
-- 連接 URL 為:jdbc:derby://localhost:1527/mydb
-- appendLogs: false
-- ----------------------------------------------
-- 表的 DDL 語句
-- ----------------------------------------------
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));
-- 時間戳記:2017-01-10 09:18:30.232
-- 源數據庫為:mydb
-- 連接 URL 為:jdbc:derby://localhost:1527/mydb
-- appendLogs: false
-- ----------------------------------------------
-- 表的 DDL 語句
-- ----------------------------------------------
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));
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>
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>
此時也可以在Eclipse中使用Java程序進行數據庫訪問,需要加載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();
}
}
}
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();
}
}
}
控制以輸出結果為
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
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
此時查看數據庫內容為
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>
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>
小結
終于學習了JavaDB,又嘗試了一種嵌入式數據庫,在做一些小項目或是應用演示時很方便。在了解過JavaDB后,覺得JavaDB也是個不錯的選擇,很多操作都做成了批處理方式,在HSQLDB中也可以自己構造批處理,在HSQLDB中有個圖形界面可以用,相對直觀一些,對于體積來說,HSQLDB好像更小巧點,他們都支持內存數據庫,目前在數據庫性能上沒有做比較。總的來說,JavaDB是個不錯的選擇,使用起來比較方便。此文僅做簡單介紹,如果希望了解得更多,可參考官方文檔http://db.apache.org/derby/manuals/index.html#latest有幾個不同部分的文檔,與SQL相關的部分如創建刪除表的SQL怎么寫,可以參考其中的《Derby Reference Manual》
另外在學習JavaDB里找了一些資料,下面這一篇我覺得還不錯,一并附上
參考資料:http://www.codejava.net/java-se/jdbc/connect-to-apache-derby-java-db-via-jdbc
另外在學習JavaDB里找了一些資料,下面這一篇我覺得還不錯,一并附上
參考資料:http://www.codejava.net/java-se/jdbc/connect-to-apache-derby-java-db-via-jdbc