最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

JAVA驅(qū)動版本:

<!-- MongoDB驅(qū)動 -->
<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ù)據(jù)庫連接池,即使在多線程的環(huán)境中,一個Mongo實例對我們來說已經(jīng)足夠了<br>
 * 注意Mongo已經(jīng)實現(xiàn)了連接池,并且是線程安全的。 <br>
 * 設(shè)計為單例模式, 因 MongoDB的Java驅(qū)動是線程安全的,對于一般的應(yīng)用,只要一個Mongo實例即可,<br>
 * Mongo有個內(nèi)置的連接池(默認為10個) 對于有大量寫和讀的環(huán)境中,為了確保在一個Session中使用同一個DB時,<br>
 * DB和DBCollection是絕對線程安全的<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 {
  /**
   * 定義一個枚舉的元素,它代表此類的一個實例
   */
  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è)為安全驗證模式,就需要在客戶端提供用戶名和密碼:
    // boolean auth = db.authenticate(myUserName, myPassword);
    Builder options = new MongoClientOptions.Builder();
    // options.autoConnectRetry(true);// 自動重連true
    // options.maxAutoConnectRetryTime(10); // the maximum auto connect retry time
    options.connectionsPerHost(300);// 連接池設(shè)置為300個連接,默認為100
    options.connectTimeout(15000);// 連接超時,推薦>3000毫秒
    options.maxWaitTime(5000); //
    options.socketTimeout(0);// 套接字超時時間,0無限制
    options.threadsAllowedToBlockForConnectionMultiplier(5000);// 線程隊列數(shù),如果連接線程排滿了隊列就會拋出“Out of semaphores to get db”錯誤。
    options.writeConcern(WriteConcern.SAFE);//
    options.build();
  }
  // ------------------------------------共用方法---------------------------------------------------
  /**
   * 獲取DB實例 - 指定DB
   *
   * @param dbName
   * @return
   */
  public MongoDatabase getDB(String dbName) {
    if (dbName != null && !"".equals(dbName)) {
      MongoDatabase database = mongoClient.getDatabase(dbName);
      return database;
    }
    return null;
  }
  /**
   * 獲取collection對象 - 指定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ù)庫名稱列表
   *
   * @return
   */
  public MongoIterable<String> getAllDBNames() {
    MongoIterable<String> s = mongoClient.listDatabaseNames();
    return s;
  }
  /**
   * 刪除一個數(shù)據(jù)庫
   */
  public void dropDB(String dbName) {
    getDB(dbName).drop();
  }
  /**
   * 查找對象 - 根據(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)計數(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();
  }
  /** 分頁查詢 */
  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();
  }
  /**
   * 通過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;
    }
  }
  /**
   * 測試入口
   *
   * @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);
    // 查詢多個
    // 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();
    // 查詢多個
    // MongoCursor<Person> cursor2 = coll.find(Person.class).iterator();
    // 刪除數(shù)據(jù)庫
    // MongoDBUtil2.instance.dropDB("testdb");
    // 刪除表
    // MongoDBUtil2.instance.dropCollection(dbName, collName);
    // 修改數(shù)據(jù)
    // String id = "556949504711371c60601b5a";
    // Document newdoc = new Document();
    // newdoc.put("name", "時候");
    // MongoDBUtil.instance.updateById(coll, id, newdoc);
    // 統(tǒng)計表
    // 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ù)庫技巧總結(jié)》、《Java+MySQL數(shù)據(jù)庫程序設(shè)計總結(jié)》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java文件與目錄操作技巧匯總》、《Java操作DOM節(jié)點技巧總結(jié)》和《Java緩存操作技巧匯總

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

相關(guān)文章

  • Spring中@Autowired注解的原理詳解

    Spring中@Autowired注解的原理詳解

    這篇文章主要介紹了Spring中@Autowired注解的原理詳解,對于spring配置一個bean時,如果需要給該bean提供一些初始化參數(shù),則需要通過依賴注入方式,所謂的依賴注入就是通過spring將bean所需要的一些參數(shù)傳遞到bean實例對象的過程,需要的朋友可以參考下
    2023-11-11
  • 基于java TCP網(wǎng)絡(luò)通信的實例詳解

    基于java TCP網(wǎng)絡(luò)通信的實例詳解

    本篇文章是對java中TCP網(wǎng)絡(luò)通信的實例進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 利用Maven入手Spring Boot第一個程序詳解

    利用Maven入手Spring Boot第一個程序詳解

    這篇文章主要給大家介紹了關(guān)于如何利用Maven入手Spring Boot第一個程序的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-02-02
  • spring?boot如何配置靜態(tài)路徑詳解(404出現(xiàn)的坑)

    spring?boot如何配置靜態(tài)路徑詳解(404出現(xiàn)的坑)

    這篇文章主要給大家介紹了關(guān)于spring?boot如何配置靜態(tài)路徑的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-02-02
  • java項目中讀取jdbc.properties文件操作

    java項目中讀取jdbc.properties文件操作

    這篇文章主要介紹了java項目中讀取jdbc.properties文件操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Java 泛型總結(jié)(三):通配符的使用

    Java 泛型總結(jié)(三):通配符的使用

    在泛型的使用中,還有個重要的東西叫通配符,本文介紹通配符的使用。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • Spring MVC訪問靜態(tài)文件_動力節(jié)點Java學(xué)院整理

    Spring MVC訪問靜態(tài)文件_動力節(jié)點Java學(xué)院整理

    這篇文章主要為大家詳細介紹了Spring MVC訪問靜態(tài)文件的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Java?+?Selenium?+?OpenCV解決自動化測試中的滑塊驗證問題

    Java?+?Selenium?+?OpenCV解決自動化測試中的滑塊驗證問題

    OpenCV是一個基于Apache2.0許可(開源)發(fā)行的跨平臺計算機視覺和機器學(xué)習(xí)軟件庫,可以運行在Linux、Windows、Android和Mac?OS操作系統(tǒng)上,這篇文章主要介紹了Java?+?Selenium?+?OpenCV解決自動化測試中的滑塊驗證,需要的朋友可以參考下
    2022-07-07
  • 數(shù)據(jù)庫阿里連接池 druid配置詳解

    數(shù)據(jù)庫阿里連接池 druid配置詳解

    本篇文章主要介紹了數(shù)據(jù)庫阿里連接池 druid配置詳解,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Java并發(fā)編程之代碼實現(xiàn)兩玩家交換裝備

    Java并發(fā)編程之代碼實現(xiàn)兩玩家交換裝備

    這篇文章主要介紹了Java并發(fā)編程之代碼實現(xiàn)兩玩家交換裝備,文中有非常詳細的代碼示例,對正在學(xué)習(xí)java的小伙伴們有一定的幫助,需要的朋友可以參考下
    2021-09-09

最新評論

屏东市| 沂源县| 樟树市| 肇东市| 阿勒泰市| 呈贡县| 图木舒克市| 泰宁县| 得荣县| 哈巴河县| 太仆寺旗| 绵竹市| 厦门市| 建湖县| 乐平市| 永昌县| 旺苍县| 佛学| 威海市| 广河县| 新乐市| 夹江县| 昭觉县| 平邑县| 哈巴河县| 临泉县| 诏安县| 盐源县| 天水市| 米泉市| 镶黄旗| 台安县| 定襄县| 海南省| 荥经县| 宽甸| 荣昌县| 富源县| 仙桃市| 读书| 安岳县|