欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java單例模式下的MongoDB數(shù)據(jù)庫(kù)操作工具類

 更新時(shí)間:2018年01月06日 11:34:59   作者:Constantin  
這篇文章主要介紹了Java單例模式下的MongoDB數(shù)據(jù)庫(kù)操作工具類,結(jié)合實(shí)例形式分析了java基于單例模式下操作MongoDB數(shù)據(jù)庫(kù)相關(guān)連接、查詢、插入、刪除等操作封裝技巧,需要的朋友可以參考下

本文實(shí)例講述了Java單例模式下的MongoDB數(shù)據(jù)庫(kù)操作工具類。分享給大家供大家參考,具體如下:

我經(jīng)常對(duì)MongoDB進(jìn)行一些基礎(chǔ)操作,將這些常用操作合并到一個(gè)工具類中,方便自己開(kāi)發(fā)使用。

沒(méi)用Spring Data、Morphia等框架是為了減少學(xué)習(xí)、維護(hù)成本,另外自己直接JDBC方式的話可以更靈活,為自己以后的積累留一個(gè)腳印。

JAVA驅(qū)動(dòng)版本:

<!-- MongoDB驅(qū)動(dòng) -->
<dependency>
  <groupId>org.mongodb</groupId>
  <artifactId>mongo-java-driver</artifactId>
  <version>3.0.2</version>
</dependency>

工具類代碼如下:

package utils;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.configuration.CompositeConfiguration;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.bson.Document;
import org.bson.conversions.Bson;
import org.bson.types.ObjectId;
import com.mongodb.BasicDBObject;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoClientOptions.Builder;
import com.mongodb.WriteConcern;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.MongoIterable;
import com.mongodb.client.model.Filters;
import com.mongodb.client.result.DeleteResult;
/**
 * MongoDB工具類 Mongo實(shí)例代表了一個(gè)數(shù)據(jù)庫(kù)連接池,即使在多線程的環(huán)境中,一個(gè)Mongo實(shí)例對(duì)我們來(lái)說(shuō)已經(jīng)足夠了<br>
 * 注意Mongo已經(jīng)實(shí)現(xiàn)了連接池,并且是線程安全的。 <br>
 * 設(shè)計(jì)為單例模式, 因 MongoDB的Java驅(qū)動(dòng)是線程安全的,對(duì)于一般的應(yīng)用,只要一個(gè)Mongo實(shí)例即可,<br>
 * Mongo有個(gè)內(nèi)置的連接池(默認(rèn)為10個(gè)) 對(duì)于有大量寫和讀的環(huán)境中,為了確保在一個(gè)Session中使用同一個(gè)DB時(shí),<br>
 * DB和DBCollection是絕對(duì)線程安全的<br>
 *
 * @author zhoulingfei
 * @date 2015-5-29 上午11:49:49
 * @version 0.0.0
 * @Copyright (c)1997-2015 NavInfo Co.Ltd. All Rights Reserved.
 */
public enum MongoDBUtil {
  /**
   * 定義一個(gè)枚舉的元素,它代表此類的一個(gè)實(shí)例
   */
  instance;
  private MongoClient mongoClient;
  static {
    System.out.println("===============MongoDBUtil初始化========================");
    CompositeConfiguration config = new CompositeConfiguration();
    try {
      config.addConfiguration(new PropertiesConfiguration("mongodb.properties"));
    } catch (ConfigurationException e) {
      e.printStackTrace();
    }
    // 從配置文件中獲取屬性值
    String ip = config.getString("host");
    int port = config.getInt("port");
    instance.mongoClient = new MongoClient(ip, port);
    // or, to connect to a replica set, with auto-discovery of the primary, supply a seed list of members
    // List<ServerAddress> listHost = Arrays.asList(new ServerAddress("localhost", 27017),new ServerAddress("localhost", 27018));
    // instance.mongoClient = new MongoClient(listHost);
    // 大部分用戶使用mongodb都在安全內(nèi)網(wǎng)下,但如果將mongodb設(shè)為安全驗(yàn)證模式,就需要在客戶端提供用戶名和密碼:
    // boolean auth = db.authenticate(myUserName, myPassword);
    Builder options = new MongoClientOptions.Builder();
    // options.autoConnectRetry(true);// 自動(dòng)重連true
    // options.maxAutoConnectRetryTime(10); // the maximum auto connect retry time
    options.connectionsPerHost(300);// 連接池設(shè)置為300個(gè)連接,默認(rèn)為100
    options.connectTimeout(15000);// 連接超時(shí),推薦>3000毫秒
    options.maxWaitTime(5000); //
    options.socketTimeout(0);// 套接字超時(shí)時(shí)間,0無(wú)限制
    options.threadsAllowedToBlockForConnectionMultiplier(5000);// 線程隊(duì)列數(shù),如果連接線程排滿了隊(duì)列就會(huì)拋出“Out of semaphores to get db”錯(cuò)誤。
    options.writeConcern(WriteConcern.SAFE);//
    options.build();
  }
  // ------------------------------------共用方法---------------------------------------------------
  /**
   * 獲取DB實(shí)例 - 指定DB
   *
   * @param dbName
   * @return
   */
  public MongoDatabase getDB(String dbName) {
    if (dbName != null && !"".equals(dbName)) {
      MongoDatabase database = mongoClient.getDatabase(dbName);
      return database;
    }
    return null;
  }
  /**
   * 獲取collection對(duì)象 - 指定Collection
   *
   * @param collName
   * @return
   */
  public MongoCollection<Document> getCollection(String dbName, String collName) {
    if (null == collName || "".equals(collName)) {
      return null;
    }
    if (null == dbName || "".equals(dbName)) {
      return null;
    }
    MongoCollection<Document> collection = mongoClient.getDatabase(dbName).getCollection(collName);
    return collection;
  }
  /**
   * 查詢DB下的所有表名
   */
  public List<String> getAllCollections(String dbName) {
    MongoIterable<String> colls = getDB(dbName).listCollectionNames();
    List<String> _list = new ArrayList<String>();
    for (String s : colls) {
      _list.add(s);
    }
    return _list;
  }
  /**
   * 獲取所有數(shù)據(jù)庫(kù)名稱列表
   *
   * @return
   */
  public MongoIterable<String> getAllDBNames() {
    MongoIterable<String> s = mongoClient.listDatabaseNames();
    return s;
  }
  /**
   * 刪除一個(gè)數(shù)據(jù)庫(kù)
   */
  public void dropDB(String dbName) {
    getDB(dbName).drop();
  }
  /**
   * 查找對(duì)象 - 根據(jù)主鍵_id
   *
   * @param collection
   * @param id
   * @return
   */
  public Document findById(MongoCollection<Document> coll, String id) {
    ObjectId _idobj = null;
    try {
      _idobj = new ObjectId(id);
    } catch (Exception e) {
      return null;
    }
    Document myDoc = coll.find(Filters.eq("_id", _idobj)).first();
    return myDoc;
  }
  /** 統(tǒng)計(jì)數(shù) */
  public int getCount(MongoCollection<Document> coll) {
    int count = (int) coll.count();
    return count;
  }
  /** 條件查詢 */
  public MongoCursor<Document> find(MongoCollection<Document> coll, Bson filter) {
    return coll.find(filter).iterator();
  }
  /** 分頁(yè)查詢 */
  public MongoCursor<Document> findByPage(MongoCollection<Document> coll, Bson filter, int pageNo, int pageSize) {
    Bson orderBy = new BasicDBObject("_id", 1);
    return coll.find(filter).sort(orderBy).skip((pageNo - 1) * pageSize).limit(pageSize).iterator();
  }
  /**
   * 通過(guò)ID刪除
   *
   * @param coll
   * @param id
   * @return
   */
  public int deleteById(MongoCollection<Document> coll, String id) {
    int count = 0;
    ObjectId _id = null;
    try {
      _id = new ObjectId(id);
    } catch (Exception e) {
      return 0;
    }
    Bson filter = Filters.eq("_id", _id);
    DeleteResult deleteResult = coll.deleteOne(filter);
    count = (int) deleteResult.getDeletedCount();
    return count;
  }
  /**
   * FIXME
   *
   * @param coll
   * @param id
   * @param newdoc
   * @return
   */
  public Document updateById(MongoCollection<Document> coll, String id, Document newdoc) {
    ObjectId _idobj = null;
    try {
      _idobj = new ObjectId(id);
    } catch (Exception e) {
      return null;
    }
    Bson filter = Filters.eq("_id", _idobj);
    // coll.replaceOne(filter, newdoc); // 完全替代
    coll.updateOne(filter, new Document("$set", newdoc));
    return newdoc;
  }
  public void dropCollection(String dbName, String collName) {
    getDB(dbName).getCollection(collName).drop();
  }
  /**
   * 關(guān)閉Mongodb
   */
  public void close() {
    if (mongoClient != null) {
      mongoClient.close();
      mongoClient = null;
    }
  }
  /**
   * 測(cè)試入口
   *
   * @param args
   */
  public static void main(String[] args) {
    String dbName = "GC_MAP_DISPLAY_DB";
    String collName = "COMMUNITY_BJ";
    MongoCollection<Document> coll = MongoDBUtil.instance.getCollection(dbName, collName);
    // 插入多條
    // for (int i = 1; i <= 4; i++) {
    // Document doc = new Document();
    // doc.put("name", "zhoulf");
    // doc.put("school", "NEFU" + i);
    // Document interests = new Document();
    // interests.put("game", "game" + i);
    // interests.put("ball", "ball" + i);
    // doc.put("interests", interests);
    // coll.insertOne(doc);
    // }
    // // 根據(jù)ID查詢
    // String id = "556925f34711371df0ddfd4b";
    // Document doc = MongoDBUtil2.instance.findById(coll, id);
    // System.out.println(doc);
    // 查詢多個(gè)
    // MongoCursor<Document> cursor1 = coll.find(Filters.eq("name", "zhoulf")).iterator();
    // while (cursor1.hasNext()) {
    // org.bson.Document _doc = (Document) cursor1.next();
    // System.out.println(_doc.toString());
    // }
    // cursor1.close();
    // 查詢多個(gè)
    // MongoCursor<Person> cursor2 = coll.find(Person.class).iterator();
    // 刪除數(shù)據(jù)庫(kù)
    // MongoDBUtil2.instance.dropDB("testdb");
    // 刪除表
    // MongoDBUtil2.instance.dropCollection(dbName, collName);
    // 修改數(shù)據(jù)
    // String id = "556949504711371c60601b5a";
    // Document newdoc = new Document();
    // newdoc.put("name", "時(shí)候");
    // MongoDBUtil.instance.updateById(coll, id, newdoc);
    // 統(tǒng)計(jì)表
    // System.out.println(MongoDBUtil.instance.getCount(coll));
    // 查詢所有
    Bson filter = Filters.eq("count", 0);
    MongoDBUtil.instance.find(coll, filter);
  }
}

更多關(guān)于java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java使用JDBC操作數(shù)據(jù)庫(kù)技巧總結(jié)》、《Java+MySQL數(shù)據(jù)庫(kù)程序設(shè)計(jì)總結(jié)》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java文件與目錄操作技巧匯總》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》和《Java緩存操作技巧匯總

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • springboot項(xiàng)目啟動(dòng)類錯(cuò)誤(找不到或無(wú)法加載主類 com.**Application)

    springboot項(xiàng)目啟動(dòng)類錯(cuò)誤(找不到或無(wú)法加載主類 com.**Application)

    本文主要介紹了spring-boot項(xiàng)目啟動(dòng)類錯(cuò)誤(找不到或無(wú)法加載主類 com.**Application),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • 詳解springboot啟動(dòng)時(shí)是如何加載配置文件application.yml文件

    詳解springboot啟動(dòng)時(shí)是如何加載配置文件application.yml文件

    這篇文章主要介紹了詳解springboot啟動(dòng)時(shí)是如何加載配置文件application.yml文件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Jmeter生成UUID作為唯一標(biāo)識(shí)符過(guò)程圖解

    Jmeter生成UUID作為唯一標(biāo)識(shí)符過(guò)程圖解

    這篇文章主要介紹了Jmeter生成UUID作為唯一標(biāo)識(shí)符過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java設(shè)計(jì)模式之代理模式原理及實(shí)現(xiàn)代碼分享

    Java設(shè)計(jì)模式之代理模式原理及實(shí)現(xiàn)代碼分享

    這篇文章主要介紹了Java設(shè)計(jì)模式之代理模式原理及實(shí)現(xiàn)代碼分享,設(shè)計(jì)代理模式的定義,靜態(tài)代理,動(dòng)態(tài)代理,jdk動(dòng)態(tài)代理實(shí)現(xiàn)步驟,原理及源碼等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • springboot 整合 nacos 配置實(shí)現(xiàn)多個(gè)環(huán)境不同配置

    springboot 整合 nacos 配置實(shí)現(xiàn)多個(gè)環(huán)境不同配置

    本文介紹了Nacos配置中心的優(yōu)勢(shì),包括與Apollo的性能對(duì)比,Nacos服務(wù)端的安裝與配置,以及如何在SpringBoot項(xiàng)目中集成Nacos進(jìn)行多環(huán)境配置,提供了詳細(xì)的步驟,包括下載、安裝、配置中心的創(chuàng)建和項(xiàng)目集成,旨在幫助開(kāi)發(fā)者更好地使用Nacos進(jìn)行項(xiàng)目配置管理
    2024-09-09
  • Java利用POI實(shí)現(xiàn)導(dǎo)入導(dǎo)出Excel表格示例代碼

    Java利用POI實(shí)現(xiàn)導(dǎo)入導(dǎo)出Excel表格示例代碼

    最近工作中遇到一個(gè)需求,是需要導(dǎo)出數(shù)據(jù)到Excel表格里,所以寫個(gè)Demo測(cè)試一下,還是比較簡(jiǎn)單的,現(xiàn)在分享給大家,有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。
    2016-10-10
  • Mybatis優(yōu)化檢索的方法詳解

    Mybatis優(yōu)化檢索的方法詳解

    MyBatis是一款優(yōu)秀的基于Java的持久層框架,它可以將 SQL 語(yǔ)句和數(shù)據(jù)庫(kù)中的記錄映射成為 Java 對(duì)象,并且支持靈活的 SQL 查詢語(yǔ)句,在Mybatis中,可以使用動(dòng)態(tài)SQL來(lái)靈活構(gòu)造SQL語(yǔ)句,從而滿足各種不同的檢索需求,本文介紹Mybatis如何優(yōu)化檢索,需要的朋友可以參考下
    2024-05-05
  • 一文帶你深入了解Java?String的不可變性

    一文帶你深入了解Java?String的不可變性

    這篇文章主要來(lái)和大家一起深入探討一下Java?String中的不可變性,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-06-06
  • SpringCloud輪詢拉取注冊(cè)表與服務(wù)發(fā)現(xiàn)流程詳解

    SpringCloud輪詢拉取注冊(cè)表與服務(wù)發(fā)現(xiàn)流程詳解

    這篇文章主要介紹了SpringCloud輪詢拉取注冊(cè)表與服務(wù)發(fā)現(xiàn),現(xiàn)在很多創(chuàng)業(yè)公司都開(kāi)始往springcloud靠了,可能是由于文檔和組件比較豐富的原因吧,畢竟是一款目前來(lái)說(shuō)比較完善的微服務(wù)架構(gòu)
    2022-11-11
  • Java ThreadLocal的詳細(xì)解釋

    Java ThreadLocal的詳細(xì)解釋

    這篇文章主要介紹了快速了解Java中ThreadLocal類,介紹了ThreadLocal 是什么,ThreadLocal的作用,ThreadLocal 原理等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。
    2021-11-11

最新評(píng)論