`

merkeley db Demo

阅读更多
1.导入merkeley db 所需jar包(je-3.3.82.jar,je.jar、junit.jar)

2.创建一个JavaBean
package com.edong.dbd.example;

/**
* @author 张 柏 2009-5-22
* @copyright qwnbc
*/
public class User {
private String userName;
private String passWord;
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}

}

3.创建一个上下文
package com.edong.dbd.example;
import com.sleepycat.je.DatabaseEntry;
/**
* @author 张 柏 2009-5-22
* @copyright qwnbc
*/
public class EntityContent {

private DatabaseEntry dbKey;

private DatabaseEntry dbData;

public DatabaseEntry getDbData() {
return dbData;
}

public void setDbData(DatabaseEntry dbData) {
this.dbData = dbData;
}

public DatabaseEntry getDbKey() {
return dbKey;
}

public void setDbKey(DatabaseEntry dbKey) {
this.dbKey = dbKey;
}

}

4.实现数据缓存
package com.edong.dbd.example;

import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseConfig;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.Environment;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.EnvironmentConfig;
import com.sleepycat.je.LockMode;
import com.sleepycat.je.OperationStatus;
import java.io.File;
import java.io.UnsupportedEncodingException;

/**
*  数据库属性的设置:
* <br>1.DatabaseConfig.setAllowCreate():允许创建数据库
*       <br>--默认值是false,如果打开不存在的数据库就会报错.
*       <br>--true的时候,数据库不存在就创建。
* <br>2.DatabaseConfig.setBtreeComparator();
*       <br>--设置B树比较器,用来比较两个记录的key是否相同。
* <br>3.DatabaseConfig.setDuplicateComparator()
*       <br>--允许key重复的比较器。
* <br>4.DatabaseConfig.setSortedDuplicates()
*       <br>--设置为true,允许key重复,false的话,put一个存在key的记录会产生错误。
*       <br>--如果使用了关联了多个索引则一定不能支持重复的记录。
* <br>5.DatabaseConfig.setExclusiveCreate()
*       <br>--如果true,只能创建,如果存在,则打开失败。
* <br>6.DatabaseConfig.setReadOnly()
*       <br>--设置只读。
* <br>7.DatabaseConfig.setTransactional()
*       <br>--设置支持事务
*      
* @author 张 柏 2009-5-22
* @copyright qwnbc
*/
public class Fantasy {
private static Database userDatabase = null;
private static Environment dbEnv = null;
public Fantasy(){
try {
EnvironmentConfig envConf = new EnvironmentConfig();
envConf.setAllowCreate(true);
envConf.setTxnNoSync(true);
dbEnv = new Environment(new File("D:/dbEnv"), envConf);
DatabaseConfig dbConfig = new DatabaseConfig();
dbConfig.setAllowCreate(true);
dbConfig.setSortedDuplicates(true);
userDatabase = dbEnv.openDatabase(null, "sampleDatabase", dbConfig);
} catch (DatabaseException dbe) {
dbe.printStackTrace();
}
}
/*
* 字符转换;
*/
public EntityContent convert(User user){
String key = user.getUserName();
String data = user.getPassWord();
DatabaseEntry entryKey=null;
DatabaseEntry entryData =null;
try {
entryKey = new DatabaseEntry(key.getBytes("UTF-8"));
    entryData = new DatabaseEntry(data.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {

e.printStackTrace();
}
EntityContent ec=new EntityContent();
ec.setDbKey(entryKey);
ec.setDbData(entryData);
return ec;
}
/**
* 写数据
*/
/*
* get和put用在非重复的数据存储,读写库时,注意一个小区别:
* 数据库中是否允许重复的记录存在,两个记录公用一个key,这就是重复的记录,我们把重复的记录成为重复集合(多重);
* 游标用于重复数据存储put和get。
* 数据记录在内部是用Btree按照特定排序来存储的。一般是用key来排序的,key相同的多重数据是按照data来排序。
* 记录Using Database Records
* 记录是由key和data组成,即所熟悉的key->value,二者都被是有DatabaseEntry封装的。
* 这个之前也提过很多次了,DatabaseEntry可以封装原始类型和复杂的对象类型,二者都要被转换为byte
* array存储,转换可以使用Bind API来完成
*/
public void writeUser(EntityContent ec){
try {
/*
* 最好指定编码方式,因为不指定编码会用系统的默认编码来转换,因为系统的默认编码可能会被人更改。
*/


/*
* 如果不是可重复数据库,put将会覆盖原有的记录.
*/
userDatabase.put(null, ec.getDbKey(), ec.getDbData());
/*
* myDatabase.putNoOverwrite(null, theKey, theData);不允许覆盖。
*/
} catch (DatabaseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 读数据
*/
public boolean readUser(EntityContent ec){
   
    boolean b=false;
    /*
* 从byte数组转换为string的方法
* byte[] myKey = theKey.getData();
* byte[] myData = theData.getData();
* String key = new String(akey,"UTF-8");
* String data = new String(aData, "UTF-8");
*/
/*
* myDatabase.getSearchBoth(null, theKey, theData,
* LockMode.DEFAULT);查找key和data都匹配的记录
*/
    DatabaseEntry entryKey=ec.getDbKey();
DatabaseEntry entryData =ec.getDbData();
try {
if (userDatabase.get(null, entryKey, entryData, LockMode.DEFAULT) == OperationStatus.SUCCESS) {
/*
* 查询出来的key和data都是byte数组形式。theData.getData();
*/
if(entryData!=null&&!"".equals(entryData)){
byte[] retData = entryData.getData();
String foundData = new String(retData, "UTF-8");
System.out.println("For key: '" + entryKey + "' found data: '"
+ foundData + "'.");
b=true;
}


}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
    return b;
    }
   
    /*
* 删除数据
*/
    public void deleteUser(DatabaseEntry entryKey){
   
try {
userDatabase.delete(null, entryKey);
System.out.println("数据已被删除!");
} catch (DatabaseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
    }
   
    /**
* 关闭数据库
*/
    public void close(){
/*
* 如果打开了游标,关闭时JE会发出警告,让你关闭他们先。 活动状态的游标在关闭库的过程中会产生意想不到的结果,
* 尤其是其他线程在写库的过程中。 确定所有的访问都结束后再关闭库
*
*/
try {
if (userDatabase != null) {
userDatabase.close();
/* 重命名,必须先关闭数据库 */
dbEnv.renameDatabase(null, "sampleDatabase", "test");
/* 删除数据库,必须先关闭数据库 */
dbEnv.removeDatabase(null, "sampleDatabase");
/* 删除并回收数据库空间 ,true返回删除的记录的数量,false不返回删除的记录数量值 */
// myDbEnvironment.truncateDatabase(null,
// myDatabase.getDatabaseName(),true);
}
if (dbEnv != null) {
dbEnv.close();
}
} catch (DatabaseException dbe) {
dbe.printStackTrace();
}
    }
}

5.测试
package com.edong.dbd.example;

import junit.framework.TestCase;
/**
* @author 张 柏 2009-5-22
* @copyright qwnbc
*/
public class DBDTest extends TestCase {
Fantasy fantasy=new Fantasy();
public void testFantasy(){
User user=new User();
user.setUserName("jay");
user.setPassWord("123456");
EntityContent ec=fantasy.convert(user);
boolean b=fantasy.readUser(ec);//一开始是从服务器上查询出来.如果有或者没有.
if(!b){
fantasy.writeUser(ec);
}
fantasy.readUser(ec);
//查询数据库中
}
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics