技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> MySQL --> 也来玩玩MongoDB

也来玩玩MongoDB

浏览:3237次  出处信息
最近NoSQL(或者NoRelation)很火,咱不想Out了,所以也来凑凑热闹。

概念、优点之类的东西就不在这里重复了,
直接动手玩一下。

MongoDB(包括Java驱动)的官方文档写得不够认真,
连个最普通的CRUD例子都没有,
看过网站上那篇“Java - Saving Objects Using DBObject”文章的人肯定被气晕了。。。



安装:
1)下载MongoDB数据库(这里使用Windows 32 bit版)

http://downloads.mongodb.org/win32/mongodb-win32-i386-1.2.4.zip

然后解压到一个目录(这里是D:\\MongoDB),
并且在D:\\MongoDB目录中建个\"data\\db\"目录用来存放数据文件。
(注意:很多文档中说\"C:\\data\\db\"目录是缺省目录,实际上是不起作用的)


2)下载MongoDB数据库的Java驱动程序

http://github.com/downloads/mongodb/mongo-java-driver/mongo-1.3.jar
然后把mongo-1.3.jar放到D:\\MongoDB目录

完成上面两步就算完成安装任务了,够简单吧。



启动MongoDB数据库服务器:


D:\\>cd D:\\MongoDB
D:\\MongoDB>bin\\mongod --dbpath data\\db
能看到下面这张图就算是成功了:


下面是一个CRUD例子,虽然简单,不过也算是覆盖了大多数核心内容了,
一边看代码一边看注释吧,挺简单的。

import java.util.*;
import com.mongodb.*; //com.mongodb包类似于java.sql,大多数与数据库相关的类都在这里

public class MongoTest {
	public static void out(Object o) {
		System.err.println(o);
	}
	public static void out() {
		System.err.println();
	}

	public static void main(String[] args) throws Exception {
		//Mongo是与java.sql.Connection同等级别的概念,
		//默认是链接到127.0.0.1:27017/test,
		//见getConnectPoint()的输出结果,其中27017是端口号,test是数据库名
		Mongo mongo = new Mongo();
		out(\"mongo.getConnectPoint() = \"+mongo.getConnectPoint());

		//查看所有的数据库名
		for(String dbName : mongo.getDatabaseNames()) {
			out(\"dbName = \"+dbName);
		}

		//DB类用来表示一个数据库,如果数据库不存在则创建一个
		DB db = mongo.getDB( \"test\" ); 

		//查看所有的Collection名
		for(String collectionName : db.getCollectionNames()) {
			out(\"collectionName = \"+collectionName);
		}

		out();

		//DBCollection类用来存放对象,类似数据库表的概念
		DBCollection coll = db.getCollection(\"testCollection\");

		//插入10个User对象到coll
		//插入DBCollection中的对象必需实现DBObject接口(见User类的注释)
		for(int i=1; i<=10; i++) {
			User user = new User();
			user.setName(\"user \"+(10+i));
			user.setAge(10+i);
			user.setDate(new Date());

			coll.insert(user);
		}

		findAll(coll); //查找出coll中的所有对象并打印输出

		//查找出第一条记录,在内部会自动转换成User类型
		coll.setObjectClass(User.class);
		User user = (User)coll.findOne();
		out(\"user.name=\"+user.getName());
		out(\"user.age=\"+user.getAge());
		out(\"user.getDate()=\"+user.getDate());
		coll.setObjectClass(BasicDBObject.class); //还原最初的对象类型

		out();

		user.setAge(100);
		coll.save(user); //保存更新
		findAll(coll); //确认第一条记录的\"Age\"是否变成100了?

		coll.remove(user); //删除第一条记录

		findAll(coll);

		//查找年纪大于等于15小于等于18的记录(15<=age<=18)
		//(查询条件的组合方式很嗦,这方面就没sql方便)
		BasicDBObject query = new BasicDBObject();
		//注意这里的\"Age\"第一个字母要大写,如果把User类替换成UserNoReflection类就用小写,
		//这是因为ReflectionDBObject类的内部实现在截取setter和getter方法的\"set\"和\"get\"前缀后
		//没有进行大小写转换,比如\"setAge\"得到的key值就是\"Age\"
		query.put(\"Age\", new BasicDBObject(\"$gte\", 15).append(\"$lte\", 18));
		

		DBCursor cur = coll.find(query);
        while(cur.hasNext()) {
			out(cur.next());
		}

		out();

		//跳过前面3条记录,然后显示总共5条记录
		cur = coll.find().skip(3).limit(5);
        while(cur.hasNext()) {
			out(cur.next());
		}

		coll.drop(); //删除coll这个DBCollection
	}

	public static void findAll(DBCollection coll) {
		DBCursor cur = coll.find();
        while(cur.hasNext()) {
            out(cur.next());
        }
		out();
	}

	//插入DBCollection中的java对象必需实现DBObject接口,
	//ReflectionDBObject实现了DBObject接口,在内部是采用反射来完成的
	public static class User extends ReflectionDBObject {
		private String name;
		private int age;
		private Date date;

		public void setName(String name) {
			this.name = name;
		}

		public String getName() {
			return name;
		}

		public void setAge(int age) {
			this.age = age;
		}

		public int getAge() {
			return age;
		}

		public void setDate(Date date) {
			this.date = date;
		}

		public Date getDate() {
			return date;
		}
	}

	//如果不想用反射的方式,又不想手工实现DBObject接口的方法,
	//可以直接继承BasicDBObject,但是需要做额外的工作,
	//就像下面这样:
	public static class UserNoReflection extends BasicDBObject {
		private String name;
		private int age;
		private Date date;

		public void setName(String name) {
			this.name = name;

			super.put(\"name\", name);
		}

		public String getName() {
			return name;
		}

		public void setAge(int age) {
			this.age = age;

			super.put(\"age\", age);
		}

		public int getAge() {
			return age;
		}

		public void setDate(Date date) {
			this.date = date;

			super.put(\"date\", date);
		}

		public Date getDate() {
			return date;
		}

		public Object put(String key, Object v) {
			if(key.equals(\"name\")) name = (String)v;
			else if(key.equals(\"age\")) age = (Integer)v;
			else if(key.equals(\"date\")) date = (Date)v;

			return super.put(key, v);
		}
	}
}


把MongoTest.java文件放到D:\\MongoDB目录

编译:
javac -cp D:\\MongoDB\\mongo-1.3.jar D:\\MongoDB\\MongoTest.java

运行:
java -cp D:\\MongoDB\\mongo-1.3.jar;D:\\MongoDB MongoTest


Douyu也支持MongoDB了,比上面的代码还简洁

//对应上面的User类(或UserNoReflection类),
//在Douyu中如下所示,不需要任何setter和getter代码

import douyu.mvc.Model;

@Model
public class User {
	private String name;
	private int age;
	private Date date;
}


然后在conf/server.java中配置一个MongoDB的数据源(跟普通的关系型数据库类似)

最后是Controller

import java.util.Date;
import douyu.mvc.Controller;
import douyu.mvc.ModelManager;

@Controller
public class MongoTest {
	public void index(ModelManager modelManager) {
		User user = new User();
		//下面三个setter方法虽然没有在User类中声明,
		//但是编译器在编译User类时发现User类带有@Model,就会自动生成setter、getter方法
		user.setName(\"user 10\");
		user.setAge(10);
		user.setDate(new Date());

		modelManager.insert(user);

		user.setAge(20);
		modelManager.save(user);

		modelManager.delete(user);
		//....
	}
}

建议继续学习:

  1. MongoDB与内存    (阅读:5225)
  2. Nodejs和MongoDB初体验    (阅读:4957)
  3. 我为什么选择MongoDB    (阅读:3813)
  4. 白话MongoDB(一)    (阅读:3564)
  5. MySQL和MongoDB设计实例对比    (阅读:3500)
  6. 记一次MongoDB性能问题    (阅读:3338)
  7. MySQL Cluster 与 MongoDB 复制及分片设计及原理    (阅读:3130)
  8. 在MongoDB中模拟auto_increment    (阅读:2933)
  9. 白话MongoDB(二)    (阅读:2596)
  10. NoSQL数据库:MongoDB初探    (阅读:2485)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:Row Cache For Innodb
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1