读书人

怎么用Java操作MongoDB【转】

发布时间: 2012-10-06 17:34:01 作者: rapoo

如何用Java操作MongoDB【转】

上一篇文章介绍到了在MongoDB的控制台完成MongoDB的数据操作,通过前一篇文章我们对MongoDB有了全面的认识和理解。现在我们就用Java来操作MongoDB的数据。

开发环境:

    System:WindowsIDE:eclipse、MyEclipse 8Database:mongoDB

开发依赖库:

    JavaEE5、mongo-2.5.3.jar、junit-4.8.2.jarEmail:hoojo_@126.comBlog:http://blog.csdn.net/IBM_hoojo

一、准备工作

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

驱动包下载地址:https://github.com/mongodb/mongo-java-driver/downloads

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

驱动源码下载:https://download.github.com/mongodb-mongo-java-driver-r2.6.1-7-g6037357.zip

在线查看源码:https://github.com/mongodb/mongo-java-driver

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

#FormatImgID_0#

二、Java操作MongoDB示例

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

1、 建立SimpleTest.java,完成简单的mongoDB数据库操作

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,它相当于我们数据库的“表”。

查询所有数据

  1. package?com.hoo.test; ?? ?
  2. import?java.net.UnknownHostException; ?import?com.mongodb.DB; ?
  3. import?com.mongodb.DBCollection; ?import?com.mongodb.DBCursor; ?
  4. import?com.mongodb.Mongo; ?import?com.mongodb.MongoException; ?
  5. import?com.mongodb.util.JSON; ?? ?
  6. /** ??*?function:MongoDB?简单示例 ?
  7. ?*?@author?hoojo ??*?@createDate?2011-5-24?下午02:42:29 ?
  8. ?*?@file?SimpleTest.java ??*?@package?com.hoo.test ?
  9. ?*?@project?MongoDB ??*?@blog?http://blog.csdn.net/IBM_hoojo ?
  10. ?*?@email?hoojo_@126.com ??*?@version?1.0 ?
  11. ?*/?public?class?SimpleTest?{ ?
  12. ? ?????public?static?void?main(String[]?args)?throws?UnknownHostException,?MongoException?{ ?
  13. ????????Mongo?mg?=?new?Mongo(); ?????????//查询所有的Database ?
  14. ????????for?(String?name?:?mg.getDatabaseNames())?{ ?????????????System.out.println("dbName:?"?+?name); ?
  15. ????????} ????????? ?
  16. ????????DB?db?=?mg.getDB("test"); ?????????//查询所有的聚集集合 ?
  17. ????????for?(String?name?:?db.getCollectionNames())?{ ?????????????System.out.println("collectionName:?"?+?name); ?
  18. ????????} ????????? ?
  19. ????????DBCollection?users?=?db.getCollection("users"); ????????? ?
  20. ????????//查询所有的数据 ?????????DBCursor?cur?=?users.find(); ?
  21. ????????while?(cur.hasNext())?{ ?????????????System.out.println(cur.next()); ?
  22. ????????} ?????????System.out.println(cur.count()); ?
  23. ????????System.out.println(cur.getCursorId()); ?????????System.out.println(JSON.serialize(cur)); ?
  24. ????} ?} ?

2、?完成CRUD操作,首先建立一个MongoDB4CRUDTest.java,基本测试代码如下:?

  1. package?com.hoo.test;?? ???? ?
  2. ?import?java.net.UnknownHostException;?? ?
  3. import?java.util.ArrayList;?? ?import?java.util.List;?? ?
  4. import?org.bson.types.ObjectId;?? ?import?org.junit.After;?? ?
  5. import?org.junit.Before;?? ?import?org.junit.Test;?? ?
  6. import?com.mongodb.BasicDBObject;?? ?import?com.mongodb.Bytes;?? ?
  7. import?com.mongodb.DB;?? ?import?com.mongodb.DBCollection;?? ?
  8. import?com.mongodb.DBCursor;?? ?import?com.mongodb.DBObject;?? ?
  9. import?com.mongodb.Mongo;?? ?import?com.mongodb.MongoException;?? ?
  10. import?com.mongodb.QueryOperators;?? ?import?com.mongodb.util.JSON;?? ?
  11. ??? ?/**?? ?
  12. ?*?function:实现MongoDB的CRUD操作?? ??*?@author?hoojo?? ?
  13. ?*?@createDate?2011-6-2?下午03:21:23?? ??*?@file?MongoDB4CRUDTest.java?? ?
  14. ?*?@package?com.hoo.test?? ??*?@project?MongoDB?? ?
  15. ?*?@blog?http://blog.csdn.net/IBM_hoojo?? ??*?@email?hoojo_@126.com?? ?
  16. ?*?@version?1.0?? ??*/? ?
  17. public?class?MongoDB4CRUDTest?{?? ??????? ?
  18. ????private?Mongo?mg?=?null;?? ?????private?DB?db;?? ?
  19. ????private?DBCollection?users;?? ??????? ?
  20. ????@Before? ?????public?void?init()?{?? ?
  21. ????????try?{?? ?????????????mg?=?new?Mongo();?? ?
  22. ????????????//mg?=?new?Mongo("localhost",?27017);?? ?????????}?catch?(UnknownHostException?e)?{?? ?
  23. ????????????e.printStackTrace();?? ?????????}?catch?(MongoException?e)?{?? ?
  24. ????????????e.printStackTrace();?? ?????????}?? ?
  25. ????????//获取temp?DB;如果默认没有创建,mongodb会自动创建?? ?????????db?=?mg.getDB("temp");?? ?
  26. ????????//获取users?DBCollection;如果默认没有创建,mongodb会自动创建?? ?????????users?=?db.getCollection("users");?? ?
  27. ????}?? ??????? ?
  28. ?????@After? ?
  29. ????public?void?destory()?{?? ?????????if?(mg?!=?null)?? ?
  30. ????????????mg.close();?? ?????????mg?=?null;?? ?
  31. ????????db?=?null;?? ?????????users?=?null;?? ?
  32. ????????System.gc();?? ?????}?? ?
  33. ????public?void?print(Object?o)?{?? ?????????System.out.println(o);?? ?
  34. ????}?? ?}??

?

3、 添加操作

在添加操作之前,我们需要写个查询方法,来查询所有的数据。代码如下:

  1. /** ??*?function:?查询所有数据 ?
  2. ?*?@author?hoojo ??*?@createDate?2011-6-2?下午03:22:40 ?
  3. ?*/?private?void?queryAll()?{ ?
  4. ????print("查询users的所有数据:"); ?????//db游标 ?
  5. ????DBCursor?cur?=?users.find(); ?????while?(cur.hasNext())?{ ?
  6. ????????print(cur.next()); ?????} ?
  7. } ?? ?
  8. @Test?public?void?add()?{ ?
  9. ????//先查询所有数据 ?????queryAll(); ?
  10. ????print("count:?"?+?users.count()); ????? ?
  11. ????DBObject?user?=?new?BasicDBObject(); ?????user.put("name",?"hoojo"); ?
  12. ????user.put("age",?24); ?????//users.save(user)保存,getN()获取影响行数 ?
  13. ????//print(users.save(user).getN()); ????? ?
  14. ????//扩展字段,随意添加字段,不影响现有数据 ?????user.put("sex",?"男"); ?
  15. ????print(users.save(user).getN()); ????? ?
  16. ????//添加多条数据,传递Array对象 ?????print(users.insert(user,?new?BasicDBObject("name",?"tom")).getN()); ?
  17. ???? ?????//添加List集合 ?
  18. ????List?list?=?new?ArrayList(); ?????list.add(user); ?
  19. ????DBObject?user2?=?new?BasicDBObject("name",?"lucy"); ?????user.put("age",?22); ?
  20. ????list.add(user2); ?????//添加List集合 ?
  21. ????print(users.insert(list).getN()); ????? ?
  22. ????//查询下数据,看看是否添加成功 ?????print("count:?"?+?users.count()); ?
  23. ????queryAll(); ?}?

4、 删除数据

  1. @Test?public?void?remove()?{ ?
  2. ????queryAll(); ?????print("删除id?=?4de73f7acd812d61b4626a77:"?+?users.remove(new?BasicDBObject("_id",?new?ObjectId("4de73f7acd812d61b4626a77"))).getN()); ?
  3. ????print("remove?age?>=?24:?"?+?users.remove(new?BasicDBObject("age",?new?BasicDBObject("$gte",?24))).getN()); ?}?

5、 修改数据

  1. @Test?public?void?modify()?{ ?
  2. ????print("修改:"?+?users.update(new?BasicDBObject("_id",?new?ObjectId("4dde25d06be7c53ffbd70906")),?new?BasicDBObject("age",?99)).getN()); ?????print("修改:"?+?users.update( ?
  3. ????????????new?BasicDBObject("_id",?new?ObjectId("4dde2b06feb038463ff09042")),? ?????????????new?BasicDBObject("age",?121), ?
  4. ????????????true,//如果数据库不存在,是否添加 ?????????????false//多条修改 ?
  5. ????????????).getN()); ?????print("修改:"?+?users.update( ?
  6. ????????????new?BasicDBObject("name",?"haha"),? ?????????????new?BasicDBObject("name",?"dingding"), ?
  7. ????????????true,//如果数据库不存在,是否添加 ?????????????true//false只修改第一天,true如果有多条就不修改 ?
  8. ????????????).getN()); ????? ?
  9. ????//当数据库不存在就不修改、不添加数据,当多条数据就不修改 ?????//print("修改多条:"?+?coll.updateMulti(new?BasicDBObject("_id",?new?ObjectId("4dde23616be7c19df07db42c")),?new?BasicDBObject("name",?"199"))); ?
  10. }?

?

6、 查询数据

  1. @Test?public?void?query()?{ ?
  2. ????//查询所有 ?????//queryAll(); ?
  3. ???? ?????//查询id?=?4de73f7acd812d61b4626a77 ?
  4. ????print("find?id?=?4de73f7acd812d61b4626a77:?"?+?users.find(new?BasicDBObject("_id",?new?ObjectId("4de73f7acd812d61b4626a77"))).toArray()); ????? ?
  5. ????//查询age?=?24 ?????print("find?age?=?24:?"?+?users.find(new?BasicDBObject("age",?24)).toArray()); ?
  6. ???? ?????//查询age?>=?24 ?
  7. ????print("find?age?>=?24:?"?+?users.find(new?BasicDBObject("age",?new?BasicDBObject("$gte",?24))).toArray()); ?????print("find?age?<=?24:?"?+?users.find(new?BasicDBObject("age",?new?BasicDBObject("$lte",?24))).toArray()); ?
  8. ???? ?????print("查询age!=25:"?+?users.find(new?BasicDBObject("age",?new?BasicDBObject("$ne",?25))).toArray()); ?
  9. ????print("查询age?in?25/26/27:"?+?users.find(new?BasicDBObject("age",?new?BasicDBObject(QueryOperators.IN,?new?int[]?{?25,?26,?27?}))).toArray()); ?????print("查询age?not?in?25/26/27:"?+?users.find(new?BasicDBObject("age",?new?BasicDBObject(QueryOperators.NIN,?new?int[]?{?25,?26,?27?}))).toArray()); ?
  10. ????print("查询age?exists?排序:"?+?users.find(new?BasicDBObject("age",?new?BasicDBObject(QueryOperators.EXISTS,?true))).toArray()); ????? ?
  11. ????print("只查询age属性:"?+?users.find(null,?new?BasicDBObject("age",?true)).toArray()); ?????print("只查属性:"?+?users.find(null,?new?BasicDBObject("age",?true),?0,?2).toArray()); ?
  12. ????print("只查属性:"?+?users.find(null,?new?BasicDBObject("age",?true),?0,?2,?Bytes.QUERYOPTION_NOTIMEOUT).toArray()); ????? ?
  13. ????//只查询一条数据,多条去第一条 ?????print("findOne:?"?+?users.findOne()); ?
  14. ????print("findOne:?"?+?users.findOne(new?BasicDBObject("age",?26))); ?????print("findOne:?"?+?users.findOne(new?BasicDBObject("age",?26),?new?BasicDBObject("name",?true))); ?
  15. ???? ?????//查询修改、删除 ?
  16. ????print("findAndRemove?查询age=25的数据,并且删除:?"?+?users.findAndRemove(new?BasicDBObject("age",?25))); ????? ?
  17. ????//查询age=26的数据,并且修改name的值为Abc ?????print("findAndModify:?"?+?users.findAndModify(new?BasicDBObject("age",?26),?new?BasicDBObject("name",?"Abc"))); ?
  18. ????print("findAndModify:?"?+?users.findAndModify( ?????????new?BasicDBObject("age",?28),?//查询age=28的数据 ?
  19. ????????new?BasicDBObject("name",?true),?//查询name属性 ?????????new?BasicDBObject("age",?true),?//按照age排序 ?
  20. ????????false,?//是否删除,true表示删除 ?????????new?BasicDBObject("name",?"Abc"),?//修改的值,将name修改成Abc ?
  21. ????????true,? ?????????true)); ?
  22. ???? ?????queryAll(); ?
  23. }?

mongoDB不支持联合查询、子查询,这需要我们自己在程序中完成。将查询的结果集在Java查询中进行需要的过滤即可。

7、 其他操作

  1. public?void?testOthers()?{ ?????DBObject?user?=?new?BasicDBObject(); ?
  2. ????user.put("name",?"hoojo"); ?????user.put("age",?24); ?
  3. ???? ?????//JSON?对象转换???????? ?
  4. ????print("serialize:?"?+?JSON.serialize(user)); ?????//反序列化 ?
  5. ????print("parse:?"?+?JSON.parse("{?\"name\"?:?\"hoojo\"?,?\"age\"?:?24}")); ????? ?
  6. ????print("判断temp?Collection是否存在:?"?+?db.collectionExists("temp")); ????? ?
  7. ????//如果不存在就创建 ?????if?(!db.collectionExists("temp"))?{ ?
  8. ????????DBObject?options?=?new?BasicDBObject(); ?????????options.put("size",?20); ?
  9. ????????options.put("capped",?20); ?????????options.put("max",?20); ?
  10. ????????print(db.createCollection("account",?options)); ?????} ?
  11. ???? ?????//设置db为只读 ?
  12. ????db.setReadOnly(true); ????? ?
  13. ????//只读不能写入数据 ?????db.getCollection("test").save(user); ?
  14. }?

好了,这里基本上就介绍这么多Java操作MongoDB的方法。其他的东西还需要你自己多多研究。上面操作MongoDB的方法都是一些常用的方法,比较简单。

原文链接:http://www.cnblogs.com/hoojo/archive/2011/06/02/2068665.html

读书人网 >其他数据库

热点推荐