最近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); //…. } }