欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java单例模式下的MongoDB数据库操作工具类

程序员文章站 2023-12-16 21:40:52
本文实例讲述了java单例模式下的mongodb数据库操作工具类。分享给大家供大家参考,具体如下: 我经常对mongodb进行一些基础操作,将这些常用操作合并到一个工具类...

本文实例讲述了java单例模式下的mongodb数据库操作工具类。分享给大家供大家参考,具体如下:

我经常对mongodb进行一些基础操作,将这些常用操作合并到一个工具类中,方便自己开发使用。

没用spring data、morphia等框架是为了减少学习、维护成本,另外自己直接jdbc方式的话可以更灵活,为自己以后的积累留一个脚印。

java驱动版本:

<!-- mongodb驱动 -->
<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实例代表了一个数据库连接池,即使在多线程的环境中,一个mongo实例对我们来说已经足够了<br>
 * 注意mongo已经实现了连接池,并且是线程安全的。 <br>
 * 设计为单例模式, 因 mongodb的java驱动是线程安全的,对于一般的应用,只要一个mongo实例即可,<br>
 * mongo有个内置的连接池(默认为10个) 对于有大量写和读的环境中,为了确保在一个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都在安全内网下,但如果将mongodb设为安全验证模式,就需要在客户端提供用户名和密码:
    // 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);// 连接池设置为300个连接,默认为100
    options.connecttimeout(15000);// 连接超时,推荐>3000毫秒
    options.maxwaittime(5000); //
    options.sockettimeout(0);// 套接字超时时间,0无限制
    options.threadsallowedtoblockforconnectionmultiplier(5000);// 线程队列数,如果连接线程排满了队列就会抛出“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;
  }
  /**
   * 获取所有数据库名称列表
   *
   * @return
   */
  public mongoiterable<string> getalldbnames() {
    mongoiterable<string> s = mongoclient.listdatabasenames();
    return s;
  }
  /**
   * 删除一个数据库
   */
  public void dropdb(string dbname) {
    getdb(dbname).drop();
  }
  /**
   * 查找对象 - 根据主键_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;
  }
  /** 统计数 */
  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();
  }
  /**
   * 关闭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);
    // }
    // // 根据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();
    // 删除数据库
    // mongodbutil2.instance.dropdb("testdb");
    // 删除表
    // mongodbutil2.instance.dropcollection(dbname, collname);
    // 修改数据
    // string id = "556949504711371c60601b5a";
    // document newdoc = new document();
    // newdoc.put("name", "时候");
    // mongodbutil.instance.updatebyid(coll, id, newdoc);
    // 统计表
    // system.out.println(mongodbutil.instance.getcount(coll));
    // 查询所有
    bson filter = filters.eq("count", 0);
    mongodbutil.instance.find(coll, filter);
  }
}

更多关于java相关内容感兴趣的读者可查看本站专题:《java使用jdbc操作数据库技巧总结》、《java+mysql数据库程序设计总结》、《java数据结构与算法教程》、《java文件与目录操作技巧汇总》、《java操作dom节点技巧总结》和《java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

上一篇:

下一篇: