DB4O简单例子
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import com.db4o.Db4o;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;
import com.db4o.config.Configuration;
import com.db4o.query.Predicate;
/**
* Db4o的功能类
*
*/
public class Db4oUtils {
static {
Db4oUtils.startConfigure();
}
/**
* 打开数据存储库
*
* @param fileName
* 数据存储文件名称
* @return 返回对象容器
*/
public static ObjectContainer open(String fileName) {
ObjectContainer db = Db4o.openFile(fileName);
return db;
}
/**
* 关闭数据存储库
*
* @param 数据存储容器
*/
public static boolean close(ObjectContainer db) {
db.commit();
return db.close();
}
/**
* 启动db4o的自定义配置
*/
public static void startConfigure() {
Configuration conf = Db4o.configure();
conf.blockSize(8);
}
/**
* 根据条件获取ObjectSet,ObjectSet对对象采用延迟加载机制,若取业务对象请采用fetchObjectList()方法。
*
* @param 数据库文件路径
* @param 判断谓词
* @return 返回结果集(ObjectSet)
*/
public static ObjectSet fetchObjectSet(String databasePath,
com.db4o.query.Predicate predicate) {
ObjectContainer db = Db4oUtils.open(databasePath);
ObjectSet os = db.query(predicate);
Db4oUtils.close(db);
return os;
}
/**
* 根据条件获取结果集
*
* @param 数据库文件路径
* @param 判断谓词,如果不是谓词对象,获取该对象的所有实例
* @return 返回结果集(List)
*/
public static List fetchObjectList(String databasePath, Object obj) {
java.util.List list = null;
if (obj instanceof Predicate) {
// 根据谓词判断取结果集
ObjectContainer db = Db4oUtils.open(databasePath);
ObjectSet os = db.query((Predicate) obj);
list = Db4oUtils.convertObjectSet(os);
Db4oUtils.close(db);
} else {
// 返回该对象的所有实例结果集
ObjectContainer db = Db4oUtils.open(databasePath);
ObjectSet os = db.query((Class) obj);
list = Db4oUtils.convertObjectSet(os);
Db4oUtils.close(db);
}
return list;
}
/**
* 保存对象
*
* @param 数据库路径
* @param 要保存的对象
*/
public static void saveObject(String databasePath, Object obj) {
ObjectContainer db = Db4oUtils.open(databasePath);
db.set(obj);
Db4oUtils.close(db);
}
/**
* 更新某对象
*
* @param 数据库路径
* @param 要更新的对象
* @throws InvocationTargetException
* @throws IllegalAccessException
*/
public static void updateObject(String databasePath, Object oldObj,
Object newObj) throws IllegalAccessException,
InvocationTargetException {
ObjectContainer db = Db4oUtils.open(databasePath);
ObjectSet os = db.get(oldObj);
Object tempObj = os.get(0);
// 采用BeanUtils将新对象的属性拷贝过来进行覆盖即可,效率较高。
// 只对属性更新,但若是关系对象不知道是否有漏洞。
org.apache.commons.beanutils.BeanUtils.copyProperties(tempObj, newObj);
db.set(tempObj);
Db4oUtils.close(db);
}
/**
* 删除某对象
*
* @param 数据库路径
* @param 要删除的对象
* @param 是否知道对象存在,对象已经查询过,知道其是存在的。
*
*/
public static void removeObject(String databasePath, Object obj) {
if (obj == null) {
System.out.println("要删除的对象为null,无法删除!!");
return;
}
ObjectContainer db = Db4oUtils.open(databasePath);
ObjectSet os = db.get(obj);
if (os.isEmpty()) {
System.out.println("删除的对象不存在,不用删除!!");
} else {
Object tempObj = os.get(0);
db.delete(tempObj);
System.out.println("删除该对象成功!!");
}
Db4oUtils.close(db);
}
/**
* 将ObjestSet的对象存储到List中
*
* @param 结果集
*/
public static List convertObjectSet(ObjectSet os) {
java.util.List list = new java.util.ArrayList(os.size());
while (os.hasNext()) {
list.add(os.next());
}
return list;
}
}