日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

也来玩玩MongoDB

發(fā)布時(shí)間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 也来玩玩MongoDB 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近NoSQL(或者NoRelation)很火,咱不想Out了,所以也來(lái)湊湊熱鬧。

概念、優(yōu)點(diǎn)之類的東西就不在這里重復(fù)啰嗦了,
直接動(dòng)手玩一下。

MongoDB(包括Java驅(qū)動(dòng))的官方文檔寫(xiě)得不夠認(rèn)真,
連個(gè)最普通的CRUD例子都沒(méi)有,
看過(guò)網(wǎng)站上那篇“Java - Saving Objects Using DBObject”文章的人肯定被氣暈了。。。

安裝:
1)下載MongoDB數(shù)據(jù)庫(kù)(這里使用Windows 32 bit版)

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

然后解壓到一個(gè)目錄(這里是D:MongoDB),
并且在D:MongoDB目錄中建個(gè)”datadb”目錄用來(lái)存放數(shù)據(jù)文件。
(注意:很多文檔中說(shuō)”C:datadb”目錄是缺省目錄,實(shí)際上是不起作用的)

2)下載MongoDB數(shù)據(jù)庫(kù)的Java驅(qū)動(dòng)程序

http://github.com/downloads/mongodb/mongo-java-driver/mongo-1.3.jar
然后把mongo-1.3.jar放到D:MongoDB目錄

完成上面兩步就算完成安裝任務(wù)了,夠簡(jiǎn)單吧。

啟動(dòng)MongoDB數(shù)據(jù)庫(kù)服務(wù)器:

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

下面是一個(gè)CRUD例子,雖然簡(jiǎn)單,不過(guò)也算是覆蓋了大多數(shù)核心內(nèi)容了,
一邊看代碼一邊看注釋吧,挺簡(jiǎn)單的。

Java代碼

  • import java.util.*;
  • import com.mongodb.*; //com.mongodb包類似于java.sql,大多數(shù)與數(shù)據(jù)庫(kù)相關(guān)的類都在這里
    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同等級(jí)別的概念,
  • //默認(rèn)是鏈接到127.0.0.1:27017/test,
  • //見(jiàn)getConnectPoint()的輸出結(jié)果,其中27017是端口號(hào),test是數(shù)據(jù)庫(kù)名
  • Mongo mongo = new Mongo();
  • out(“mongo.getConnectPoint() = “+mongo.getConnectPoint());
    18.19. //查看所有的數(shù)據(jù)庫(kù)名
  • for(String dbName : mongo.getDatabaseNames()) {
  • out(“dbName = “+dbName);
  • }
    23.24. //DB類用來(lái)表示一個(gè)數(shù)據(jù)庫(kù),如果數(shù)據(jù)庫(kù)不存在則創(chuàng)建一個(gè)
  • DB db = mongo.getDB( “test” );
    26.27. //查看所有的Collection名
  • for(String collectionName : db.getCollectionNames()) {
  • out(“collectionName = “+collectionName);
  • }
    31.32. out();
    33.34. //DBCollection類用來(lái)存放對(duì)象,類似數(shù)據(jù)庫(kù)表的概念
  • DBCollection coll = db.getCollection(“testCollection”);
    36.37. //插入10個(gè)User對(duì)象到coll
  • //插入DBCollection中的對(duì)象必需實(shí)現(xiàn)DBObject接口(見(jiàn)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中的所有對(duì)象并打印輸出
    49.50. //查找出第一條記錄,在內(nèi)部會(huì)自動(dòng)轉(zhuǎn)換成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); //還原最初的對(duì)象類型
    57.58. out();
    59.60. user.setAge(100);
  • coll.save(user); //保存更新
  • findAll(coll); //確認(rèn)第一條記錄的”Age”是否變成100了?
    63.64. coll.remove(user); //刪除第一條記錄
    65.66. findAll(coll);
    67.68. //查找年紀(jì)大于等于15小于等于18的記錄(15<=age<=18)
  • //(查詢條件的組合方式很啰嗦,這方面就沒(méi)sql方便)
  • BasicDBObject query = new BasicDBObject();
  • //注意這里的”Age”第一個(gè)字母要大寫(xiě),如果把User類替換成UserNoReflection類就用小寫(xiě),
  • //這是因?yàn)镽eflectionDBObject類的內(nèi)部實(shí)現(xiàn)在截取setter和getter方法的”set”和”get”前綴后
  • //沒(méi)有進(jìn)行大小寫(xiě)轉(zhuǎn)換,比如”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. //跳過(guò)前面3條記錄,然后顯示總共5條記錄
  • cur = coll.find().skip(3).limit(5);
  • while(cur.hasNext()) {
  • out(cur.next());
  • }
    89.90. coll.drop(); //刪除coll這個(gè)DBCollection
  • }
    92.93. public static void findAll(DBCollection coll) {
  • DBCursor cur = coll.find();
  • while(cur.hasNext()) {
  • out(cur.next());
  • }
  • out();
  • }
    100.101. //插入DBCollection中的java對(duì)象必需實(shí)現(xiàn)DBObject接口,
  • //ReflectionDBObject實(shí)現(xiàn)了DBObject接口,在內(nèi)部是采用反射來(lái)完成的
  • 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. //如果不想用反射的方式,又不想手工實(shí)現(xiàn)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

    運(yùn)行:
    java -cp D:MongoDBmongo-1.3.jar;D:MongoDB MongoTest

    Douyu也支持MongoDB了,比上面的代碼還簡(jiǎn)潔

    Java代碼

  • //對(duì)應(yīng)上面的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中配置一個(gè)MongoDB的數(shù)據(jù)源(跟普通的關(guān)系型數(shù)據(jù)庫(kù)類似)
  • 最后是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();
  • //下面三個(gè)setter方法雖然沒(méi)有在User類中聲明,
  • //但是編譯器在編譯User類時(shí)發(fā)現(xiàn)User類帶有@Model,就會(huì)自動(dòng)生成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);
  • //….
  • }
  • }
  • 本文來(lái)源于"阿里中間件團(tuán)隊(duì)播客",原文發(fā)表時(shí)間"?2011-07-06?"

    總結(jié)

    以上是生活随笔為你收集整理的也来玩玩MongoDB的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。