Berkeley db 基本操作代码(基础)

    最近学习Berkeley DB Java Edition(JE版)。写一个浅显的例子,入门吧~
至于什么是bdb,请参考 bdb中国研发团队的这篇文章
package com.berkeley.dbje;
 
import java.io.File;
import java.io.UnsupportedEncodingException;
 
import com.sleepycat.bind.tuple.IntegerBinding;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseConfig;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.Environment;
import com.sleepycat.je.EnvironmentConfig;
import com.sleepycat.je.LockMode;
import com.sleepycat.je.OperationStatus;
 
public class MyBdb {
    
    private static MyBdb myBdb = null;
    private EnvironmentConfig envConfig;
    private Environment env;
    
    private DatabaseConfig dbConfig;
    private Database db;
    
    private MyBdb(){}//prevent others to construct the class object
    
    public static MyBdb newInstance(){//single alone pattern,must using static
        if(myBdb == null){
            myBdb = new MyBdb();
        }
        return myBdb;
    }
    
    //initialize the environment and database
    public void initEnv(){
        try{
            File file = new File("./db/");
            if(!file.exists()) file.mkdirs();
            
            envConfig = new EnvironmentConfig();
            envConfig.setAllowCreate(true);
            env = new Environment(file,envConfig);
            
            dbConfig = new DatabaseConfig();
            dbConfig.setAllowCreate(true);
            db = env.openDatabase(null, "vertext", dbConfig);//use env to open db
            
        }catch(Exception e){
            e.printStackTrace();
        }            
    }
    
    //close env and database
    public void close(){
        try{
            //close the database first! and then close the environemnt
            if(db!=null){
                db.close();
            }
            
            if(env!=null){
                env.close();
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
 
    //insert key(int)&value(String)
    public int insert(int key,String value){
        try {
            DatabaseEntry tkey = new DatabaseEntry();
            IntegerBinding.intToEntry(key, tkey);//change int to entry(object)
            
            //class String can get bytes-->DatabaseEntry(byte[] data
            DatabaseEntry tvalue = new DatabaseEntry(value.getBytes("UTF-8"));
            
            //another method to change String into entry(object)
            //StringBinding.stringToEntry(value, tvalue);
            
            //you have finished changing object to entry,then put to db
            if(OperationStatus.SUCCESS != db.put(null, tkey, tvalue)){
                System.out.println("database error:fail to insert data !");
                return -1;
            }
            
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return -2;
        }
        
        return 0;
        
    }
 
    //through key(int) to get data(String)
    public String getRecord(int key){
        String value = null;
        try{
            DatabaseEntry tkey = new DatabaseEntry();
            IntegerBinding.intToEntry(key, tkey);
            
            DatabaseEntry tvalue = new DatabaseEntry();
            
            if(OperationStatus.SUCCESS != db.get(null, tkey, tvalue, LockMode.DEFAULT)){
                System.out.println("database error:fail to get data records!");
            }else{//get the record and change
                value = new String(tvalue.getData());
            }
            
        }catch(Exception e){
            e.printStackTrace();
        }
        
        return value;
    }
 
    //insert object
    //object can be considered as key or value!
    public int insert(int key ,ObjectData oData){
        try{
            DatabaseEntry tkey = new DatabaseEntry();
            IntegerBinding.intToEntry(key, tkey);
            
            DatabaseEntry tvalue = new DatabaseEntry();
            ObjectTupleBinding obind = new ObjectTupleBinding();
            obind.objectToEntry(oData, tvalue);//encapsulate key&value to One Entry
            
            if(OperationStatus.SUCCESS != db.put(null, tkey, tvalue)){
                System.out.println("database error:fail to insert data");
                return -1;
            }
            
        }catch(Exception e){
            e.printStackTrace();
            return -2;
        }
        return 0;
    }
 
    //get the object data
    public ObjectData getRecord(int key,boolean flag){
        ObjectData od = null;
        try{
            ObjectTupleBinding oBind = new ObjectTupleBinding();
            
            DatabaseEntry tkey = new DatabaseEntry();
            IntegerBinding.intToEntry(key, tkey);
            
            DatabaseEntry tvalue = new DatabaseEntry();
            if(OperationStatus.SUCCESS == db.get(null, tkey, tvalue, LockMode.DEFAULT)){                
                od = (ObjectData)oBind.entryToObject(tvalue);
            }
        }catch(Exception e){
            e.printStackTrace();
        }
        return od;
    }
 
    
}

以上是berkeley db的基本操作。初始化environment和database等、插入数据、读取数据!


实体对象类ObjectData代码如下:

package com.berkeley.dbje;
 
public class ObjectData {
    private int key;
    private String name;
    private double sum;
    private long length;
    
    public ObjectData(int key,String name,double sum,long length){
        this.key = key;
        this.name = name;
        this.sum = sum;
        this.length = length;
    }
    
    public ObjectData(){
        
    }
    
    public int getKey() {
        return key;
    }
    public void setKey(int key) {
        this.key = key;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getSum() {
        return sum;
    }
    public void setSum(double sum) {
        this.sum = sum;
    }
    public long getLength() {
        return length;
    }
    public void setLength(long length) {
        this.length = length;
    }
 
}

要将对象数据存入数据库,首先必须将对象变成DatabaseEntry对象,因此两者只要需要一个转化的类:ObjectDataTupleBinding类:

package com.berkeley.dbje;
 
import com.sleepycat.bind.tuple.TupleBinding;
import com.sleepycat.bind.tuple.TupleInput;
import com.sleepycat.bind.tuple.TupleOutput;
 
/**
 * identify the regular of data convert
 * @author sang
 *
 */
public class ObjectTupleBinding extends TupleBinding{
 
    @Override
    public Object entryToObject(TupleInput in) {
        //order is very important
        ObjectData od = new ObjectData();
        od.setKey(in.readInt());
        od.setName(in.readString());
        od.setSum(in.readDouble());
        od.setLength(in.readLong());
        
        return od;
    }
 
    @Override
    public void objectToEntry(Object obj, TupleOutput out) {
 
        //invert object to class ObjectData
        ObjectData od = (ObjectData)obj;
        
        // Write the data to the TupleOutput (a DatabaseEntry).
        // Order is important. The first data written will be
        // the first bytes used by the default comparison routines.
        out.writeInt(od.getKey());
        out.writeString(od.getName());
        out.writeDouble(od.getSum());
        out.writeLong(od.getLength());
        
        //then the data will be written to database
    }
    
}

test代码如下:

package com.berkeley.dbje;
 
public class MainTest {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        MyBdb myBdb = MyBdb.newInstance();
        ObjectData od = new ObjectData();
        myBdb.initEnv();
        myBdb.insert(12, "ad");
        myBdb.insert(13,new ObjectData(1,"sa",12,1));
        System.out.println(myBdb.getRecord(12));
        od = myBdb.getRecord(13,true);
        if(od != null){
            System.out.println(od.getName());
        }        
        myBdb.close();
    }
 
}

版权所有,如需转载请留言,并保留本文地址。谢谢~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值