mongodb在java驱动包下的操作

    忙了四五天,终于对mongoDB有了一定的认识和了解。前面几篇博客中,我介绍了在Linux下mongoDB的安装和遇到的问题,以及在Linux下mongoDB的高级查询和高级修改的一些语法规则。本篇博客我将隆重介绍mongoDB在java驱动包下的操作。
    MongoDB可能是现今NoSQL数据库中最著名的,但并不意味着MongoDB是完美的,在某些情况下,传统的关系数据库如MySQL和PostgreSQL更具优势。但MongoDB目前已经相当广泛,使用者们在充分享受它的灵活性。

                                                                              --西楚小羽
    首先来谈一下爱上mongoDB的七大理由:

1. 文档存储
    数据存储以BSON/JSON文档,这对于Web应用程序有很大的意义。开发者API喜欢以JSON形式传输,这使得整个项目的数据表示可采用统一的模型。所有这一切都无需任何前期架构设计。
2. 可扩展性
    MongoDB被用在一些规模庞大的环境中,FourSquare/Craiglist都在使用它。通过分片数据缩放处理理论上可实现更高的吞吐量。
3. 简单的复制
    就像分片技术一样,MongoDB范围内复制过程同样简单好用,在副本机器上还有大量的复制选项。灵活的功能可满足用户应用的需求。
4. 易于查询
    MongoDB以文档的形式存储数据,不支持事务和表连接。因此查询的编写、理解和优化都容易得多。简单查询设计思路不同于SQL模式,嵌入文档在特定的环境下可得到更好的查询,然而这需要先加入集合。如果需要执行多个请求到数据库则需要加入其到客户端。在MongoDB时ODM工具(如Doctrine2)将发挥自身的优势。
5. 安全性
    由于MongoDB客户端生成的查询为BSON对象,而不是可以被解析的字符串,所以可降低受到SQL注入的攻击的危险。最常见的攻击类型为针对Web应用程序的攻击,在MongoDB上使用Doctrine2 ODMs 查询语言可减轻攻击风险。
6. 支持
    用户在选择数据库时总是喜欢积极和充满活力的,这点非常重要。MongoDB在业界有非常大的影响力,用户也会定期的组织活动。MongoDB的标签在StackOverFlow是非常活跃的。你永远不会陷入困境,因为总有人与你讨论并解决问题。
7. 价格
    MongoDB是免费的!


    开发环境:
        System:Windows
        IDE:eclipse、MyEclipse2014
        Database:mongoDB
    开发依赖库:

        mongo-java-driver-2.10.1.jar

        junit-4.11.jar

一、准备工作

    1、 首先,下载mongoDB对Java支持的驱动包

         mongoDB对Java的相关支持、技术:http://www.mongodb.org/display/DOCS/Java+Language+Center

         在线查看源码:http://api.mongodb.org/java/current


    2、 下面建立一个JavaProject工程,导入下载下来的驱动包。即可在Java中使用mongoDB,目录如下:

          


二、Java操作MongoDB示例

    在本示例之前你需要启动mongod的服务,启动后,下面的程序才能顺利执行:

Mongo mongo = new Mongo();

这样就创建了一个MongoDB的数据库连接对象,它默认连接到当前机器的localhost地址,端口是27017。

DB db = mongo.getDB(“test”);

这样就获得了一个test的数据库,如果mongoDB中没有创建这个数据库也是可以正常运行的。mongoDB可以在没有创建这个数据库的情况下,完成数据的添加操作。当添加的时候,没有这个库,mongoDB会自动创建当前数据库。

得到了db,下一步我们要获取一个“聚集集合DBCollection”,通过db对象的getCollection方法来完成。

DBCollection users = db.getCollection("users");

这样就获得了一个DBCollection,它相当于我们数据库的“表”。

mongodb的query关系式需要参考http://docs.mongodb.org/manual/reference/operator/query/

好了,一切就绪,下面就是我的测试完整源代码:

1、第一个小热身例子:

package com.dhb.test;

import java.net.UnknownHostException;

import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.Mongo;
import com.mongodb.util.JSON;
/**
 * 
 * @author dhb
 *
 */
public class SimpleTest {
	public static void main(String[] args) throws UnknownHostException {
		Mongo mg = new Mongo("192.168.13.100", 27017);
		//查询所有的Database
		for (String name : mg.getDatabaseNames()) {
			System.out.println("dbName:"+name);
		}
		DB db = mg.getDB("test");
		//查询所有的聚集集合
		for (String name : db.getCollectionNames()) {
            System.out.println("collectionName: " + name);
        }
		DBCollection c2 = db.getCollection("c2");
		//查询所有的数据
		DBCursor cur = c2.find();
        while (cur.hasNext()) {
            System.out.println(cur.next());
        }
        //输出c2表的记录数目
        System.out.println("c2表的记录数:"+cur.count());
        System.out.println("当前游标ID:"+cur.getCursorId());
        System.out.println("全部json格式化:"+JSON.serialize(cur));
	}
}

    2、mongoDB下具体的增删改查操作以及对图片的相关处理

package com.dhb.test;

import java.io.File;
import java.io.IOException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.bson.types.ObjectId;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.mongodb.BasicDBObject;
import com.mongodb.BasicDBObjectBuilder;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import com.mongodb.MongoException;
import com.mongodb.gridfs.GridFS;
import com.mongodb.gridfs.GridFSDBFile;
import com.mongodb.gridfs.GridFSInputFile;
import com.mongodb.util.JSON;
/**
 * 
 */
public class MongoDBCRUDTest {
	private Mongo mg = null;
	private DB db;
	private DBCollection collection;
	
	@Before
	public void init() {
		try {
			//mg = new Mongo();
			//实例化Mongo对象,连接27017端口
			mg = new Mongo("192.168.13.100", 27017);
		} catch (UnknownHostException e) {
			
			e.printStackTrace();
		} catch (MongoException e) {
            e.printStackTrace();
        }
		//连接名为test的数据库,假如数据库不存在的话,mongodb会自动建立
		 db = mg.getDB("test");
		//从Mongodb中获得名为c1的数据集合,如果该数据集合不存在,Mongodb会为其新建立
		 collection = db.getCollection("c1");
	}
	@After
	public void destroy() {
		if (mg != null)
            mg.close();
        mg = null;
        db = null;
        collection = null;
        System.gc();
	}
	
	public void print(Object o) {
        System.out.println(o);
    }
	/**
	 * <b>function:</b> 查询所有数据
	 * @author dhb
	 * @createDate 
	 */
	//@Test
	public void queryAll() {
	    print("查询c1的所有数据:");
	    //db游标
	    DBCursor cur = collection.find();
	    while (cur.hasNext()) {
	        print(cur.next());
	    }
	}
	/**
	 * 第一种方法,是使用BasicDBObject
	 */
	//@Test
	public void insert() {
		//先查询所有数据
	    queryAll();
	    print("count------------------------: " + collection.count());
	    // 使用BasicDBObject对象创建一个mongodb的document,并给予赋值。
	    DBObject document = new BasicDBObject();
	    
	    document.put("name", "user12");
	    document.put("age", 11);
	 	//document.save(user)保存,getN()获取影响行数
	 	//print(collection.save(document).getN());
	 		    
	 	//扩展字段,随意添加字段,不影响现有数据
	    document.put("sex", "boy");
	 	print("getN()获取影响行数:"+collection.save(document).getN());
	 	queryAll();
	}
	//@Test
	public void insert2() {
		//先查询所有数据
	    queryAll();
	    print("count------------------------: " + collection.count());
	    // 使用BasicDBObject对象创建一个mongodb的document,并给予赋值。
	    DBObject document = new BasicDBObject();
	 	//添加多条数据,传递Array对象
	 	print(collection.insert(document, new BasicDBObject("name", "user13"),
	 			new BasicDBObject("name", "user14")).getN());
	 	queryAll();
	}
	//@Test
	public void insert3() {
		//先查询所有数据
	    queryAll();
	    print("count------------------------: " + collection.count());
	    
        DBObject document = new BasicDBObject();
	    document.put("name", "user15");
	    document.put("age", 15);
	    document.put("sex", "girl");
	    
	    //添加List集合
	    List<DBObject> list = new ArrayList<DBObject>();
	    list.add(document);
	    DBObject document2 = new BasicDBObject("name", "lucy");
	    document2.put("age", 22);
	    list.add(document2);
	    //添加List集合
	    print(collection.insert(list).getN());
	    
	    //查询下数据,看看是否添加成功
	    print("count: " + collection.count());
	    queryAll();
	}
	/**
	 * 第二种方法是使用BasicDBObjectBuilder对象
	 */
	//@Test
	public void insert4() {
		queryAll();
		BasicDBObjectBuilder documentBuilder = BasicDBObjectBuilder.start()
				.add("database", "mkyongDB")
				.add("table", "hosting");
		
		BasicDBObjectBuilder documentBuilderDetail = BasicDBObjectBuilder.start()
				.add("records", "99")
				.add("index", "vps_index1")
				.add("active", "true");
		
		documentBuilder.add("detail", documentBuilderDetail.get());
		collection.insert(documentBuilder.get());
		queryAll();
	}
	/**
	 * 第三种方法是使用Map对象
	 */
	//@Test
	public void insert5() {
		queryAll();
		Map documentMap =new HashMap();
		documentMap.put("name", "Victor");
		documentMap.put("age", "23");
		
		Map documentMapDetail =new HashMap();
		documentMapDetail.put("records", "99");
		documentMapDetail.put("index", "vps_index1");
		documentMapDetail.put("active", "true");
		
		documentMap.put("detail", documentMapDetail);
		collection.insert(new BasicDBObject(documentMap));
		
		queryAll();
	}
	/**
	 * 第四种方法,也就是最简单的,即直接插入JSON格式数据
	 */
	//@Test
	public void insert6() {
		queryAll();
		String json ="{'name' : 'Victor','age' : 35,"+"'detail' : {'records' : 99, 'index' : 'vps_index1', 'active' : 'true'}}";
		//这里使用了JSON的parse方法,将解析后的JSON字符串转变为DBObject对象后再直接插入到collection中去
		DBObject dbObject =(DBObject)JSON.parse(json);
		collection.insert(dbObject);
		queryAll();
	}
	//@Test
	public void remove() {
		queryAll();
		/*print("删除id = 54ce0da47eb42dac72929bad:" + collection.remove(new BasicDBObject("_id",
				new ObjectId("54ce0da47eb42dac72929bad"))).getN());*/
		print("remove age > 20: " + collection.remove(new BasicDBObject("age", 
				new BasicDBObject("$gt", 20))).getN());
		queryAll();
	}
	//@Test
	public void update() {
		queryAll();
		//这种方式下,其他字段会全部消失
		print("修改:" + collection.update(new BasicDBObject("_id", new ObjectId("54cc961bea40cc6103a81646")), 
				new BasicDBObject("age", 98)).getN());
		queryAll();
	}
	//@Test
	public void update2() {
		queryAll();
		//这种方式下,其他字段不会消失
		BasicDBObject newDocument =new BasicDBObject();
		newDocument.put("name", "user11");
		newDocument.put("age", 1111);
		newDocument.put("sex", "boy");
		collection.update(new BasicDBObject().append("name", "user11"), newDocument);
		queryAll();
	}
	//@Test
	public void update3() {
		queryAll();
		//$set修饰符的使用,这种方式下,其他字段不会消失
		BasicDBObject newDocument =new BasicDBObject().append("$set",
				new BasicDBObject().append("sex", "boy"));
		collection.update(new BasicDBObject().append("name", "user15"), newDocument);
		queryAll();
	}
	//@Test
	public void update4() {
		queryAll();
		print("修改:" + collection.update(
	            new BasicDBObject("_id", new ObjectId("54cc961bea40cc6103a81644")), 
	            new BasicDBObject("age", 121),
	            true,//如果数据库不存在,是否添加
	            false//多条修改
	            ).getN());
		queryAll();
	}
	//@Test
	public void query() {
		//mongodb的query关系式需要参考http://docs.mongodb.org/manual/reference/operator/query/
		//queryAll();
		System.out.println("================================================");
		//1) 获得数据库中的第一个document
		DBObject doc = collection.findOne();
		System.out.println("获得数据库中的第一个document: "+doc);
		
		//2)这里,使用collection.find()方法,获得当前数据库中所有的documents对象集合
		//然后通过对DBCursor对象集合的遍历,即可输出当前所有documents
		DBCursor cursor = collection.find();
		System.out.println("游标遍历数据");
		
		while(cursor.hasNext()){
			System.out.println(cursor.next());
		}
		System.out.println("================================================");
		
		//3)获取指定的document
		BasicDBObject query =new BasicDBObject();
		query.put("name", "Victor");
		DBCursor cursor2 = collection.find(query);
		while(cursor2.hasNext()){
			System.out.println(cursor2.next());
		}
		System.out.println("================================================");
		
		//4) 使用in操作符号
		//在mongodb中,也可以使用in操作符,比如要获得age=9和age=15的document对象
		BasicDBObject query2 =new BasicDBObject();
		List list =new ArrayList();
		list.add(9);
		list.add(15);
		query2.put("age", new BasicDBObject("$in", list));
		DBCursor cursor3 = collection.find(query2);
		while(cursor3.hasNext()){
			System.out.println(cursor3.next());
		}
		System.out.println("================================================");
		//5) 使用>,<等比较符号,比如要输出age>5的document集合,则使用“$gt”即可,同理,小于关系则使用$lt
		BasicDBObject query3 =new BasicDBObject();
		query3.put("age", new BasicDBObject("$gt", 5));
		DBCursor cursor4 = collection.find(query3);
		while(cursor4.hasNext()){
			System.out.println(cursor4.next());
		}
	}
	
	// 保存图片到Mongodb
	/**
	 * 使用Java MongoDB GridFS API去保存图片等二进制文件到Monodb,关于Java MongoDB GridFS API的详细论述,
	 * 请参考http://www.mongodb.org/display/DOCS/GridFS+Specification
	 * @throws IOException 
	 */
	//@Test
	public void photo() throws IOException {
		//1)保存图片。
		//将D盘下的beauty.jpg保存到mongodb中去,并命名为mongoDB-java-image。
		String newFileName ="mongoDB-java-image";
		File imageFile =new File("D:\\beauty.jpg");
		/** 
		 * 在数据库中为指定的 bucket 创建 GridFS 实例 
		 * bucket 可以认为是标识符,用于区分不同的 GridFS 的实例,类似于传统数据库中的不同表 
		 * 默认的 bucket 是 "fs" 
		 */  
		GridFS gfsPhoto =new GridFS(db, "photo");
		
		GridFSInputFile gfsFile = gfsPhoto.createFile(imageFile);
		
		gfsFile.setFilename(newFileName);
		gfsFile.save();
		System.out.println("保存图片!");
	}
	//@Test
	public void photo2() {
		//2) 读取图片信息
		String newFileName ="mongoDB-java-image";
		GridFS gfsPhoto =new GridFS(db, "photo");
		GridFSDBFile imageForOutput = gfsPhoto.findOne(newFileName);
		System.out.println("输出图片信息!");
		System.out.println(imageForOutput);
		/**
		 * 将会输出JSON格式的结果
		 * { "_id" : { "$oid" : "54ce38087eb4bbfaa4b7a6d8"} , "chunkSize" : 262144 , 
		 * "length" : 123948 , "md5" : "dff5f0f1ac0eb9e13e81c5c9c826cc04" ,
		 *  "filename" : "mongoDB-java-image" , "contentType" :  null  , 
		 *  "uploadDate" : { "$date" : "2015-02-01T14:28:24.050Z"} , "aliases" :  null }
		 */
	}
	@Test
	public void photo3() {
		// 3) 输出已保存的所有图片
		//输出所有保存在photo命名空间下的图片信息:
		GridFS gfsPhoto =new GridFS(db, "photo");
		DBCursor cursor = gfsPhoto.getFileList();
		System.out.println("输出已保存的所有图片!");
		while(cursor.hasNext()){
			System.out.println(cursor.next());
		}
		queryAll();
	}
	//@Test
	public void photo4() throws IOException {
		//4) 从数据库中读取一张图片并另存
		//从数据库中读取一张图片并另存为另外一张图片到磁盘中
		String newFileName ="mongoDB-java-image";
		GridFS gfsPhoto =new GridFS(db, "photo");
		GridFSDBFile imageForOutput = gfsPhoto.findOne(newFileName);
		imageForOutput.writeTo("D:\\beauty2.jpg");
		System.out.println("从数据库中读取一张图片并另存!");
	}
	//@Test
	public void photo5() throws IOException {
		//5) 删除图片
		String newFileName ="mongoDB-java-image";
		GridFS gfsPhoto =new GridFS(db, "photo");
		gfsPhoto.remove(gfsPhoto.findOne(newFileName));
		System.out.println("删除图片!");
	}
	
}


小结:通过自己的亲身体验,发现mongoDB真的很有趣。

        参考文档:http://blog.csdn.net/hx_uestc/article/details/7620938















  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值