merkeley db Demo

xiaoxiao2026-05-19  2

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); //查询数据库中 } } 相关资源:敏捷开发V1.0.pptx
转载请注明原文地址: https://www.6miu.com/read-5049011.html

最新回复(0)