`
zhc0822
  • 浏览: 228761 次
  • 性别: Icon_minigender_1
  • 来自: 宝仔的奇幻城堡
社区版块
存档分类
最新评论

适用于java语言的MongoDB解决方案——Mongernate

阅读更多
闲暇之余,写了一个封装MongoDB数据库访问操作的小程序——Mongernate。
下面简单地介绍一下这个隔离层的特色:
1、业务层的编码人员不需要了解MongoDB的相关语法,即可对数据进行增删改查操作,进行常见开发;
2、支持json、xml和Map三种形式的增删改查方式。可根据项目情况自由选择(Map支持得还不够好)。
3、支持从配置文件dbConfig.properties读取配置信息
4、返回给业务层的所有数据均为java.util.Map形式。

下面是一段测试用例,有详尽的注释。
package com.skyedge.db;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;


/**
 * 演示了Mongernate的使用方法。
 * 
 * @author GaoGao
 * 
 */
public class TestCase {

	/**
	 * @param args
	 */
	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 测试连接
		System.out.println("=============test connection==============");
		DBManager dm = new DBManager();
		dm.connect();
		// 指定数据库
		dm.use("soccer");
		// 测试json
		System.out.println("=============test json==============");
		// 插入5条数据
		dm.insert("{'name':'Van Der Sar','no':1,'position':'GK'}", "manu");
		dm.insert("{'name':'Wes Brown','no':6,'position':'RB'}", "manu");
		dm.insert("{'name':'Micheal Owen','no':7,'position':'CF'}", "manu");
		dm.insert("{'name':'Wayne Rooney','no':10,'position':'CF'}", "manu");
		dm.insert("{'name':'Ryan Giggs','no':11,'position':'SS'}", "manu");
		// 更改吉格斯的位置
		dm.update("{'name':'Ryan Giggs'}", "{'$set':{'position':'LMF'}}",
				"manu");
		//删除范德萨
		dm.delete("{'name':'Van Der Sar'}", "manu");
		// 查找所有球员,返回的是一个iterator
		Iterator<Map<String, Object>> it = dm.selectIterator("manu");
		// 应当输出 布朗、欧文、鲁尼和吉格斯
		while (it.hasNext()) {
			System.out.println(it.next());
		}
		System.out.println("-------------------");
		// 选择球衣号码大于6的球员, 返回一个数组
		ArrayList<Map<String, Object>> arr = dm.selectArray("{'no':{'$gt':6}}",
				"manu");
		// 应当输出欧文(7号),鲁尼10号,和吉格斯11号
		for (int i = 0; i < arr.size(); i++) {
			System.out.println(arr.get(i).get("name"));
		}
		
		
		dm.dropTable("manu");
		
		
		// 测试map
		System.out.println("=============test map==============");
		// 插入3条数据
		Map m = new HashMap<String, Object>();
		m.put("name", "Van Der Sar");
		m.put("no", 1);
		dm.insert(m, "manu");
		m = new HashMap<String, Object>();
		m.put("name", "Brown");
		m.put("no", 6);
		dm.insert(m, "manu");
		m = new HashMap<String, Object>();
		m.put("name", "Owen");
		m.put("no", 8);
		dm.insert(m, "manu");
		// 将欧文改为吉格斯
		Map m1 = new HashMap<String, Object>();
		m1.put("name", "Giggs");
		m1.put("no", 11);
		dm.update(m, m1, "manu");
		// 查询所有球员,返回一个iterator
		it = dm.selectIterator("manu");
		// 输出 范德萨、布朗和吉格斯
		while (it.hasNext()) {
			System.out.println(it.next());
		}
		System.out.println("-------------------");
		// 查找球员吉格斯
		arr = dm.selectArray(m1,
				"manu");
		// 输出吉格斯
		for (int i = 0; i < arr.size(); i++) {
			System.out.println(arr.get(i).get("name"));
		}
		
		dm.dropTable("manu");
		
		
		// 测试 xml
		System.out.println("=============test xml==============");
		// 插入4条数据
		dm.insertFromXml("<player><name>Anderson</name><no>8</no><position>AMF</position></player>", "manu");
		dm.insertFromXml("<player><name>Evans</name><no>23</no><position>CB</position></player>", "manu");
		dm.insertFromXml("<player><name>Carrick</name><no>16</no><position>CMF</position></player>", "manu");
		dm.insertFromXml("<player><name>Evra</name><no>3</no><position>LB</position></player>", "manu");
		// 把16号球员(卡里克)改为维迪奇
		dm.updateFromXml("<no>16</no>", "<player><name>Vidic</name><no>15</no><position>CB</position></player>",
				"manu");
		//删除位置为AMF的球员(安德森)
		dm.deleteFromXml("<position>AMF</position>", "manu");
		// 查找所有的中卫,返回一个iterator
		it = dm.selectIteratorFromXml("<position>CB</position>","manu");
		// 应当输出维迪奇和埃文斯
		while (it.hasNext()) {
			System.out.println(it.next());
		}
		dm.dropTable("manu");
	}

}



运行结果:




附件中提供了测试用例的Eclipse工程。同时还附带了mongodb1.4的java driver和Mongernate的jar包。
因为源码写得很丑,过几天整理了之后,再发上来和大家共同讨论。
使用过程中遇到问题的,请站内信。谢谢你们。
  • 大小: 8.4 KB
4
3
分享到:
评论
7 楼 skzr.org 2011-04-23  
不错的建议,呵呵,估计到下半年才有时间开始这个设计,希望出现了相关的东西可以拿过来用吧。

zhc0822 写道
skzr.org 写道
我一直在构思利用一款nosql,存储我们公司的数据(数据特点采集数据只读时间顺序的,接近海量)。对外提供方便的查询和检索。
没啥思路:
利用antlr做一个语法解析器datas query language,然后仿造gae的存储api做。
目前思路,不知道楼主的这个设计有没有设计图,看代码还是麻烦的。

文中的设计非常粗糙,而且功能简单,充其量只能算个DbUtils。
GAE的存储API是实现了JDO和JPA吧,我建议你上Google Code下载GAE SDK的源代码,然后找一款逆向工程工具就可以还原为UML了。下载地址:http://code.google.com/p/googleappengine/downloads/list

kimmking 写道
skzr.org 写道
我一直在构思利用一款nosql,存储我们公司的数据(数据特点采集数据只读时间顺序的,接近海量)。对外提供方便的查询和检索。
没啥思路:
利用antlr做一个语法解析器datas query language,然后仿造gae的存储api做。
目前思路,不知道楼主的这个设计有没有设计图,看代码还是麻烦的。

可以看看 treapdb
代码很少

6 楼 kimmking 2011-04-23  
skzr.org 写道
我一直在构思利用一款nosql,存储我们公司的数据(数据特点采集数据只读时间顺序的,接近海量)。对外提供方便的查询和检索。
没啥思路:
利用antlr做一个语法解析器datas query language,然后仿造gae的存储api做。
目前思路,不知道楼主的这个设计有没有设计图,看代码还是麻烦的。

可以看看 treapdb
代码很少
5 楼 kimmking 2011-04-23  
zhc0822 写道
kimmking 写道
这个想法不错。

多谢。我们后来又设计了一个相对完善的框架,并用于项目之中。甚至还一度非常想要发展成为一款nosql的ORM,现在想想,还好当时没有冲动。



mongodb的 orm 和 jdbc都有了。
http://code.google.com/p/morphia/
https://github.com/erh/mongo-jdbc
4 楼 zhc0822 2011-04-22  
skzr.org 写道
我一直在构思利用一款nosql,存储我们公司的数据(数据特点采集数据只读时间顺序的,接近海量)。对外提供方便的查询和检索。
没啥思路:
利用antlr做一个语法解析器datas query language,然后仿造gae的存储api做。
目前思路,不知道楼主的这个设计有没有设计图,看代码还是麻烦的。

文中的设计非常粗糙,而且功能简单,充其量只能算个DbUtils。
GAE的存储API是实现了JDO和JPA吧,我建议你上Google Code下载GAE SDK的源代码,然后找一款逆向工程工具就可以还原为UML了。下载地址:http://code.google.com/p/googleappengine/downloads/list
3 楼 skzr.org 2011-04-22  
我一直在构思利用一款nosql,存储我们公司的数据(数据特点采集数据只读时间顺序的,接近海量)。对外提供方便的查询和检索。
没啥思路:
利用antlr做一个语法解析器datas query language,然后仿造gae的存储api做。
目前思路,不知道楼主的这个设计有没有设计图,看代码还是麻烦的。
2 楼 zhc0822 2011-04-22  
kimmking 写道
这个想法不错。

多谢。我们后来又设计了一个相对完善的框架,并用于项目之中。甚至还一度非常想要发展成为一款nosql的ORM,现在想想,还好当时没有冲动。
1 楼 kimmking 2011-04-22  
这个想法不错。

相关推荐

Global site tag (gtag.js) - Google Analytics