BerkeleyDB-JE 使用BaseAPI(二)

本篇介紹使用BaseAPI來操作Java簡單類型的數據。
首先我們知道JE中的數據庫是鍵值對的集合,那麼數據庫中的每一條記錄都是一個鍵值對。鍵和值可以是任何簡單類型的對象,也可以是自定義的複雜類型的對象。在JE中是用 DatabaseEntry類來表示鍵和值的。這個類可以持有任何類型的數據,只要這個數據可以轉化爲字節數組。
我們現在演示下字符串類型的數據轉化爲DatabaseEntry

String aKey = "key";
String aData = "data";
try {
DatabaseEntry theKey = new DatabaseEntry(aKey.getBytes("UTF-8"));
DatabaseEntry theData = new DatabaseEntry(aData.getBytes("UTF-8"));
} catch (Exception e) {
// Exception handling goes here
}

相應的,也可以從DatabaseEntry中獲取字符串類型的數據值

byte[] myKey = theKey.getData();
byte[] myData = theData.getData();
String key = new String(myKey, "UTF-8");
String data = new String(myData, "UTF-8");

總之,DatabaseEntry對象就是BaseAPI操作JE的基礎,所有的CRUD操作都離不開它。
BaseAPI提供了兩種方式來讀寫數據:
1.使用database.get()和database.put()方法。
2.使用遊標。
本篇只介紹第一種方法。
寫數據
默認情況下,JE中的記錄是根據key值來排序的,如果數據庫允許有重複數據,則在重複數據集中還根據data來排序。你可以使用以下幾種方法來寫數據。
[list]
[*]Database.put()
這是最常用寫數據的方法,如果你的數據庫不支持重複數據,當要寫入的記錄鍵已存在於數據庫中時,則舊的記錄會被覆蓋。這也是修改數據的一種方式。
[*]Database.putNoOverwrite()
這個方法和上面那個方法不同的地方在於,當鍵已存在於數據庫中時,不論數據庫是否支持重複數據,都會返回OperationStatus.KEYEXIST,並且新的記錄無法寫到數據庫中。
[*]Database.putNoDupData()
當你要寫入的記錄的鍵和值都和數據庫中某條記錄項等時,返回OperationStatus.KEYEXIST,並且新的記錄無法寫到數據庫中。
[/list]
當你要寫入一條記錄到數據庫中時,你必須把鍵和值分別轉化爲DatabaseEntry對象,這意味着你要把鍵和值從java對象轉化成字節數組。
下面演示下寫數據。

String aKey = "myFirstKey";
String aData = "myFirstData";
try {
DatabaseEntry theKey = new DatabaseEntry(aKey.getBytes("UTF-8"));
DatabaseEntry theData = new DatabaseEntry(aData.getBytes("UTF-8"));
myDatabase.put(null, theKey, theData);
} catch (Exception e) {
// Exception handling goes here
}

讀數據
BaseAPI同樣提供了幾種方法來讀取數據庫中的記錄。
[list]
[*]Database.get()
根據傳來的鍵來查找記錄,若不存在,則返回 OperationStatus.NOTFOUND
[*]Database.getSearchBoth()
根據傳來的鍵和值來查找記錄,若不存在,則返回 OperationStatus.NOTFOUND
[/list]
當你要從數據庫中讀取一條記錄時,你必須把DatabaseEntry對象轉化爲值所對應的對象,這意味着你要用字節數組來構造值。
下面演示讀取數據

DatabaseEntry theKey = new DatabaseEntry(aKey.getBytes("UTF-8"));
DatabaseEntry theData = new DatabaseEntry();

// Perform the get.
if (myDatabase.get(null, theKey, theData, LockMode.DEFAULT) ==
OperationStatus.SUCCESS) {
// Recreate the data String.
byte[] retData = theData.getData();
String foundData = new String(retData, "UTF-8");
System.out.println("For key: '" + aKey + "' found data: '" +
foundData + "'.");
} else {
System.out.println("No record found for key '" + aKey + "'.");
}

刪除記錄
刪除數據庫中存在的記錄也有兩種方法:
[list]
[*]Database.delete()
這個方法可用來刪除匹配傳進來的鍵的記錄,若數據庫支持重複數據,則所有匹配鍵的記錄都會被刪除,如果你要刪除重複記錄集中的一條記錄則必須使用遊標。
[*]Environment.truncateDatabase()
這個方法用來清空數據庫中所有的記錄。
[/list]
下面演示刪除記錄

try {
String aKey = "myFirstKey";
DatabaseEntry theKey = new DatabaseEntry(aKey.getBytes("UTF-8"));

// Perform the deletion. All records that use this key are
// deleted.
myDatabase.delete(null, theKey);
} catch (Exception e) {
// Exception handling goes here
}

最後要注意的是,當你對數據庫做出了改變,實際上改變並沒有被立即寫入到磁盤中,它僅存在於內存中,有兩種方式你可以保證你做出的改變的持久化:
1.使用事務,默認情況下每當事務提交的時候,JE被把變化寫入磁盤。
2.如果由於某些原因,你沒有使用事務,那你必須在每次變化發生後顯示的調用Environment.sync()方法來確保變化被寫入到磁盤。實際上在你每次關閉Environment時,JE也會自動的調用Environment.sync()方法。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章