1.JDBM可以把它理解成一个嵌入式非常简单的数据库。官方网站:http://jdbm.sourceforge.net/ (OpenJMS和ActiveMQ 都用到了JDBM)
A:如果是以RecordManager.insert形式存储数据的话,它存储数据的格式是:一个自动生成的id + 一个序列化的对象。
B:如果是以BTree或HTree的insert形式存储数据的话,它存储数据的格式是:key + value ,类似Hashtable等
多数为个人理解,如果有不对的地方,望指正,谢谢:)
2.JDBM的普通存储(RecordManager.insert存储)
首先需要创建一个RecordManager,一般是通过RecordManagerFactory来创建它,需要一个字符串参数,这个参数用作JDBM创建的两个数据库文件名字的前缀。 例如:
- RecordManager recman = RecordManagerFactory.createRecordManager("test");
然后如果要保存一条新的记录,只需要调用RecordManager插入方法insert,它会返回 保存这条数据自动生成的一个id。例如:
- //返回一个保存对象new Integer(100)后生成的一个id值
- long recid = recman.insert(new Integer(100);
保持新记录之后,你需要通过使用RecordManager的commit方法(这个方法用来完成JDBM事件处理)来提交更改。你也可以使用rollback方法回滚到最后一次提交的地方,例如:
- recman.commit();
也可以为插入的记录设置一个别名,方便通过这个别名来取这条数据。例如:
- //也可以为插入的记录设置一个别名,方便通过这个别名来取这条数据。
- recman.setNamedObject("othername",recid);
为了取回保存的对象,如果你有记录id,那么可以通过RecordManager的fetch方法取,例如:
- Integer person2 = (Integer)recman.fetch(recid);
也可以通过它的引用别名来取,可以通过RecordManager的getNamedObject来获得记录id。这将返回记录id,如果要取出的记录不存在的话,将返回0,例如:
- long recid3 = recman.getNamedObject("othername");
- Integer person3 = (Integer)recman.fetch(recid3);
如果需要更新的话,可以调用RecordManager的update方法,例如:
- //可以把一个完全不同的类放到更新里,但是JDBM不会报错,因为它会把这些东西看作是可序列化的对象
- recman.update(recid, new Integer(10011));
3 JDBM里的HTree和BTree存储(BTree或HTree的insert形式存储)
Htree会给JDBM一个简单的保持哈希树,你可以在其中put()和get()键值,但是它缺少排序和大小语义。BTree是一个可伸缩性和可管理性更强的树,具有排序和大小语义,并能够浏览该树。所以我们一般常用BTree.可以通过BTree的static方法createInstance获得一个BTree的实例化对象,createInstance需要2个参数,一个是RecordManager,另一个是java.util.Comparator (让其能够对键值进行比较),JDBM自身带有一组用于Long、String和ByteArray的Comparator 。
例如:
- BTree bTree = BTree.createInstance(recman,new LongComparator());
这样就构建了一个BTree实例化对象,这个BTree拥有一个唯一的id(可以通过bTree.getRecid()获得到),这个id也就代表了这个BTree对象。也可以给这个BTree对象定义一个别名。例如:
- recman.setNamedObject("bTreeName",bTree.getRecid());
然后你就可以通过这个别名(bTreeName)来获得到这个BTree的id了。例如:
- long bTreeId = recman.getNamedObject("bTreeName");
通过BTree的load方法,也可以获得一个指定bTreeId的BTree对象,需要传递2个参数,一个是RecordManager,一个是要获得BTree对象的id值。
例如:
- BTree bTree1 = BTree.load(recman, bTree.getRecid());
如果要想从BTree里取出存储的值,可以通过find方法,参数是key值
- String key = "ttitfly"
- String strValue = (String)bTree.find(key);
如果要浏览这个树,可以使用通过browse()从BTree里获取的TupleBrowser,browse()方法返回一个TupleBrowser,放在树的键的开始部分。如果你向browse()提供了一个键,它就会位于树里的键的前面,如果你向它提供了一个“空(null)”作为键,那么它就会位于结尾。一旦有了TupleBrowser,就需要创建一个Tuple来保存键/值对(Tuple tuple=new Tuple(); ).当调用TupleBrowser.getNext()或者getPrevious()方法的时候,TupleBrowser将tuple作为一个参数。这两个方法都会返回一个布尔值,如果Tuple被取回,那么返回的就是“真(true)”,如果没有被取回,那么返回的就是“假(false)”。所以要在所有的键/值对里迭代,可以循环调用getNext()直到它返回false:
- Tuple tuple=new Tuple();
- TupleBrowser browser = bTree.browse();
- while ( browser.getNext( tuple ) ) {
- System.out.println( tuple.getKey()+" "+tuple.getValue() );
- }
4 。两种方式存储详细demo例子:
A:基本方式存储
- package ttitfly.jdbm;
- import java.io.Serializable;
- import jdbm.RecordManager;
- import jdbm.RecordManagerFactory;
- public class Test {
- public static void main(String[] args){
- try{
- //创建RecordManager实例对象
- RecordManager recman = RecordManagerFactory.createRecordManager("test" );
- //插入
- Person person1 = new Person();
- person1.setAge(24);
- person1.setName("ttitfly");
- long recid = recman.insert(person1);
- recman.commit();
- System.out.println(recid);
- //也可以为插入的记录设置一个别名,方便通过这个别名来取这条数据。
- recman.setNamedObject("othername",recid);
- //查询
- Person person2 = (Person)recman.fetch(recid);
- System.out.println(person2.getName());
- System.out.println(person2.getAge());
- //通过别名查询
- long recid3 = recman.getNamedObject("othername");
- Person person3 = (Person)recman.fetch(recid3);
- System.out.println(person3.getName());
- System.out.println(person3.getAge());
- //更新
- Person person4 = new Person();
- person4.setAge(25);
- person4.setName("test update");
- recman.update(recid, person4);
- recman.commit();
- Person person5 = (Person)recman.fetch(recid);
- System.out.println(person5.getAge());
- System.out.println(person5.getName());
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- }
- class Person implements Serializable{
- public String name;
- public int age;
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
输出结果为:
- 131130
- ttitfly
- 24
- ttitfly
- 24
- 25
- test update
B:BTree方式存储:
- package ttitfly.jdbm;
- import jdbm.RecordManager;
- import jdbm.RecordManagerFactory;
- import jdbm.btree.BTree;
- import jdbm.helper.StringComparator;
- import jdbm.helper.Tuple;
- import jdbm.helper.TupleBrowser;
- public class TestBTree {
- public static void main(String[] args){
- try{
- //创建RecordManager实例对象
- RecordManager recman = RecordManagerFactory.createRecordManager("test" );
- //构建一个BTree对象
- BTree bTree = BTree.createInstance(recman,new StringComparator());
- System.out.println(bTree.getRecid());
- String key = "ttitfly";
- String value = "true";
- boolean replace = true;
- //insert插入
- bTree.insert(key, value, replace);
- //给该BTree对象起个别名
- recman.setNamedObject("bTreeName",bTree.getRecid());
- //通过该别名获得到该BTree的id值
- long bTreeId = recman.getNamedObject("bTreeName");
- System.out.println(bTreeId);
- //通过BTree的id值,获取指定的BTree对象
- BTree bTree1 = BTree.load(recman, bTree.getRecid());
- //insert
- bTree1.insert("testkey", "testvalue", replace);
- //查找
- String strValue = (String)bTree.find("ttitfly");
- System.out.println(strValue);
- //查找出该BTree树里的所有的key,value值
- Tuple tuple=new Tuple();
- TupleBrowser browser = bTree.browse();
- while ( browser.getNext( tuple ) ) {
- System.out.println( tuple.getKey()+" "+tuple.getValue() );
- }
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- }
- 输出结果为:
- 131150
- 131150
- true
- testkey testvalue
- ttitfly true