將Berkeley DB基本數據庫操作封裝成類

江邊的山茶 7年前發布 | 11K 次閱讀 數據庫 Berkeley DB

Berkeley DB是一個嵌入式數據庫,適合于管理海量的、簡單的數據。

鍵值對(key/value)數據存儲方式使Berkeley DB用來進行數據庫管理的基礎,每個key/value構成一條記錄。 Berkeley的數據庫主要就是put和get,前者存入鍵值對,后者根據鍵獲取值。

因為Berkeley DB的數據庫操作有些復雜,所以將其封裝成了一個簡單的類:

package ch01_3;

import java.io.File;  
import java.util.AbstractMap.SimpleEntry;  
import java.util.ArrayList;  
import java.util.Map.Entry;

import com.sleepycat.bind.EntryBinding;  
import com.sleepycat.bind.serial.SerialBinding;  
import com.sleepycat.bind.serial.StoredClassCatalog;  
import com.sleepycat.collections.StoredMap;  
import com.sleepycat.je.Cursor;  
import com.sleepycat.je.CursorConfig;  
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;

/*********************************
 * 使用BerkeleyDB封裝了一些數據庫操作
 * 包括設置緩沖區,設置編碼,設置數據可庫
 * 路徑,存儲鍵值對,根據鍵查找值,關閉數
 * 據庫等操作。
 * @author Administrator
 *********************************/
public class MyBerkeley {

    private Environment environment;    //環境
    private Database    database;       //數據庫
    @SuppressWarnings("unused")
    private String      charset;        //編碼
    private String      path;           //路徑
    private long        chacheSize;     //緩沖區大小

    private StoredMap<Object, Object>   pendingDB = null;   
    private Object keyClass = String.class;         //設置默認的key值類型
    private Object valueClass = Integer.class;      //設置默認的value值類型

    public MyBerkeley(){
        charset = "UTF-8";      //編碼默認使用UTF-8
        chacheSize = 10000;     //緩沖區大小默認為10000
    }

    //設置編碼
    public void setCharset(String charset)
    {
        this.charset = charset;
    }

    //設置路徑
    public void setPath(String path){
        //判斷Path是否存在
        File file = new File(path);
        if(file.mkdir()){
            System.out.println(path+"已創建!"); //不存在則創建一個
        }
        else{
            System.out.println(path+"已存在!"); //存在則說明已存在
        }

        //確定存儲路徑
        this.path = path;
    }

    //設置緩沖區大小
    public boolean setChacheSize(long size){
        if(size<=0 || size >=1000000000)
        {
            return false; //使用默認的大小
        }
        this.chacheSize = size;
        return true;
    }

    //同時設置路徑和緩沖區
    public void setEnvironment(String path , long chacheSize){
        setPath(path);
        setChacheSize(chacheSize);
        //配置環境
        EnvironmentConfig envConfig = new EnvironmentConfig();
        envConfig.setAllowCreate(true);
        envConfig.setCacheSize(this.chacheSize);
        //創建環境
        environment = new Environment(new File(this.path),envConfig);
    }

    //設置存儲類型
    public void setClassType(Object keyClass,Object valueClass)
    {
        this.keyClass = keyClass;
        this.valueClass = valueClass;
    }

    //打開名字是dbName的數據庫
    @SuppressWarnings("unchecked")
    public void open(String dbName)
    {
        DatabaseConfig dbConfig = new DatabaseConfig();
        dbConfig.setAllowCreate(true);
        dbConfig.setSortedDuplicates(false); //不存儲重復關鍵字
        this.database = environment.openDatabase(null, dbName, dbConfig);
        //初始化存儲序列化對象的catalog類
        StoredClassCatalog catalog = new StoredClassCatalog(database);
        //鍵值都使用序列化的方式進行存儲
        EntryBinding<Object> keyBinding = new SerialBinding<Object>(catalog,(Class<Object>) keyClass);
        EntryBinding<Object> valueBinding = new SerialBinding<Object>(catalog,(Class<Object>) valueClass);
        //創建數據存儲的映射視圖
        pendingDB = new StoredMap<Object, Object>(database,keyBinding,valueBinding,true);
    }

    //關閉
    public void close()
    {
        database.close();
        environment.close();
    }

    //存儲
    public void put(Object key,Object value)
    {
        pendingDB.put(key, value);
    }

    //取值
    public Object get(Object key)
    {
        return pendingDB.get(key);
    }

    //按照鍵值刪除數據
    public Object del(Object key)
    {
        return pendingDB.remove(key);
    }

    //獲取數據庫存儲數據的大小
    public int size()
    {
        return pendingDB.size();
    }

    //遍歷數據庫
    public ArrayList<Entry<Object,Object>> getAllItems()
    {
        Cursor cursor = null;//游標
        ArrayList<Entry<Object,Object>> result = new ArrayList<Entry<Object,Object>>();
        CursorConfig cConfig = new CursorConfig();
        if(cursor == null)
            cursor = database.openCursor(null, cConfig);
        DatabaseEntry theKey = new DatabaseEntry();
        DatabaseEntry theValue = new DatabaseEntry();
        //使用Cursor.getPerv方法來遍歷游標獲取數據
        if(cursor.getFirst(theKey, theValue, LockMode.DEFAULT)
                == OperationStatus.SUCCESS)
        {
            Object key = theKey.getData();
            Object value = theValue.getData();
            Entry<Object,Object> entry = new SimpleEntry<Object,Object>(key,value);
            result.add(entry);
            while(cursor.getNext(theKey, theValue, LockMode.DEFAULT)
                    == OperationStatus.SUCCESS)
            {
                key = theKey.getData();
                value = theValue.getData();
                entry = new SimpleEntry<Object,Object>(key,value);
                result.add(entry);
            }
        }
        cursor.close();//關閉游標
        return result;
    }

    public static void main(String[] args) throws Exception {
           MyBerkeley db = new MyBerkeley();
           db.setEnvironment("C:\\BerkeleyDB\\MyDatabase2", 1000000);
           //設置存儲類型(包括鍵和值)
           db.setClassType(String.class, String.class);
           db.open("myDB");//打開數據庫

           //存儲值與取值測試
           /*
           for(int i=10; i>=0; i--) {
                 String key = "Key"+i;
                 String value = ""+i;
                 db.put(key , value);
                 System.out.println("[" + key + ":" + db.get(key) + "]");
           }//*/
           //獲取數據庫鍵值對數量
           System.out.println(db.size());
           //刪除數據測試
           db.del("Key3");
           //遍歷數據庫測試
           ArrayList<Entry<Object,Object>> r = db.getAllItems();
           for(int i=0;i<r.size();i++)
           {
               String key = new String((byte[]) r.get(i).getKey());
               String value = new String((byte[]) r.get(i).getValue(),"UTF-8");
               System.out.println(key+":"+value);
           }
           db.close();
        }
}

 

 

來自:http://www.zgljl2012.com/jiang-berkeley-dbji-ben-shu-ju-ku-cao-zuo-feng-zhuang-cheng-lei/

 

 本文由用戶 江邊的山茶 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!