Spring Boot從入門到精通-集成mongdb并實(shí)現(xiàn)自動(dòng)分庫分表

MongoDB是專為可擴(kuò)展性,高性能和高可用性而設(shè)計(jì)的數(shù)據(jù)庫。它可以從單服務(wù)器部署擴(kuò)展到大型、復(fù)雜的多數(shù)據(jù)中心架構(gòu)。利用內(nèi)存計(jì)算的優(yōu)勢,MongoDB能夠提供高性能的數(shù)據(jù)讀寫操作。

MongoDB使用文檔的方式存儲數(shù)據(jù),而且非常容易進(jìn)行分庫分表的操作。在Spring Boot中集成mongdb非常簡單,只需要在新建項(xiàng)目的時(shí)候勾選mongdb一項(xiàng)即可,使用起來也足夠簡單。但是由于使用時(shí)很簡單也造成其不夠靈活的特點(diǎn),因此我們需要自己實(shí)現(xiàn)一個(gè)可以分庫分表的mongdb操作代碼。

  • 首先在pom.xml中引入mongdb依賴:
         <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongodb-driver</artifactId>
        </dependency>
  • mongdb是一種非關(guān)系型數(shù)據(jù)庫,因此使用java連接的話也需要一些身份認(rèn)證,在application.yml中加入配置信息:
xyh:
  mongodb:
      URI: mongodb://test:test123@127.0.0.1/
      dataBase: comment

注意:以上配置所用到的都是我們自己定義的變量名,127.0.0.1為本機(jī)地址,因此需要你額外安裝mongdb

  • 有了配置之后就需要用代碼去讀取這些配置了,新建MongoDBManager.java類用于讀取配置信息:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;

/**
 * MongoDB管理器
 */
@Component
public class MongoDBManager {
    /**
     * URI
     */
    @Value("${xyh.mongodb.URI}")
    private String uri;
    /**
     * URI
     */
    @Value("${xyh.mongodb.dataBase}")
    private String dataBase;

    /**
     * 獲取 MongoClient 對象,可以只創(chuàng)建一個(gè)
     *
     * @return MongoClient對象
     */
    @Bean
    public MongoClient mongoClient() {
        System.out.println("\n\n\n\n\n" + uri + dataBase);

        return new MongoClient(new MongoClientURI(uri + dataBase));
    }


    public String getDataBase() {
        return dataBase;
    }

    public void setDataBase(String dataBase) {
        this.dataBase = dataBase;
    }
}

  • 接下來就是對mongdb的實(shí)際操作了,首先我們新建一個(gè)Writer.java類用于對mongdb進(jìn)行寫操作。相當(dāng)于mysql中的insertupdate。
package hys.mongodb.manage;

import com.alibaba.fastjson.JSONObject;
import com.mongodb.BasicDBObject;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.UpdateOptions;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import xyh.mongodb.utils.BsonTool;
import org.bson.Document;
import org.bson.conversions.Bson;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;
import java.util.UUID;

@Repository
public class Writer {

    @Resource
    private MongoClient mongoClient;

    /**
     * 數(shù)據(jù)存儲
     *
     * @param dataBase 數(shù)據(jù)庫
     * @param collect 業(yè)務(wù)代碼,一個(gè)業(yè)務(wù)代碼對應(yīng)一個(gè)數(shù)據(jù)集
     * @param data 存儲的數(shù)據(jù)
     */
    public void insert(String dataBase, String collect, JSONObject data) {
        JSONObject jso = new JSONObject();
        jso.putAll(data);
        if (jso.getString("id") == null) {
            String id = BsonTool.uuid();
            jso.put("id", id);
        }
        MongoCollection<Document> collection = getCollection(dataBase, collect);
        collection.insertOne(Document.parse(jso.toJSONString()));
    }

    /**
     *
     * @param dataBase 數(shù)據(jù)庫
     * @param collect 集合
     * @param filter 過濾條件
     * @param update 更新對象
     */
    public boolean update(String dataBase, String collect, Bson filter, Bson update) {
        MongoCollection collection = getCollection(dataBase, collect);
        UpdateResult ur = collection.updateOne(filter, update);
        return ur.getModifiedCount() > 0;
    }

    /**
     * 當(dāng)數(shù)據(jù)存在時(shí)更新數(shù)據(jù),數(shù)據(jù)不存在時(shí)插入數(shù)據(jù)
     * @param dataBase
     * @param collect
     * @param filter
     * @param update
     * @return
     */
    public boolean upsert(String dataBase, String collect, Bson filter, Bson update) {
        MongoCollection collection = getCollection(dataBase, collect);
        //UpdateResult ur = collection.updateOne(filter, update);
        UpdateResult ur = collection.replaceOne(filter, update, new UpdateOptions().upsert(true));
        //UpdateResult ur = collection.updateOne(filter, update, new UpdateOptions().upsert(true));
        return ur.getModifiedCount() > 0;
    }

    /**
     * 刪除文檔
     * @param dataBase
     * @param collect
     * @param filter
     */
    public boolean delete(String dataBase, String collect, Bson filter) {
        MongoCollection collection = getCollection(dataBase, collect);
        DeleteResult dr = collection.deleteOne(filter);
        return dr.getDeletedCount() > 0;
    }

    private MongoCollection getCollection(String dataBase, String collect) {
        MongoDatabase db = mongoClient.getDatabase(dataBase);
        return db.getCollection(collect);
    }
}

Writer類中向外暴露了四個(gè)方法,基本上可以滿足常規(guī)的增刪改操作。

  • 然后我們新建一個(gè)Reader.java類用于對mongdb進(jìn)行讀操作,相當(dāng)于mysql中的select。
import com.alibaba.fastjson.JSONObject;
import com.mongodb.*;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import xyh.mongodb.beans.Comment;
import xyh.mongodb.beans.Pager;
import org.bson.Document;
import org.bson.conversions.Bson;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

@Repository
public class Reader {
    @Resource
    private MongoClient mongoClient;

    /**
     * 數(shù)據(jù)存儲
     *
     * @param dataBase 數(shù)據(jù)庫
     * @param collect  業(yè)務(wù)代碼,一個(gè)業(yè)務(wù)代碼對應(yīng)一個(gè)數(shù)據(jù)集
     */
    public <T> List<T> read(String dataBase, String collect, Bson cnd, Pager pager, Class<T> clazz) {
        final List<T> results = new ArrayList<>();
       Block<Document> iteratorResults = document -> {
            JSONObject jo = new JSONObject(document);
            results.add(JSONObject.toJavaObject(jo, clazz));
        };

        MongoDatabase db = mongoClient.getDatabase(dataBase);
        MongoCollection<Document> collection = db.getCollection(collect);

        if (pager == null) {
            //排序以及查詢條件
            collection.find(cnd).sort(new BasicDBObject("insTime", 1))
                    .forEach(iteratorResults);
        } else {
            collection.find(cnd).sort(new BasicDBObject("insTime", 1))
                    .skip((pager.getPageNumber() - 1) * pager.getPageSize())
                    .limit(pager.getPageSize())
                    .forEach(iteratorResults);
        }

        return results;
    }

    /**
     * 返回總數(shù)
     *
     * @param dataBase 企業(yè)Id
     * @param collect  業(yè)務(wù)代碼,一個(gè)業(yè)務(wù)代碼對應(yīng)一個(gè)數(shù)據(jù)集
     */
    public long count(String dataBase, String collect, Bson cnd) {
        MongoDatabase db = mongoClient.getDatabase(dataBase);
        MongoCollection<Document> collection = db.getCollection(collect);

        if (cnd == null) {
            return collection.count();
        } else {
            return collection.count(cnd);
        }
    }

    /**
     * 查詢一個(gè)
     */
    public Document findOne(String dataBase, String collect, Bson bson) {
        return mongoClient.getDatabase(dataBase).getCollection(collect).find(bson).first();
    }
}

Reader類中向外暴露了三個(gè)方法,基本上可以滿足常規(guī)的查詢操作。
注意其中的兩行代碼:
MongoDatabase db = mongoClient.getDatabase(dataBase)
MongoCollection<Document> collection = db.getCollection(collect)
由于mongdb的結(jié)構(gòu)是一個(gè)dataBase下有很多個(gè)collection,每個(gè)collection下又有很多個(gè)document,其中每一個(gè)document相當(dāng)于一條數(shù)據(jù)。我們在查詢mongdb的時(shí)候每次都是動(dòng)態(tài)的去獲取dataBase和collection,依靠這兩句可以輕松的在mongdb中實(shí)現(xiàn)分庫分表。
有了這兩個(gè)操作mongdb基本的類之后,我們只需要調(diào)用這兩個(gè)類中的相應(yīng)方法就可以實(shí)現(xiàn)mongdb的增刪改查了。
在mongdb中都是對Bson進(jìn)行操作,而每個(gè)Bson的實(shí)現(xiàn)類又會去實(shí)現(xiàn)Map,所以mongdb中存儲的都是類似于json格式的數(shù)據(jù)。
看下面的代碼:

//調(diào)用reader類中的findOne方法,并將dataBase和collection傳入(如果不想傳dataBase和collection的話可以在初始化的時(shí)候?qū)懰溃?//并且新建一個(gè)文檔作為查詢條件
reader.findOne(manager.getDataBase(), COMMENT + bizName, new Document("id", id));

看下面的代碼:

// 新建一個(gè)文檔用于更新
Document newDocument = new Document().append("$inc", new Document().append("lkNum", 1));
//新建一個(gè)文檔用于查詢
Document filter = new Document();
//查詢條件
filter.put("id", id);
//調(diào)用剛剛writer類中的update方法,并將dataBase和collection傳入,并將更新的文檔和查詢條件傳入。
boolean updateCount = writer.update(manager.getDataBase(), COMMENT + bizName, filter, newDocument);

以上就是mongdb的增刪改查操作。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Java基礎(chǔ)常見英語詞匯(共70個(gè))['?bd?ekt] ['?:rientid]導(dǎo)向的 ...
    今夜子辰閱讀 3,500評論 1 34
  • 一、MongoDB簡介 1.概述 ? MongoDB是一個(gè)基于分布式文件存儲的數(shù)據(jù)庫,由C++語言編寫。旨在為WE...
    鄭元吉閱讀 1,130評論 0 2
  • MongoDB 一、安裝 Windows下,下載安裝包并安裝 在安裝盤的根目錄下,新建data文件夾,里面新建lo...
    Plissmile閱讀 5,562評論 0 4
  • 六張1001卡,講一個(gè)故事,可以講一個(gè),可以每張卡一個(gè),孩子講孩子的,自己講自己的。 在回家的路上看見兩個(gè)大山,就...
    兮兮AX閱讀 208評論 0 0
  • 淡淡柳眉愁,灼灼飛花夢。 遙憐香墜落,凈土掩風(fēng)流。 花下人獨(dú)酌,人醉花亦醉。 花氣襲人踞,憐取看花人。
    流湘遇閱讀 342評論 0 0

友情鏈接更多精彩內(nèi)容