也来玩玩MongoDB
浏览:3317次 出处信息
概念、优点之类的东西就不在这里重复了,
直接动手玩一下。
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); //.... } }
建议继续学习:
- MongoDB与内存 (阅读:5347)
- Nodejs和MongoDB初体验 (阅读:5021)
- 我为什么选择MongoDB (阅读:3878)
- 白话MongoDB(一) (阅读:3632)
- MySQL和MongoDB设计实例对比 (阅读:3633)
- 记一次MongoDB性能问题 (阅读:3399)
- MySQL Cluster 与 MongoDB 复制及分片设计及原理 (阅读:3214)
- 在MongoDB中模拟auto_increment (阅读:2993)
- 白话MongoDB(二) (阅读:2662)
- NoSQL数据库:MongoDB初探 (阅读:2558)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:Row Cache For Innodb
后一篇:一次神奇的MySQL优化 >>
文章信息
- 作者:游啊游,淡定、淡定 来源: 游啊游,淡定、淡定
- 标签: MongoDB
- 发布时间:2011-09-18 21:27:47
建议继续学习
近3天十大热文
- [52] 图书馆的世界纪录
- [52] IOS安全–浅谈关于IOS加固的几种方法
- [51] 如何拿下简短的域名
- [50] android 开发入门
- [49] Oracle MTS模式下 进程地址与会话信
- [49] Go Reflect 性能
- [47] 【社会化设计】自我(self)部分――欢迎区
- [45] 读书笔记-壹百度:百度十年千倍的29条法则
- [37] 程序员技术练级攻略
- [28] 视觉调整-设计师 vs. 逻辑