|
Posted on 2017-01-10 10:48 ZhouFeng 閱讀(3279) 評論(0) 編輯 收藏 所屬分類: 原創 、 JAVA 、 DataBase
在做一些小的應用系統時,用過嵌入式數據庫,使用過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'; 加上create=true表明如果庫mydb不存在,則創建,數據庫文件存放位置為當前目錄,接下來創建一個表,可以把三個字段定義信息寫在一行里面,結束時要加分號 ij> create table stu(id int not null generated by default as identity, > 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 行 退出命令行狀態 重新進入命令行方式,進行數據驗證 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 行 查看當前表結構可以用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中創建一個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(); } } } 運行結果 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.網絡數據庫模式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 上的連接 表示當前窗口正在監聽,即網絡服務已開啟 查看數據庫的基本情況可以用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)); 以命令行方式進行數據庫連接并測試 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> 此時也可以在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(); } } } 控制以輸出結果為 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 此時查看數據庫內容為 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> 小結終于學習了JavaDB,又嘗試了一種嵌入式數據庫,在做一些小項目或是應用演示時很方便。在了解過JavaDB后,覺得JavaDB也是個不錯的選擇,很多操作都做成了批處理方式,在HSQLDB中也可以自己構造批處理,在HSQLDB中有個圖形界面可以用,相對直觀一些,對于體積來說,HSQLDB好像更小巧點,他們都支持內存數據庫,目前在數據庫性能上沒有做比較。總的來說,JavaDB是個不錯的選擇,使用起來比較方便。此文僅做簡單介紹,如果希望了解得更多,可參考官方文檔http://db.apache.org/derby/manuals/index.html#latest
|