DB4O面相对象的数据库

前些日子,一直忙着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

希望对大家有帮助

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值