`
mengyang
  • 浏览: 263610 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

BerkeleyDB-JE 使用BaseAPI(二)

    博客分类:
  • BDB
 
阅读更多
本篇介绍使用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来排序。你可以使用以下几种方法来写数据。
  • Database.put()
  • 这是最常用写数据的方法,如果你的数据库不支持重复数据,当要写入的记录键已存在于数据库中时,则旧的记录会被覆盖。这也是修改数据的一种方式。
  • Database.putNoOverwrite()
  • 这个方法和上面那个方法不同的地方在于,当键已存在于数据库中时,不论数据库是否支持重复数据,都会返回OperationStatus.KEYEXIST,并且新的记录无法写到数据库中。
  • Database.putNoDupData()
  • 当你要写入的记录的键和值都和数据库中某条记录项等时,返回OperationStatus.KEYEXIST,并且新的记录无法写到数据库中。

当你要写入一条记录到数据库中时,你必须把键和值分别转化为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同样提供了几种方法来读取数据库中的记录。
  • Database.get()
  • 根据传来的键来查找记录,若不存在,则返回 OperationStatus.NOTFOUND
  • Database.getSearchBoth()
  • 根据传来的键和值来查找记录,若不存在,则返回 OperationStatus.NOTFOUND

当你要从数据库中读取一条记录时,你必须把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 + "'.");
}

删除记录
删除数据库中存在的记录也有两种方法:
  • Database.delete()
  • 这个方法可用来删除匹配传进来的键的记录,若数据库支持重复数据,则所有匹配键的记录都会被删除,如果你要删除重复记录集中的一条记录则必须使用游标。
  • Environment.truncateDatabase()
  • 这个方法用来清空数据库中所有的记录。

下面演示删除记录
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()方法。
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics