前些日子,一直忙着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
希望对大家有帮助