也來玩玩MongoDB

最近NoSQL(或者NoRelation)很火,咱不想Out了,因此也來湊湊熱鬧。java

概念、優勢之類的東西就不在這裏重複囉嗦了,
直接動手玩一下。git

MongoDB(包括Java驅動)的官方文檔寫得不夠認真,
連個最普通的CRUD例子都沒有,
看過網站上那篇「Java–SavingObjectsUsingDBObject」文章的人確定被氣暈了。。。github

安裝:
1)下載MongoDB數據庫(這裏使用Windows32bit版)sql

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

而後解壓到一個目錄(這裏是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目錄mvc

完成上面兩步就算完成安裝任務了,夠簡單吧。app

啓動MongoDB數據庫服務器:ide

D:>cdD:MongoDB
D:MongoDB>binmongod–dbpathdatadb
能看到下面這張圖就算是成功了:

下面是一個CRUD例子,雖然簡單,不過也算是覆蓋了大多數核心內容了,
一邊看代碼一邊看註釋吧,挺簡單的。

Java代碼

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: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代碼

import douyu.mvc.Model;

@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;

@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);
 //….
 }
}
相關文章
相關標籤/搜索