1.1连单台mongodb

Mongo mg = newMongo();//默认连本机127.0.0.1  端口为27017

Mongo mg = newMongo(ip);//可以指定ip 端口默认为27017

Mongo mg = newMongo(ip,port);//也可以指定ip及端口号

1.2连双台mongodb

//ip为主机ip地址,port为端口号,dataBaseName相当于数据库名

DBAddress left = new DBAddress("ip:port/dataBaseName");

DBAddress right = new DBAddress("ip:port/dataBaseName");

//若一个mongodb出现问题,会自动连另外一台

Mongo mongo = new Mongo(left, right);

1.3连多台mongodb

List<ServerAddress> mongoHostList = newArrayList<ServerAddress>();

mongoHostList.add(newServerAddress("ip",port));

mongoHostList.add(newServerAddress("ip",port));

mongoHostList.add(newServerAddress("ip",port));

Mongo mg = newMongo(mongoHostList);

2.1获取mongodb的db

dataBaseName相当于关系数据库里的数据库名,mongodb中若没有该数据库名也不会报错,默认mongodb会建立这个数据库名,为空。

DB db = mg.getDB(dataBaseName); //注意:mongodb区分大小写,程序中一定要注意

2.2mongodb的db安全认证

若这个时候要想访问db中的collection(相当于关系数据库里的表),就必须通过安全认证才可以访问,否则后台会报您没有通过安全认证。

//安全认证java代码 返回true表示通过,false表示没通过不能进行操作

boolean auth =db.authenticate("userName", "password".toCharArray());

3.1得到mongodb中的db的collection

DBCollection users = db.getCollection(tableName);

参数tableName相当于关系数据库里的表名,若mongodb中没有该tableName,默认会创建该tableName,为空

3.2mongodb中的db的collection自增长主键

Mongodb中也像传统的关系数据库里表一样,有主键(_id)概念,用来唯一标识他们。当用户往collection中插入一条新记录的时候,

如果没有指定_id属性,那么mongodb会自动生成一个ObjectId类型的值,保存为_id的值。

3.3java对collection进行插入操作

//第一种插入方式

DBObject data1 = newBasicDBObject();

data1.put("cust_Id", "123456");

data1.put("is_Show", 1);

data1.put("start_time", newDate());

users.insert(data1);//等同于users.save(data1);

//第二中插入方式

BasicDBObjectBuilderdata1 =BasicDBObjectBuilder.start().add(...).add(...);

users.insert(data1.get());//等同于users.save(data1.get());

//第三种插入方式

Map<String, Object> data1 = new HashMap<String, Object>();

data1.put(...);

……

users.insert(new BasicDBObject(data1));//等同于users.save(new BasicDBObject(data1)

);

//第四中插入方式

String json = "{'database': 'mkyongDB','table' : 'hosting'," +  "'detail' : {'records' : 99, 'index' : 'vps_index1', 'active' :'true'}}}";

DBObject data1 = (DBObject)JSON.parse(json);

users.insert(data1);//等同于users.save(data1);

3.4java对collection的查询操作

====================================

DBObject fields = new BasicDBObject();

fields.put("_id", false);

fields.put("tag", true);

fields.put("tv_sec", true);

DBCursor cur = users.find(query, fields);

可以用来过滤不需要获取的字段, 减少IO

====================================

//查询所有的数据find()

DBCursor cur = users.find(); while(cur.hasNext()){...}

//查询id大于等于1的记录,并且只取10条记录

DBCursor cur = users.find(newBasicDBObject("_id",newBasicDBObject("$gte",1))).limit(10);

//查询id大于等于1的记录,并按id进行降序-1表示降序,1升序。

DBCursor cur = users.find(new BasicDBObject("_id",newBasicDBObject("$gte",1))).sort(newBasicDBObject("_id",-1));

//查询id大于等于1的记录,并跳过前10条记录显示 相当于id>10

DBCursor cur = users.find(newBasicDBObject("_id",newBasicDBObject("$gte",1))).skip(10);

//查询id大于等于1的记录,跳过前10条记录并且只显示10条记录。相当//于分页功能where id>10 and id<=20

DBCursor cur = users.find(newBasicDBObject("_id", newBasicDBObject("$gte",1))).skip(10).limit(10);

//查询id大于等于1的所有记录数 返回int型

users.find(newBasicDBObject("_id",newBasicDBObject("$gte",1))).count()

//findAndRemove() 查询_id=30000的数据,并且删除

users.findAndRemove(newBasicDBObject("_id", 30000));

3.5java对collection的更新操作

查询id为300的记录,将cust_Id的值更新为6533615,一定要注意大小写,以及数据//类型,返回值为int表示所影响的记录条数可以用users.findOne(newBasicDBObject("_id",300));查看下,会发现这条记录//只返回两个字段了,分别为_id,cust_Id,别的字段都删除了。

users.update(newBasicDBObject("_id",300), newBasicDBObject ("cust_Id","6533615")).getN();

//这种写法可以实现只更新id为300的cust_Id值为6533615,而不删除这条记录的别的字//段属性

users.update(newBasicDBObject("_id",300), newBasicDBObject("$set",newBasicDBObject("cust_Id","6533615"))).getN();

3.6java对collection的删除操作

//移除cust_Id为6533615的数据。注意 用remove方法不释放磁盘空间,

//mongodb只在collection中做了标志,没有正在删除。

users.remove(newBasicDBObject("cust_Id","6533615")).getN();

//移除id>=1的数据

users.remove(newBasicDBObject("_id",new BasicDBObject("$gte",1))).getN();

//移除整个collection,drop也不释放磁盘空间

users.drop();

本周实验性地使用上mongodb,应用场景很简单,所以现在对mongodb了解也不是很深入。本文主要介绍mongodb的java客户端编程,这方面的内容也很简单,这里只是做个总结。不得不说,像mongodb这种介于kv和sql之间的存储,对很多的互联网应用很合适。mongodb现在的应用案例已经很多,并且社区的活跃度很高(国内也有不少人对其有很深的研究,如果有时间和精力,或许我也会投入一些对mongodb的研究),很值得期待。

言归正传,下面总结下使用Java开发mongodb应用的一些点滴。在Java中和mongodb交互的最直接的选择就是使用MongoDB Java Driver,其下载地址是:http://github.com/mongodb/mongo-java-driver/downloads。总的来说,在Java中操作mongodb的API还是很简洁,下面对其一些常见的使用做些介绍。

1、连接数据库

和mongodb建立连接的示例代码如下:

Mongo m =new Mongo("localhost",27017); DB db = m.getDB("db_test");

尽管这里获得了表示mongodb的db_test数据库连接的对象db,但这时并没有真正和mongodb建立连接,所以即便这时数据库没起来也不会抛出异常,尽管你还是需要catch它的实例化过程。mongodb的java driver对连接做了池化处理,所以应用中只需要实例化一个Mongo对象即可,对它的操作是线程安全的,这对开发使用来说真的是很方便。

2、取得DBCollection

mongodb中的collection在Java中使用DBCollection表示(这是一个抽象类,尽管你不必需要知道),创建DBCollection实例也是一行代码,和创建DB实例一样,这个操作并不涉及真正的和数据库之间的通信。

DBCollection coll = db.getCollection("collection1");

要获得类似mysql中“show tables”功能,可以使用如下代码:

Set<String> colls = db.getCollectionNames();for(String s : colls){System.out.println(s);}3、插入文档

mongodb存储JSON格式的文档,而在Java中表示这种数据格式的最简便的类就是Map了。MongoDB Java Driver中提供的BasicDBObject就是个Map(它继承自LinkedHashMap并实现DBObject接口),它会将Map中的数据转换成BSON格式传输到mongodb。下面是插入文档的示例:

DBCollection coll=db.getCollection("collection1");

BasicDBObject doc=new BasicDBObject();

doc.put("name","kafka0102");doc.put("age",28);doc.put("time", newDate());

coll.insert(doc);

mongodb中每个插入的文档会产生个唯一标识_id。当调用coll.insert(doc);时,driver会检查其中是否有_id字段,如果没有则自动生成ObjectId实例来作为_id的值,这个ObjectId由4部分编码而成:当前时间、机器标识、进程号和自增的整数。 insert函数也支持插入文档列表:

insert(List<DBObject> list)

而提交操作也有update( DBObject q , DBObject o )、remove( DBObject o )。

4、查询文档4.1、findOne

findOne是查询满足条件的第一条记录(不意味着数据库满足条件的只有一条记录),查询条件使用DBObject表示,示例如下:

DBCollection coll=db.getCollection("collection1");

BasicDBObject cond=new BasicDBObject();

cond.put("name","kafka0102");cond.put("age",28);

DBObject ret=coll.findOne(cond);System.out.println(ret);

返回结果是个DBObject,可以通过get(key)来取值。对于查询条件,可以通过嵌套多层来表示复杂的格式,比如:

query=newBasicDBObject();

query.put("i", new BasicDBObject("$gt",50));// e.g. find all where i > 50

4.2、find

find函数是查询集合的,它返回的DBCursor是DBObject的迭代器,使用示例如下:

DBCollection coll=db.getCollection("collection1");

BasicDBObject cond=new BasicDBObject();cond.put("i", new BasicDBObject("$gt",20).append("$lte",30));

DBCursor ret=coll.find(cond);

while(ret.hasNext()){System.out.println(ret.next());}

5、使用索引

创建索引语句如:coll.createIndex(new BasicDBObject(“i”, 1)); ,其中i表示要索引的字段,1表示升序(-1表示降序)。可以看到,DBObject成为java客户端通用的结构表示。查看索引使用DBCollection.getIndexInfo()函数。

6、MongoDB Java Driver的并发性

前面提到,Java MongoDB Driver使用了连接的池化处理,这个连接池默认是保持10个连接,可以通过Option进行修改,在应用中使用Mongo的一个实例即可。连接池中的每个连接使用DBPort结构表示(而不是DBCollection),并寄存于DBPortPool中,所以对DBCollection的操作并不意味着使用同一个连接。如果在应用的一次请求过程中,需要保证使用同一个连接,可以使用下面的代码片断:

DB db...; db.requestStart();//code.... db.requestDone();

在requestStart和requestDone之间使用的连接就不是来自于DBPortPool,而是当前线程中的ThreadLocal结构变量(MyPort中保持了DBPort成员)。

7、其他选择

尽管Java mongodb driver很不错,但就像很多人不使用JDBC而使用一些ORM框架,mongodb的java客户端也有其他的选择。 1)对POJO和DAO的支持。对于那些热衷ORM的人来说,Morphia(http://code.google.com/p/morphia/wiki/QuickStart)是个不错的选择,它通过在POJO中添加注释来实现映射,并提供对DAO的CRUD操作的支持。 2)对DSL的支持。Sculptor就是这样的东西,使用者编写中立的DSL文件,Sculptor将其翻译成代码。这通常不具有吸引力,除非是多语言的应用,能将DSL翻译成多种编程语言,否则除了增加学习成本,没什么收益。 3)对JDBC的支持。mongo-jdbc是这样的东西,但现在还是实验性质的。它或许是想亲近Java程序员,不过它显然不能完全兼容JDBC,而很多Java程序员对JDBC也并不感冒,所以它不是很值得使用。

本文为转载,原地址为:

java下执行mongodb的更多相关文章

  1. shell 脚本下执行Mongodb命令

    最近项目中搭建了两台mongodb的服务器,由于服务器只有两台的情况下,目前只是搭建了主从模式架构(官方目前并不推荐主从模式),缺点就是故障转移不变等等原因,而是推荐副本集模式(这里就不多说了)... ...

  2. Java JDBC下执行SQL的不同方式、参数化预编译防御

    相关学习资料 http://zh.wikipedia.org/wiki/Java数据库连接 http://lavasoft.blog.51cto.com/62575/20588 http://blog ...

  3. dos界面下执行java文件将错误输出到一个文本小技巧

    如果dos下执行java出现错误,把错误记录到一个文档 正确时如图,输出结果为hello,我把String的s改为小写,出现错误,用2>命令输出到error.txt在当前目录就出现了error. ...

  4. 在window下, Java调用执行bat脚本

    参考博客: https://www.cnblogs.com/jing1617/p/6430141.html 最近一段时间用到了Java去执行window下的bat脚本, 这里简单记录一下: 我这里是先 ...

  5. MongoDB和Java(1):Linux下的MongoDB安装

    最近花了一些时间学习了下MongoDB数据库,感觉还是比较全面系统的,涉及了软件安装.客户端操作.安全认证.副本集和分布式集群搭建,以及使用Spring Data连接MongoDB进行数据操作,收获很 ...

  6. Java开发--操作MongoDB

    http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html介绍到了在MongoDB的控制台完成MongoDB的数据操作,通过前一篇文章我们 ...

  7. MySQL命令行下执行.sql脚本详解

    本文主要介绍一个在MySQL命令行下执行脚本文件的例子,通过这个例子让我们来了解一下在命令行下MySQL是怎样执行脚本的吧.现在我们开始介绍这一过程. 1.首先编写sql脚本,保存为的:book.sq ...

  8. window下安装mongodb及php mongo扩展

    1.安装mongoDB 下载最新版本的 MongoDB 下载地址:http://www.mongodb.org/downloads 解压文件到 D:\mongodb 解压后的文件列表如下: 创建数据存 ...

  9. JAVA定时执行任务,每天定时几点钟执行任务

    JAVA定时执行任务,每天定时几点钟执行任务的示例如下: 1.建立TimerManage类,设置时间点,时间点设置的管理类,代码如下: package com.pcitc.time; import j ...

随机推荐

  1. 如何安装使用MinDoc搭建个人在线wiki文档

    MinDoc是什么? MinDoc是一个在线的文档管理系统,该系统适用于团队.个人等使用.开发者最初的目的是为了便于公司内部使用,仿照看云开发.有laravel版本以及golang版本.不过larav ...

  2. spring boot2整合dubbox全注解

    前题 dubbox是dubbo的一个升级版,简单说就是本来dubbo是阿里开发的,现在阿里不维护了,当当网拿过去继续开发.本来阿里的dubbo维护到2.6版本,而再高版本的都是当当网维护的就叫成dub ...

  3. Linux下更新git版本

    查看git版本,卸载旧版本(如果没有安装git请直接到下一步) git --version yum remove git 安装依赖软件 yum install curl-devel expat-dev ...

  4. ECShop全系列版本远程代码执行漏洞复现

    前言 问题发生在user.php的display函数,模版变量可控,导致注入,配合注入可达到远程代码执行 漏洞分析 0x01-SQL注入 先看user.php $back_act变量来源于HTTP_R ...

  5. PTA基础编程题目集6-5求自定类型元素的最大值 (函数题)

    原题目: 本题要求实现一个函数,求N个集合元素S[]中的最大值,其中集合元素的类型为自定义的ElementType. 函数接口定义: ElementType Max( ElementType S[], ...

  6. 爬虫常用的 urllib 库知识点

    urllib 库 urllib 库是 Python 中一个最基本的网络请求库.它可以模仿浏览器的行为向指定的服务器发送请求,同时可以保存服务器返回的数据. urlopen() 在 Python3 的 ...

  7. typedef和define一些问题

    1. 四个用途 用途一: 定义一种类型的别名,而不只是简单的宏替换.可以用作同时声明指针型的多个对象.比如: char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针 ...

  8. 20155206 2016-2017-2 《Java程序设计》第三周学习总结

    20155206 2016-2017-2 <Java程序设计>第三周学习总结 教材学习内容总结 两个基本标准类:java.util.Scanner , java.math.BigDecim ...

  9. 20155211 2016-2017-2 《Java程序设计》第一周学习总结

    20155211 2006-2007-2 <Java程序设计>第1周学习总结 教材学习内容总结 首先根据博客上的指导安装了jdk,并且首次尝试了设置环境变量path和classpath. ...

  10. 20155323 第三次实验 敏捷开发与XP实践

    20155323 第三次实验 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器 ...