也来玩玩MongoDB
最近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目录中建个”datadb”目录用来存放数据文件。
(注意:很多文档中说”C:datadb”目录是缺省目录,实际上是不起作用的)
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>binmongod –dbpath datadb
能看到下面这张图就算是成功了:
下面是一个CRUD例子,虽然简单,不过也算是覆盖了大多数核心内容了,
一边看代码一边看注释吧,挺简单的。
Java代码
- import java.util.*;
- import com.mongodb.*; //com.mongodb包类似于java.sql,大多数与数据库相关的类都在这里
3.4. public class MongoTest { - public static void out(Object o) {
- System.err.println(o);
- }
- public static void out() {
- System.err.println();
- }
11.12. 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());
18.19. //查看所有的数据库名 - for(String dbName : mongo.getDatabaseNames()) {
- out(“dbName = “+dbName);
- }
23.24. //DB类用来表示一个数据库,如果数据库不存在则创建一个 - DB db = mongo.getDB( “test” );
26.27. //查看所有的Collection名 - for(String collectionName : db.getCollectionNames()) {
- out(“collectionName = “+collectionName);
- }
31.32. out();
33.34. //DBCollection类用来存放对象,类似数据库表的概念 - DBCollection coll = db.getCollection(“testCollection”);
36.37. //插入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());
44.45. coll.insert(user); - }
47.48. findAll(coll); //查找出coll中的所有对象并打印输出
49.50. //查找出第一条记录,在内部会自动转换成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); //还原最初的对象类型
57.58. out();
59.60. user.setAge(100); - coll.save(user); //保存更新
- findAll(coll); //确认第一条记录的”Age”是否变成100了?
63.64. coll.remove(user); //删除第一条记录
65.66. findAll(coll);
67.68. //查找年纪大于等于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));
75.76.77. DBCursor cur = coll.find(query); - while(cur.hasNext()) {
- out(cur.next());
- }
81.82. out();
83.84. //跳过前面3条记录,然后显示总共5条记录 - cur = coll.find().skip(3).limit(5);
- while(cur.hasNext()) {
- out(cur.next());
- }
89.90. coll.drop(); //删除coll这个DBCollection - }
92.93. public static void findAll(DBCollection coll) { - DBCursor cur = coll.find();
- while(cur.hasNext()) {
- out(cur.next());
- }
- out();
- }
100.101. //插入DBCollection中的java对象必需实现DBObject接口, - //ReflectionDBObject实现了DBObject接口,在内部是采用反射来完成的
- public static class User extends ReflectionDBObject {
- private String name;
- private int age;
- private Date date;
107.108. public void setName(String name) { - this.name = name;
- }
111.112. public String getName() { - return name;
- }
115.116. public void setAge(int age) { - this.age = age;
- }
119.120. public int getAge() { - return age;
- }
123.124. public void setDate(Date date) { - this.date = date;
- }
127.128. public Date getDate() { - return date;
- }
- }
132.133. //如果不想用反射的方式,又不想手工实现DBObject接口的方法, - //可以直接继承BasicDBObject,但是需要做额外的工作,
- //就像下面这样:
- public static class UserNoReflection extends BasicDBObject {
- private String name;
- private int age;
- private Date date;
140.141. public void setName(String name) { - this.name = name;
143.144. super.put(“name”, name); - }
146.147. public String getName() { - return name;
- }
150.151. public void setAge(int age) { - this.age = age;
153.154. super.put(“age”, age); - }
156.157. public int getAge() { - return age;
- }
160.161. public void setDate(Date date) { - this.date = date;
163.164. super.put(“date”, date); - }
166.167. public Date getDate() { - return date;
- }
170.171. 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;
175.176. return super.put(key, v); - }
- }
- }
把MongoTest.java文件放到D:MongoDB目录
编译:
javac -cp D:MongoDBmongo-1.3.jar D:MongoDBMongoTest.java
运行:
java -cp D:MongoDBmongo-1.3.jar;D:MongoDB MongoTest
Douyu也支持MongoDB了,比上面的代码还简洁
Java代码
- //对应上面的User类(或UserNoReflection类),
- //在Douyu中如下所示,不需要任何setter和getter代码
3.4. import douyu.mvc.Model;
5.6. @Model - public class User {
- private String name;
- private int age;
- private Date date;
- }
然后在conf/server.java中配置一个MongoDB的数据源(跟普通的关系型数据库类似)
最后是Controller
Java代码
- import java.util.Date;
- import douyu.mvc.Controller;
- import douyu.mvc.ModelManager;
4.5. @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());
14.15. modelManager.insert(user);
16.17. user.setAge(20); - modelManager.save(user);
19.20. modelManager.delete(user); - //….
- }
- }
也来玩玩MongoDB相关推荐
- 《MongoDB权威指南》迷你书连载一-入门篇
MongoDB 非常强大,同时也很容易上手.本章会介绍一些 MongoDB 的基本概念. 文档是 MongoDB 中数据的基本单元,非常类似与关系型数据库中的行(但是比行要复杂得多) 类似地,集可以被 ...
- nodejs+express+mongodb简单的例子
简单的介绍下node+express+mongodb这三个东西. node:是运行在服务器端的程序语言,表面上看过去就是javascript一样的东西,但是呢,确实就是服务器语言,个人觉得在一定层次上 ...
- 【MongoDB】2、安装MongoDB 2.6.1 on Unbuntu 14.04(学习流水账)
计划: 装一个虚机,ubuntu吧,14.04 Trusty Tahr. 安装MongoDB 网络资源:http://mirrors.aliyun.com/ubuntu-releases/14.04/ ...
- 在CentOS上安装MongoDB
CentOS系统有软件安装管理软件,安装起来非常方便,相信用CentOS系统的人们都非常中意这种安装软件的方法.MongoDB官网也提供了用YUM安装MongoDB数据库的软件包.现在我们用这种方法来 ...
- docker java镜像_Springboot整合MongoDB的Docker开发,其它应用也类似
1 前言 Docker是容器开发的事实标准,而Springboot是Java微服务常用框架,二者必然是会走到一起的.本文将讲解如何开发Springboot项目,把它做成Docker镜像,并运行起来. ...
- core 实例化接口_实例讲解Springboot整合MongoDB进行CRUD操作的两种方式
1 简介 Springboot是最简单的使用Spring的方式,而MongoDB是最流行的NoSQL数据库.两者在分布式.微服务架构中使用率极高,本文将用实例介绍如何在Springboot中整合Mon ...
- MongoDB学习指导
原文地址:http://blog.csdn.net/jakenson/article/details/7060431 MongoDB的内部构造<MongoDB The Definitive Gu ...
- 关于Mongodb的全面总结
MongoDB的内部构造<MongoDB The Definitive Guide> MongoDB的官方文档基本是how to do的介绍,而关于how it worked却少之又少,本 ...
- 关于Mongodb的全面总结,学习mongodb的人,可以从这里开始!
转载地址:http://blog.csdn.net/he90227/article/details/45674513 原文地址:http://blog.csdn.NET/jakenson/articl ...
最新文章
- sublime 添加代码片段(snippets)
- Ionic 用于构建惊人的移动应用程序的顶级开源框架
- 在多线程中使用spring的bean
- mysql 中执行的 sql 注意字段之间的反向引号和单引号
- html.parser python_python模块之HTMLParser
- php tea 算法 源码,PHP教程:TEA算法实现
- w7设置双显示器_怎么在windows7系统下设置双显示器
- 正则表达式之语法规则
- 北师大计算机学院调剂,北师大数学科学学院2020年硕士研究生调剂方案
- 珍藏 | 近200篇机器学习与深度学习经典论文整理
- Docker镜像优化:从1.16GB到22.4MB,真强!
- UNIX linux vi命令
- 高等数学(第七版)同济大学 习题2-5 个人解答
- MediaExtractor、MediaMuxer 分离和合成 mp4
- 主成分与因子分析异同_主成分和因子分析原理及比较
- excel锁定行,锁定列,同时锁定行和列
- geojson文件与shape文件的相互转换
- “红黑树”,我一脸懵逼......
- PS 颜色表大全-CMYK颜色表(2)
- vue 身份证校验、识别性别/生日/年龄