最近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. @Modelpublic 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. @Controllerpublic 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);//….}} 本文来源于"阿里中间件团队播客",原文发表时间" 2011-07-06 " 相关资源:敏捷开发V1.0.pptx