前些日子,一直忙着Android项目,于是,接触到了SQLite数据库的操作。对于有过SQLite数据库开发经验的人来说,习惯了Hibernate,再重新写繁重的JDBC操作过程,无异于是一件痛苦的事情。
于是,在Android项目结束之后,就想着将SQLite数据库进行优化下。
对于WEB开发人员,第一个想到的是,是否已经有着Android版本的数据库框架?
无意中,在网络上看到了db4o数据库(开始以为是一个框架,后来才明白是一个小型数据库,尴尬)的介绍,感觉操作简单,方便,于是就做了下研究。
对于db4o数据库的介绍,网络上的资料只能说是寥寥无几,都是与官方没有太多差异的介绍,纯面向对象数据库、满足数据库的设计理念:ACID等等。
无一不说其好,都是照搬官方文档、介绍。
不过,个人感觉该数据库还稍有欠缺:分页查询、自增长主键ID、GUI界面。
好了,多的不说了,看看周末两天的成果。
首先,按照Hibernate框架操作数据库的习惯,定义一个接口类,这里就不贴代码了。
然后定义一个实体类对象:私有属性,生成get、set方法,构造函数,重写toString()方法等等。
下面就是db4o的DAO类了:
/**
* 获得db4o的数据库连接对象
* @return
*/
@Override
public ObjectContainer getDBConnection() {
return Db4oEmbedded.openFile(Db4oEmbedded.newConfiguration(), path);
}
/**
* 关闭数据库连接操作
* @param db
*/
public void freeResource(ObjectContainer db) {
try {
if (db != null) {
db.close();
}
} catch (Db4oIOException e) {
e.printStackTrace();
}
}
设置的一些私有的查询操作方法
private Query setAttribute(Query query, String[] paramNames, Object[] values) {
if (paramNames.length > 0) {
for (int i = 0; i < paramNames.length; i++) {
query.descend(paramNames[i]).constrain(values[i]);
}
}
return query;
}
private Query setBlurAttribute(Query query, String[] paramNames,
Object[] values) {
if (paramNames.length > 0) {
for (int i = 0; i < paramNames.length; i++) {
query.descend(paramNames[i]).constrain(values[i]).like();
}
}
return query;
}
private Query setAttribute(Query query, Map<String, String> order) {
if (order != null) {
Set<String> keys = order.keySet();
for (String str : keys) {
if ("asc".equals(str)) {
query.descend(order.get(str)).orderAscending();
} else if ("desc".equals(str)) {
query.descend(order.get(str)).orderDescending();
}
}
}
return query;
}
上述代码木有注释,不过对于大家来说应该是可以看得明白的。
设置查询参数、设置排序条件
/**
* 更新、保存数据
* @param entity
*/
@Override
public void saveEntity(Object entity) {
ObjectContainer db = getDBConnection();
db.store(entity);
db.commit();
freeResource(db);
}
更新、保存数据用的是同意个方法,数据如果已经存在于数据库中,则更新,否则新增
下面是删除方法:
@Override
public void delEntity(Object entity) {
ObjectContainer db = getDBConnection();
db.delete(entity);
db.commit();
freeResource(db);
}
更新、保存、删除都需要提交事务,不可忘记
第一种db4o的查询方式:QBE,尼玛,开始的时候看了半天,嫩是想不起来以前用过这种查询名称,后来看解释Query By Example,是否很坑爹……上代码
@Override
public <T> T findByExample(T entity) {
ObjectContainer db = getDBConnection();
ObjectSet<T> result = db.queryByExample(entity);
T t = null;
while (result.hasNext()) {
t = result.next();
}
freeResource(db);
return t;
}
对于有过JDBC开发的程序员来说,这段代码应该是很不陌生,不过,注意引用的包全部都是db4o的,其他不解释
第二种查询方式:SODA,Simple Object DataBase Access,字面解释简单对象访问数据库,其实就是类似Hibernate中Criteria查询方式,个人十分喜欢,可以进行泛型类的封装,上代码:
1、根据ID查询数据
@Override
public <T> T findById(Class<T> entity, int id) {
ObjectContainer db = getDBConnection();
Query query = db.query();
query.constrain(entity);
query.descend("id").constrain(id);
freeResource(db);
return null;
}
2、根据条件参数查询数据,setAttribute()方法查看顶楼代码
@Override
public <T> T findEntity(Class<T> entity, String[] paramNames,
Object[] values) {
ObjectContainer db = getDBConnection();
Query query = db.query();
query.constrain(entity);
query = setAttribute(query, paramNames, values);
ObjectSet<T> result = query.execute();
T t = null;
while (result.hasNext()) {
t = result.next();
}
freeResource(db);
return t;
}
3、查询数据,并进行排序操作,setAttribute()方法,查看顶楼代码
@Override
public <T> List<T> findAll(Class<T> entity, Map<String, String> order) {
ObjectContainer db = getDBConnection();
List<T> list = new ArrayList<T>();
Query query = db.query();
query.constrain(entity);
query = setAttribute(query, order);
ObjectSet<T> result = query.execute();
while (result.hasNext()) {
T t = result.next();
list.add(t);
}
freeResource(db);
return list;
}
4、模糊查询,setBlurAttribute()方法查看顶楼代码
@Override
public <T> List<T> findByBlur(Class<T> entity, String[] paramNames,
Object[] values) {
ObjectContainer db = getDBConnection();
Query query = db.query();
query.constrain(entity);
query = setBlurAttribute(query, paramNames, values);
ObjectSet<T> result = query.execute();
List<T> list = new ArrayList<T>();
while (result.hasNext()) {
T t = result.next();
list.add(t);
}
freeResource(db);
return list;
}
比较遗憾的事,就是分页查询么能搞定,实属一大憾事,浪费了这么好的一个数据库框架,如果有朋友对db4o中分页查询操作有深入研究的,可以联系我的QQ;920656263
希望对大家有帮助