mongodb在java驅動包下的操作

jopen 9年前發布 | 86K 次閱讀 MongoDB NoSQL數據庫

    忙了四五天,終于對mongoDB有了一定的認識和了解。前面幾篇博客中,我介紹了在Linux下mongoDB的安裝和遇到的問題,以及在Linux下mongoDB的高級查詢和高級修改的一些語法規則。本篇博客我將隆重介紹mongoDB在java驅動包下的操作。
    MongoDB可能是現今NoSQL數據庫中最著名的,但并不意味著MongoDB是完美的,在某些情況下,傳統的關系數據庫如MySQL和PostgreSQL更具優勢。但MongoDB目前已經相當廣泛,使用者們在充分享受它的靈活性。

                                                                              --西楚小羽
    首先來談一下愛上mongoDB的七大理由:

1. 文檔存儲
    數據存儲以BSON/JSON文檔,這對于Web應用程序有很大的意義。開發者API喜歡以JSON形式傳輸,這使得整個項目的數據表示可采用統一的模型。所有這一切都無需任何前期架構設計。
2. 可擴展性
    MongoDB被用在一些規模龐大的環境中,FourSquare/Craiglist都在使用它。通過分片數據縮放處理理論上可實現更高的吞吐量。
3. 簡單的復制
    就像分片技術一樣,MongoDB范圍內復制過程同樣簡單好用,在副本機器上還有大量的復制選項。靈活的功能可滿足用戶應用的需求。
4. 易于查詢
    MongoDB以文檔的形式存儲數據,不支持事務和表連接。因此查詢的編寫、理解和優化都容易得多。簡單查詢設計思路不同于SQL模式,嵌入文檔在特定的環境下可得到更好的查詢,然而這需要先加入集合。如果需要執行多個請求到數據庫則需要加入其到客戶端。在MongoDB時ODM工具(如Doctrine2)將發揮自身的優勢。
5. 安全性
    由于MongoDB客戶端生成的查詢為BSON對象,而不是可以被解析的字符串,所以可降低受到SQL注入的攻擊的危險。最常見的攻擊類型為針對Web應用程序的攻擊,在MongoDB上使用Doctrine2 ODMs 查詢語言可減輕攻擊風險。
6. 支持
    用戶在選擇數據庫時總是喜歡積極和充滿活力的,這點非常重要。MongoDB在業界有非常大的影響力,用戶也會定期的組織活動。MongoDB的標簽在StackOverFlow是非常活躍的。你永遠不會陷入困境,因為總有人與你討論并解決問題。
7. 價格
    MongoDB是免費的!


    開發環境:
        System:Windows
        IDE:eclipse、MyEclipse2014
        Database:mongoDB
    開發依賴庫:

        mongo-java-driver-2.10.1.jar

        junit-4.11.jar

一、準備工作

    1、 首先,下載mongoDB對Java支持的驅動包

         mongoDB對Java的相關支持、技術:http://www.mongodb.org/display/DOCS/Java+Language+Center

         在線查看源碼:http://api.mongodb.org/java/current



    2、 下面建立一個JavaProject工程,導入下載下來的驅動包。即可在Java中使用mongoDB,目錄如下:

          


二、Java操作MongoDB示例

    在本示例之前你需要啟動mongod的服務,啟動后,下面的程序才能順利執行:

Mongo mongo = new Mongo();

這樣就創建了一個MongoDB的數據庫連接對象,它默認連接到當前機器的localhost地址,端口是27017。

DB db = mongo.getDB(“test”);

這樣就獲得了一個test的數據庫,如果mongoDB中沒有創建這個數據庫也是可以正常運行的。mongoDB可以在沒有創建這個數據庫的情況下,完成數據的添加操作。當添加的時候,沒有這個庫,mongoDB會自動創建當前數據庫。

得到了db,下一步我們要獲取一個“聚集集合DBCollection”,通過db對象的getCollection方法來完成。

DBCollection users = db.getCollection("users");

這樣就獲得了一個DBCollection,它相當于我們數據庫的“表”。

mongodb的query關系式需要參考http://docs.mongodb.org/manual/reference/operator/query/

好了,一切就緒,下面就是我的測試完整源代碼:

1、第一個小熱身例子:


package com.dhb.test;

import java.net.UnknownHostException;

import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.Mongo;
import com.mongodb.util.JSON;
/**
 * 
 * @author dhb
 *
 */
public class SimpleTest {
    public static void main(String[] args) throws UnknownHostException {
        Mongo mg = new Mongo("192.168.13.100", 27017);
        //查詢所有的Database
        for (String name : mg.getDatabaseNames()) {
            System.out.println("dbName:"+name);
        }
        DB db = mg.getDB("test");
        //查詢所有的聚集集合
        for (String name : db.getCollectionNames()) {
            System.out.println("collectionName: " + name);
        }
        DBCollection c2 = db.getCollection("c2");
        //查詢所有的數據
        DBCursor cur = c2.find();
        while (cur.hasNext()) {
            System.out.println(cur.next());
        }
        //輸出c2表的記錄數目
        System.out.println("c2表的記錄數:"+cur.count());
        System.out.println("當前游標ID:"+cur.getCursorId());
        System.out.println("全部json格式化:"+JSON.serialize(cur));
    }
}

    2、mongoDB下具體的增刪改查操作以及對圖片的相關處理



package com.dhb.test;

import java.io.File;
import java.io.IOException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.bson.types.ObjectId;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.mongodb.BasicDBObject;
import com.mongodb.BasicDBObjectBuilder;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import com.mongodb.MongoException;
import com.mongodb.gridfs.GridFS;
import com.mongodb.gridfs.GridFSDBFile;
import com.mongodb.gridfs.GridFSInputFile;
import com.mongodb.util.JSON;
/**
 * 
 */
public class MongoDBCRUDTest {
    private Mongo mg = null;
    private DB db;
    private DBCollection collection;

    @Before
    public void init() {
        try {
            //mg = new Mongo();
            //實例化Mongo對象,連接27017端口
            mg = new Mongo("192.168.13.100", 27017);
        } catch (UnknownHostException e) {

            e.printStackTrace();
        } catch (MongoException e) {
            e.printStackTrace();
        }
        //連接名為test的數據庫,假如數據庫不存在的話,mongodb會自動建立
         db = mg.getDB("test");
        //從Mongodb中獲得名為c1的數據集合,如果該數據集合不存在,Mongodb會為其新建立
         collection = db.getCollection("c1");
    }
    @After
    public void destroy() {
        if (mg != null)
            mg.close();
        mg = null;
        db = null;
        collection = null;
        System.gc();
    }

    public void print(Object o) {
        System.out.println(o);
    }
    /**
     * <b>function:</b> 查詢所有數據
     * @author dhb
     * @createDate 
     */
    //@Test
    public void queryAll() {
        print("查詢c1的所有數據:");
        //db游標
        DBCursor cur = collection.find();
        while (cur.hasNext()) {
            print(cur.next());
        }
    }
    /**
     * 第一種方法,是使用BasicDBObject
     */
    //@Test
    public void insert() {
        //先查詢所有數據
        queryAll();
        print("count------------------------: " + collection.count());
        // 使用BasicDBObject對象創建一個mongodb的document,并給予賦值。
        DBObject document = new BasicDBObject();

        document.put("name", "user12");
        document.put("age", 11);
        //document.save(user)保存,getN()獲取影響行數
        //print(collection.save(document).getN());

        //擴展字段,隨意添加字段,不影響現有數據
        document.put("sex", "boy");
        print("getN()獲取影響行數:"+collection.save(document).getN());
        queryAll();
    }
    //@Test
    public void insert2() {
        //先查詢所有數據
        queryAll();
        print("count------------------------: " + collection.count());
        // 使用BasicDBObject對象創建一個mongodb的document,并給予賦值。
        DBObject document = new BasicDBObject();
        //添加多條數據,傳遞Array對象
        print(collection.insert(document, new BasicDBObject("name", "user13"),
                new BasicDBObject("name", "user14")).getN());
        queryAll();
    }
    //@Test
    public void insert3() {
        //先查詢所有數據
        queryAll();
        print("count------------------------: " + collection.count());

        DBObject document = new BasicDBObject();
        document.put("name", "user15");
        document.put("age", 15);
        document.put("sex", "girl");

        //添加List集合
        List<DBObject> list = new ArrayList<DBObject>();
        list.add(document);
        DBObject document2 = new BasicDBObject("name", "lucy");
        document2.put("age", 22);
        list.add(document2);
        //添加List集合
        print(collection.insert(list).getN());

        //查詢下數據,看看是否添加成功
        print("count: " + collection.count());
        queryAll();
    }
    /**
     * 第二種方法是使用BasicDBObjectBuilder對象
     */
    //@Test
    public void insert4() {
        queryAll();
        BasicDBObjectBuilder documentBuilder = BasicDBObjectBuilder.start()
                .add("database", "mkyongDB")
                .add("table", "hosting");

        BasicDBObjectBuilder documentBuilderDetail = BasicDBObjectBuilder.start()
                .add("records", "99")
                .add("index", "vps_index1")
                .add("active", "true");

        documentBuilder.add("detail", documentBuilderDetail.get());
        collection.insert(documentBuilder.get());
        queryAll();
    }
    /**
     * 第三種方法是使用Map對象
     */
    //@Test
    public void insert5() {
        queryAll();
        Map documentMap =new HashMap();
        documentMap.put("name", "Victor");
        documentMap.put("age", "23");

        Map documentMapDetail =new HashMap();
        documentMapDetail.put("records", "99");
        documentMapDetail.put("index", "vps_index1");
        documentMapDetail.put("active", "true");

        documentMap.put("detail", documentMapDetail);
        collection.insert(new BasicDBObject(documentMap));

        queryAll();
    }
    /**
     * 第四種方法,也就是最簡單的,即直接插入JSON格式數據
     */
    //@Test
    public void insert6() {
        queryAll();
        String json ="{'name' : 'Victor','age' : 35,"+"'detail' : {'records' : 99, 'index' : 'vps_index1', 'active' : 'true'}}";
        //這里使用了JSON的parse方法,將解析后的JSON字符串轉變為DBObject對象后再直接插入到collection中去
        DBObject dbObject =(DBObject)JSON.parse(json);
        collection.insert(dbObject);
        queryAll();
    }
    //@Test
    public void remove() {
        queryAll();
        /*print("刪除id = 54ce0da47eb42dac72929bad:" + collection.remove(new BasicDBObject("_id",
                new ObjectId("54ce0da47eb42dac72929bad"))).getN());*/
        print("remove age > 20: " + collection.remove(new BasicDBObject("age", 
                new BasicDBObject("$gt", 20))).getN());
        queryAll();
    }
    //@Test
    public void update() {
        queryAll();
        //這種方式下,其他字段會全部消失
        print("修改:" + collection.update(new BasicDBObject("_id", new ObjectId("54cc961bea40cc6103a81646")), 
                new BasicDBObject("age", 98)).getN());
        queryAll();
    }
    //@Test
    public void update2() {
        queryAll();
        //這種方式下,其他字段不會消失
        BasicDBObject newDocument =new BasicDBObject();
        newDocument.put("name", "user11");
        newDocument.put("age", 1111);
        newDocument.put("sex", "boy");
        collection.update(new BasicDBObject().append("name", "user11"), newDocument);
        queryAll();
    }
    //@Test
    public void update3() {
        queryAll();
        //$set修飾符的使用,這種方式下,其他字段不會消失
        BasicDBObject newDocument =new BasicDBObject().append("$set",
                new BasicDBObject().append("sex", "boy"));
        collection.update(new BasicDBObject().append("name", "user15"), newDocument);
        queryAll();
    }
    //@Test
    public void update4() {
        queryAll();
        print("修改:" + collection.update(
                new BasicDBObject("_id", new ObjectId("54cc961bea40cc6103a81644")), 
                new BasicDBObject("age", 121),
                true,//如果數據庫不存在,是否添加
                false//多條修改
                ).getN());
        queryAll();
    }
    //@Test
    public void query() {
        //mongodb的query關系式需要參考http://docs.mongodb.org/manual/reference/operator/query/
        //queryAll();
        System.out.println("================================================");
        //1) 獲得數據庫中的第一個document
        DBObject doc = collection.findOne();
        System.out.println("獲得數據庫中的第一個document: "+doc);

        //2)這里,使用collection.find()方法,獲得當前數據庫中所有的documents對象集合
        //然后通過對DBCursor對象集合的遍歷,即可輸出當前所有documents
        DBCursor cursor = collection.find();
        System.out.println("游標遍歷數據");

        while(cursor.hasNext()){
            System.out.println(cursor.next());
        }
        System.out.println("================================================");

        //3)獲取指定的document
        BasicDBObject query =new BasicDBObject();
        query.put("name", "Victor");
        DBCursor cursor2 = collection.find(query);
        while(cursor2.hasNext()){
            System.out.println(cursor2.next());
        }
        System.out.println("================================================");

        //4) 使用in操作符號
        //在mongodb中,也可以使用in操作符,比如要獲得age=9和age=15的document對象
        BasicDBObject query2 =new BasicDBObject();
        List list =new ArrayList();
        list.add(9);
        list.add(15);
        query2.put("age", new BasicDBObject("$in", list));
        DBCursor cursor3 = collection.find(query2);
        while(cursor3.hasNext()){
            System.out.println(cursor3.next());
        }
        System.out.println("================================================");
        //5) 使用>,<等比較符號,比如要輸出age>5的document集合,則使用“$gt”即可,同理,小于關系則使用$lt
        BasicDBObject query3 =new BasicDBObject();
        query3.put("age", new BasicDBObject("$gt", 5));
        DBCursor cursor4 = collection.find(query3);
        while(cursor4.hasNext()){
            System.out.println(cursor4.next());
        }
    }

    // 保存圖片到Mongodb
    /**
     * 使用Java MongoDB GridFS API去保存圖片等二進制文件到Monodb,關于Java MongoDB GridFS API的詳細論述,
     * 請參考http://www.mongodb.org/display/DOCS/GridFS+Specification
     * @throws IOException 
     */
    //@Test
    public void photo() throws IOException {
        //1)保存圖片。
        //將D盤下的beauty.jpg保存到mongodb中去,并命名為mongoDB-java-image。
        String newFileName ="mongoDB-java-image";
        File imageFile =new File("D:\\beauty.jpg");
        /** 
         * 在數據庫中為指定的 bucket 創建 GridFS 實例 
         * bucket 可以認為是標識符,用于區分不同的 GridFS 的實例,類似于傳統數據庫中的不同表 
         * 默認的 bucket 是 "fs" 
         */  
        GridFS gfsPhoto =new GridFS(db, "photo");

        GridFSInputFile gfsFile = gfsPhoto.createFile(imageFile);

        gfsFile.setFilename(newFileName);
        gfsFile.save();
        System.out.println("保存圖片!");
    }
    //@Test
    public void photo2() {
        //2) 讀取圖片信息
        String newFileName ="mongoDB-java-image";
        GridFS gfsPhoto =new GridFS(db, "photo");
        GridFSDBFile imageForOutput = gfsPhoto.findOne(newFileName);
        System.out.println("輸出圖片信息!");
        System.out.println(imageForOutput);
        /**
         * 將會輸出JSON格式的結果
         * { "_id" : { "$oid" : "54ce38087eb4bbfaa4b7a6d8"} , "chunkSize" : 262144 , 
         * "length" : 123948 , "md5" : "dff5f0f1ac0eb9e13e81c5c9c826cc04" ,
         *  "filename" : "mongoDB-java-image" , "contentType" :  null  , 
         *  "uploadDate" : { "$date" : "2015-02-01T14:28:24.050Z"} , "aliases" :  null }
         */
    }
    @Test
    public void photo3() {
        // 3) 輸出已保存的所有圖片
        //輸出所有保存在photo命名空間下的圖片信息:
        GridFS gfsPhoto =new GridFS(db, "photo");
        DBCursor cursor = gfsPhoto.getFileList();
        System.out.println("輸出已保存的所有圖片!");
        while(cursor.hasNext()){
            System.out.println(cursor.next());
        }
        queryAll();
    }
    //@Test
    public void photo4() throws IOException {
        //4) 從數據庫中讀取一張圖片并另存
        //從數據庫中讀取一張圖片并另存為另外一張圖片到磁盤中
        String newFileName ="mongoDB-java-image";
        GridFS gfsPhoto =new GridFS(db, "photo");
        GridFSDBFile imageForOutput = gfsPhoto.findOne(newFileName);
        imageForOutput.writeTo("D:\\beauty2.jpg");
        System.out.println("從數據庫中讀取一張圖片并另存!");
    }
    //@Test
    public void photo5() throws IOException {
        //5) 刪除圖片
        String newFileName ="mongoDB-java-image";
        GridFS gfsPhoto =new GridFS(db, "photo");
        gfsPhoto.remove(gfsPhoto.findOne(newFileName));
        System.out.println("刪除圖片!");
    }

}



小結:通過自己的親身體驗,發現mongoDB真的很有趣。

        參考文檔:http://blog.csdn.net/hx_uestc/article/details/7620938

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!