本文目錄一覽:
- 1、java 6 中自帶的javaDB(derby)數據庫,是否不用啟動服務,直接可以和jdk進行交互呀?
- 2、javaDB是做什麼用的,為什麼安裝jdk需要安裝這個?
- 3、javadb被封了怎麼找到新的
- 4、JavaDB的一些問題
- 5、Java DB是什麼?
java 6 中自帶的javaDB(derby)數據庫,是否不用啟動服務,直接可以和jdk進行交互呀?
新安裝了 JDK 6 的程序員們也許會發現,除了傳統的 bin、jre 等目錄,JDK 6 新增了一個名為 db 的目錄。這便是 Java 6 的新成員:Java DB。這是一個純 Java 實現、開源的數據庫管理系統(DBMS),源於 Apache 軟件基金會(ASF)名下的項目 Derby。它只有 2MB 大小,對比動輒上 G 的數據庫來說可謂袖珍。但這並不妨礙 Derby 功能齊備,支持幾乎大部分的數據庫應用所需要的特性。更難能可貴的是,依託於 ASF 強大的社區力量,Derby 得到了包括 IBM 和 Sun 等大公司以及全世界優秀程序員們的支持。這也難怪 Sun 公司會選擇其 10.2.2 版本納入到 JDK 6 中,作為內嵌的數據庫。這就好像為 JDK 注入了一股全新的活力:Java 程序員不再需要耗費大量精力安裝和配置數據庫,就能進行安全、易用、標準、並且免費的數據庫編程。在這一章中,我們將初窺 Java DB 的世界,來探究如何使用它編寫出功能豐富的程序。
Hello, Java DB:內嵌模式的 Derby
既然有了內嵌(embedded)的數據庫,就讓我們從一個簡單的範例開始,試着使用它吧。這個程序做了大多數數據庫應用都可能會做的操作:在 DBMS 中創建了一個名為 helloDB 的數據庫;創建了一張數據表,取名為 hellotable;向表內插入了兩條數據;然後,查詢數據並將結果打印在控制台上;最後,刪除表和數據庫,釋放資源。
public class HelloJavaDB {
public static void main(String[] args) {
try { // load the driver
Class.forName(“org.apache.derby.jdbc.EmbeddedDriver”).newInstance();
System.out.println(“Load the embedded driver”);
Connection conn = null;
Properties props = new Properties();
props.put(“user”, “user1”); props.put(“password”, “user1”);
//create and connect the database named helloDB
conn=DriverManager.getConnection(“jdbc:derby:helloDB;create=true”, props);
System.out.println(“create and connect to helloDB”);
conn.setAutoCommit(false);
// create a table and insert two records
Statement s = conn.createStatement();
s.execute(“create table hellotable(name varchar(40), score int)”);
System.out.println(“Created table hellotable”);
s.execute(“insert into hellotable values(‘Ruth Cao’, 86)”);
s.execute(“insert into hellotable values (‘Flora Shi’, 92)”);
// list the two records
ResultSet rs = s.executeQuery(
“SELECT name, score FROM hellotable ORDER BY score”);
System.out.println(“namettscore”);
while(rs.next()) {
StringBuilder builder = new StringBuilder(rs.getString(1));
builder.append(“t”);
builder.append(rs.getInt(2));
System.out.println(builder.toString());
}
// delete the table
s.execute(“drop table hellotable”);
System.out.println(“Dropped table hellotable”);
rs.close();
s.close();
System.out.println(“Closed result set and statement”);
conn.commit();
conn.close();
System.out.println(“Committed transaction and closed connection”);
try { // perform a clean shutdown
DriverManager.getConnection(“jdbc:derby:;shutdown=true”);
} catch (SQLException se) {
System.out.println(“Database shut down normally”);
}
} catch (Throwable e) {
// handle the exception
}
System.out.println(“SimpleApp finished”);
}
}
隨後,我們在命令行(本例為 Windows 平台,當然,其它系統下稍作改動即可)下鍵入以下命令:
清單 2. 運行 HelloJavaDB 命令
java –cp .;%JAVA_HOME%dblibderby.jar HelloJavaDB
圖 1. HelloJavaDB 程序的執行結果
上述的程序和以往沒什麼區別。不同的是我們不需要再為 DBMS 的配置而勞神,因為 Derby 已經自動地在當前目錄下新建了一個名為 helloDB 的目錄,來物理地存儲數據和日誌。需要做的只是注意命名問題:在內嵌模式下驅動的名字應為 org.apache.derby.jdbc.EmbeddedDriver;創建一個新數據庫時需要在協議後加入 create=true。另外,關閉所有數據庫以及 Derby 的引擎可以使用以下代碼:
清單 3. 關閉所有數據庫及 Derby 引擎
DriverManager.getConnection(“jdbc:derby:;shutdown=true”);
如果只想關閉一個數據庫,那麼則可以調用:
清單 4. 關閉一個數據庫
DriverManager.getConnection(“jdbc:derby:helloDB;shutdown=true “);
這樣,使用嵌入模式的 Derby 維護和管理數據庫的成本接近於 0。這對於希望專心寫代碼的人來說不失為一個好消息。然而有人不禁要問:既然有了內嵌模式,為什麼大多數的 DBMS 都沒有採取這樣的模式呢?不妨做一個小實驗。當我們同時在兩個命令行窗口下運行 HelloJavaDB 程序。結果一個的結果與剛才一致,而另一個卻出現了錯誤,如 圖 2 所示。
圖 2. 內嵌模式的局限
錯誤的原因其實很簡單:在使用內嵌模式時,Derby 本身並不會在一個獨立的進程中,而是和應用程序一起在同一個 Java 虛擬機(JVM)里運行。因此,Derby 如同應用所使用的其它 jar 文件一樣變成了應用的一部分。這就不難理解為什麼在 classpath 中加入 derby 的 jar 文件,我們的示例程序就能夠順利運行了。這也說明了只有一個 JVM 能夠啟動數據庫:而兩個跑在不同 JVM 實例里的應用自然就不能夠訪問同一個數據庫了。
鑒於上述的局限性,和來自不同 JVM 的多個連接想訪問一個數據庫的需求,下一節將介紹 Derby 的另一種模式:網絡服務器(Network Server)。
網絡服務器模式
如上所述,網絡服務器模式是一種更為傳統的客戶端/服務器模式。我們需要啟動一個 Derby 的網絡服務器用於處理客戶端的請求,不論這些請求是來自同一個 JVM 實例,還是來自於網絡上的另一台機器。同時,客戶端使用 DRDA(Distributed Relational Database Architecture)協議連接到服務器端。這是一個由 The Open Group 倡導的數據庫交互標準。圖 3 說明了該模式的大體結構。
由於 Derby 的開發者們努力使得網絡服務器模式與內嵌模式之間的差異變小,使得我們只需簡單地修改 清單 1 中的程序就可以實現。如清單 5所示,我們在 HelloJavaDB 中增添了一個新的函數和一些字符串變量。不難看出,新的代碼只是將一些在上一節中特別指出的字符串進行了更改:驅動類為 org.apache.derby.jdbc.ClientDriver,而連接數據庫的協議則變成了 jdbc:derby://localhost:1527/。這是一個類似 URL 的字符串,而事實上,Derby 網絡的客戶端的連接格式為:jdbc:derby://server[:port] /databaseName[;attributeKey=value]。在這個例子中,我們使用了最簡單的本地機器作為服務器,而端口則是 Derby 默認的 1527 端口。
圖 3. Derby 網絡服務器模式架構
清單 5. 網絡服務器模式下的 HelloJavaDB
public class HelloJavaDB {
public static String driver = “org.apache.derby.jdbc.EmbeddedDriver”;
public static String protocol = “jdbc:derby:”;
public static void main(String[] args) {
// same as before
}
private static void parseArguments(String[] args) {
if (args.length == 0 || args.length 1) {
return;
}
if (args[0].equalsIgnoreCase(“derbyclient”)) {
framework = “derbyclient”;
driver = “org.apache.derby.jdbc.ClientDriver”;
protocol = “jdbc:derby://localhost:1527/”;
}
}
}
當然,僅僅有客戶端是不夠的,我們還需要啟動網絡服務器。Derby 中控制網絡服務器的類是 org.apache.derby.drda.NetworkServerControl,因此鍵入以下命令即可。如果想了解 NetworkServerControl 更多的選項,只要把 start 參數去掉就可以看到幫助信息了。關於網絡服務器端的實現,都被 Derby 包含在 derbynet.jar 里。
清單 6. 啟動網絡服務器
java -cp .;”C:Program FilesJavajdk1.6.0dblibderby.jar”;
“C:Program FilesJavajdk1.6.0dblibderbynet.jar”
org.apache.derby.drda.NetworkServerControl start
相對應的,網絡客戶端的實現被包含在 derbyclient.jar 中。所以,只需要在 classpath 中加入該 jar 文件,修改後的客戶端就可以順利地讀取數據了。再一次嘗試着使用兩個命令行窗口去連接數據庫,就能夠得到正確的結果了。如果不再需要服務器,那麼使用 NetworkServerControl 的 shutdown 參數就能夠關閉服務器。
更多
至此,文章介紹了 Java SE 6 中的新成員:Java DB(Derby),也介紹了如何在內嵌模式以及網絡服務器模式下使用 Java DB。當然這只是淺嘗輒止,更多高級的選項還需要在 Sun 和 Derby 的文檔中尋找。在這一章的最後,我們將簡單介紹幾個 Java DB 的小工具來加快開發速度。它們都位於 org.apache.derby.tools 包內,在開發過程中需要獲取信息或者測試可以用到。
• ij:一個用來運行 SQL 腳本的工具;
• dblook:為 Derby 數據庫作模式提取(Schema extraction),生成 DDL 的工具;
• sysinfo:顯示系統以及 Derby 信息的工具類;
javaDB是做什麼用的,為什麼安裝jdk需要安裝這個?
單純安裝jdk是不需要javaDB的,安裝完jdk之後配置環境變量,然後就可以寫代碼了,不需要安裝別的
javadb被封了怎麼找到新的
1、首先打開javadb官網,並登錄自己的javadb賬號密碼。
2、其次點擊首頁左上角賬號找回,並先擇被封賬號。
3、最後點擊獲取新的賬號密碼即可。
JavaDB的一些問題
javaDB其實就是Derby,它並不是一個新的數據庫產品,它是由IBM捐獻給Apache的DB項目的一個純Java數據庫,JDK6.0裏面帶的這個Derby的版本是 10.2.1.7,支持存儲過程和觸發器;有兩種運行模式,一種是作為嵌入式數據庫,另一種是作為網絡數據庫,前者的數據庫服務器和客戶端都在同一個 JVM裏面運行,後者允許數據庫服務器端和客戶端不在同一個JVM裏面,而且允許這兩者在不同的物理機器上.值得注意的是JDK6裏面的這個Derby支持JDK6的新特性JDBC 4.0規範(JSR 221),現在我們如果要練習JDBC的用法,沒有必要單獨裝一個數據庫產品了,直接用Derby就行.
1、本身沒有操作界面,可以用第三方工具來管理(也就是你說的操作界面),Aqua Data Studio 具備管理功能的用於 Apache Derby 關係數據庫的管理工具和數據庫查詢工具。直觀管理功能讓用戶能夠瀏覽和修改數據庫結構,包括架構對象和數據庫存儲,以及維護數據庫安全。集成查詢工具讓您能夠迅速創建、編輯和執行 SQL 查詢與腳本。Aqua Data Studio 進一步提供導入與導出工具,從而輕鬆地將數據移入和移出不同的數據格式及 Apache Derby 數據庫。集成在這些工具內的是庫瀏覽器 (Repository Browser),擁有 CVS 和 Subversion (SVN) 的完整來源控制客戶端。
2、兩者的區別,簡單的說,就是javaDB是一個簡化輕量級數據庫,適合小型系統的小規模測試用,完全可以跑在內存里的數據庫,它只有3M大小,而MySQL則是可以應用部署大型系統的數據庫,功能更多更全,也更穩定,是用範圍更廣。
3、下面是個使用derby的簡單例子:
首先導入JAR包:derby.jar,如果你裝的是JDK6,在C:\Program Files\Sun\JavaDB\lib目錄下就可以找到.
然後就要創建數據庫了:
代碼
private Connection getConnection() throws SQLException {
Connection connection = DriverManager
.getConnection(“jdbc:derby:userDB;create=true;user=test;password=test”);
connection.setAutoCommit(false);
return connection;
}
其中userDB是要連接數據庫的名字,create=true表示如果該數據庫不存在,則創建該數據庫,如果數據庫存在,則用用戶user=test;密碼password=test連接數據庫.
有了數據庫,接下來該建表了:
代碼
private void createTable(Connection connection) throws SQLException {
Statement statement = connection.createStatement();
String sql = “create table USERS(“
+ ” ID BIGINT not null generated by default as identity,”
+ ” USER_NAME VARCHAR(20) not null,”
+ ” PASSWORD VARCHAR(20),”
+ ” constraint P_KEY_1 primary key (ID))”;
statement.execute(sql);
sql = “create unique index USER_NAME_INDEX on USERS (“
+ ” USER_NAME ASC)”;
statement.execute(sql);
statement.close();
}
創建了 USERS表,包括ID,USER_NAME,PASSWORD三個列,其中ID是主鍵,其中generated by default as identity 的作用類似sequence,identity是定義自動加一的列,
GENERATED BY ALWAYS AS IDENTITY
GENERATED BY DEFAULT AS IDENTITY
By always和by default是說明生成這個IDENTITY的方式。
By always是完全由系統自動生成。
by default是可以由用戶來指定一個值。
編寫與USERS表對應的javabean(這個就不多說了),:
代碼
public class User implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private Long id;
private String userName;
private String password;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
接下來就可以就數據庫進行增刪改查的操作了:
插入數據:
代碼
private void create(User user) {
Connection connection = null;
try {
connection = this.getConnection();
PreparedStatement statement = connection
.prepareStatement(“insert into users (user_name,password) values(?,?)”);
int index = 1;
statement.setString(index++, user.getUserName());
statement.setString(index++, user.getPassword());
statement.execute();
user.setId(this.getId(connection));
connection.commit();
} catch (SQLException e) {
rollback(connection);
throw new RuntimeException(e);
} finally {
if (connection != null) {
close(connection);
}
}
}
代碼
private Long getId(Connection connection) throws SQLException {
CallableStatement callableStatement = connection
.prepareCall(“values identity_val_local()”);
ResultSet resultSet = callableStatement.executeQuery();
resultSet.next();
Long id = resultSet.getLong(1);
resultSet.close();
callableStatement.close();
return id;
}
getId方法是獲得系統默認的id值,是通過 identity_val_local()獲得的,而函數IDENTITY_VAL_LOCAL()則可以在INSERT語句執行之後,為我們返回剛才系統為id所產生的值.感覺還是有點想sequence的curr_val.
修改數據:
代碼
private void update(User user) {
Connection connection = null;
try {
connection = this.getConnection();
PreparedStatement statement = connection
.prepareStatement(“update users set user_name=?,password=? where id=?”);
int index = 1;
statement.setString(index++, user.getUserName());
statement.setString(index++, user.getPassword());
statement.setLong(index++, user.getId());
statement.execute();
connection.commit();
} catch (SQLException e) {
rollback(connection);
throw new RuntimeException(e);
} finally {
if (connection != null) {
close(connection);
}
}
}
刪除數據:
代碼
public void delete(Long id) {
Connection connection = null;
try {
connection = this.getConnection();
PreparedStatement statement = connection
.prepareStatement(“delete from users where id=?”);
statement.setLong(1, id);
statement.execute();
connection.commit();
} catch (SQLException e) {
rollback(connection);
throw new RuntimeException(e);
} finally {
if (connection != null) {
close(connection);
}
}
}
查詢數據:
代碼
public User findById(Long id) {
Connection connection = null;
try {
connection = this.getConnection();
PreparedStatement statement = connection
.prepareStatement(“select user_name,password from users where id=?”);
statement.setLong(1, id);
ResultSet resultSet = statement.executeQuery();
User user = null;
if (resultSet.next()) {
user = new User();
user.setId(id);
user.setUserName(resultSet.getString(“user_name”));
user.setPassword(resultSet.getString(“password”));
}
resultSet.close();
statement.close();
connection.commit();
return user;
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
if (connection != null) {
close(connection);
}
}
}
Java DB是什麼?
它卻是一個先進的全事務處理的基於Java技術的數據庫,它支持各類開放標準、觸發器和存儲程序。Java DB可以客戶端服務器模式使用,也可以直接嵌入到一個Java應用程序中。在這些場合,Java DB都可以在同樣的Java虛擬機(JVM)中運行,這就無需在應用程序之外單獨購買、下載、安裝或管理這個數據庫。對於選擇在生產中採用Java DB的客戶,Sun將提供支持服務。Java DB:Java 6 里的數據庫新安裝了 JDK 6 的程序員們也許會發現,除了傳統的 bin、jre 等目錄,JDK 6 新增了一個名為 javadb 的目錄。這便是 Java 6 的新成員:Java DB。這是一個純 Java 實現、開源的數據庫管理系統(DBMS),源於 Apache 軟件基金會(ASF)名下的項目 Derby。它只有 3MB 大小,對比動輒上 G 的數據庫來說可謂袖珍。但這並不妨礙 Derby 功能齊備,支持幾乎大部分的數據庫應用所需要的特性。更難能可貴的是,依託於 ASF 強大的社區力量,Derby 得到了包括 IBM 和 Sun 等大公司以及全世界優秀程序員們的支持。這也難怪 Sun 公司會選擇其 10.2.2 版本納入到 JDK 6 中,作為內嵌的數據庫。這就好像為 JDK 注入了一股全新的活力:Java 程序員不再需要耗費大量精力安裝和配置數據庫,就能進行安全、易用、標準、並且免費的數據庫編程。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/156853.html