第3章 MongoDB的Java驱动

转自:http://limingnihao.iteye.com/blog/1940438

第3章 MongoDB的Java驱动

(黎明你好原创作品,转载请注明)

3.1 下载Java驱动

3.1.1 Jar包

http://central.maven.org/maven2/org/mongodb/mongo-java-driver/

 

3.1.2 Maven

 

Java代码   收藏代码
  1. <dependency>  
  2.     <groupId>org.mongodb</groupId>  
  3.     <artifactId>mongo-java-driver</artifactId>  
  4.     <version>2.10.1</version>  
  5.     <type>jar</type>  
  6.     <scope>compile</scope>  
  7. </dependency>  

 

 

3.2 基本操作

3.2.1 基本操作

 

Java代码   收藏代码
  1. String myUserName = "admin";  
  2. String myPassword = "admin";  
  3. MongoClient mongoClient = new MongoClient("localhost"27017);  
  4.   
  5. // 1.数据库列表  
  6. for (String s : mongoClient.getDatabaseNames()) {  
  7.     System.out.println("DatabaseName=" + s);  
  8. }  
  9.   
  10. // 2.链接student数据库  
  11. DB db = mongoClient.getDB("student");  
  12. mongoClient.setWriteConcern(WriteConcern.JOURNALED);  
  13.   
  14. // 3.用户验证  
  15. boolean auth = db.authenticate(myUserName, myPassword.toCharArray());  
  16. System.out.println("auth=" + auth);  
  17.   
  18. // 4.集合列表  
  19. Set<String> colls = db.getCollectionNames();  
  20. for (String s : colls) {  
  21.     System.out.println("CollectionName=" + s);  
  22. }  
  23.   
  24. // 5.获取摸个集合对象  
  25. DBCollection coll = db.getCollection("user");  

 

 

3.2.2 新增

 

Java代码   收藏代码
  1. BasicDBObject doc = new BasicDBObject("_id""6").append("name"new BasicDBObject("username""limingnihao").append("nickname""黎明你好")).append("password""123456")  
  2.         .append("password""123456").append("regionName""北京").append("works""5").append("birth"new Date());  
  3. WriteResult result = coll.insert(doc);  
  4.   
  5. System.out.println("insert-result: " + result);  

 

 

3.2.3 查询

 

Java代码   收藏代码
  1. // 2.1查询 - one  
  2. DBObject myDoc = coll.findOne();  
  3. System.out.println(myDoc);  
  4.   
  5. // 2.2 查询 - 数量  
  6. System.out.println(coll.getCount());  
  7.   
  8. // 2.3查询 - 全部  
  9. DBCursor cursor = coll.find();  
  10. while (cursor.hasNext()) {  
  11. System.out.println("全部--------" + cursor.next());  
  12. }  
  13.   
  14. // 2.4查询 - 过滤 - 等于  
  15. BasicDBObject query = new BasicDBObject("age"1);  
  16. cursor = coll.find(query);  
  17. while (cursor.hasNext()) {  
  18. System.out.println("age=1--------" + cursor.next());  
  19. }  
  20.   
  21. // 2.5查询 - 过滤条件 - 不等于  
  22. query = new BasicDBObject("age"new BasicDBObject("$ne"1));  
  23. cursor = coll.find(query);  
  24. while (cursor.hasNext()) {  
  25. System.out.println("age!=1" + cursor.next());  
  26. }  
  27.   
  28. // 2.6查询 - 过滤条件 - 20 < i <= 30  
  29. query = new BasicDBObject("age"new BasicDBObject("$gt"20).append("$lte"30));  
  30. cursor = coll.find(query);  
  31. while (cursor.hasNext()) {  
  32. System.out.println("20<age<=30" + cursor.next());  
  33. }  

 

 

3.2.4 修改

 

Java代码   收藏代码
  1. DBObject search = coll.findOne(new BasicDBObject("_id""5"));  
  2. BasicDBObject object = new BasicDBObject().append("$set"new BasicDBObject("password""1211111")).append("$set"new BasicDBObject("birth"new Date()));  
  3. WriteResult result = coll.update(search, object, truetrue);  
  4. System.out.println("update-result: " + result);  

 

 

3.2.5 删除

 

Java代码   收藏代码
  1. DBObject search = coll.findOne(new BasicDBObject("_id""6"));  
  2. WriteResult result = coll.remove(search);  
  3. System.out.println("remove-result: " + result);  

 

 

3.3 Java驱动并发

        Java MongoDB驱动程序是线程安全的。如果在Web服务器环境中使用,那么应该创建一个MongoClient实例全局使用。MongoClient内部维护了数据库的连接池(默认连接池大小为10)。每次DB请求(查询、插入等)的Java线程将从连接池中获取链接并进行支持,然后释放连接。每次使用连接是不相同的。

        在复制(replica)模式下,如果设置slaveOK选项为on,那么读操作会被均匀的分布到各个slave上。这意味着对于同一个线程,一个写操作后紧跟着的一个读操作,有可能被发送到不同的服务器上(写操作发送到master上,读操作发送到slave上),这样读操作有可能不会立刻反映出上一个写操作的数据(因为主从的异步性)。

        如果你想要确保在一个session中完整的一致性(例如在一个http请求中),你可能希望java驱动是用同一个socket连接,这时你可以通过使用"consistent request"来达到目的——在操作前后分别调用requestStart()和requestDone()。

DB和DBCollection完全是线程安全的。事实上,你不管怎么样调用都是同一实例,因为他们进行了缓存。

 

Java代码   收藏代码
  1. DB db...;  
  2. db.requestStart();  
  3. try {  
  4.    db.requestEnsureConnection();  
  5.    code....  
  6. finally {  
  7.    db.requestDone();  
  8. }  

 

 

在单独写操作上的WriteConcern选项

        默认情况下,每次写操作后,连接就被释放回连接池——此时你调用getLastError()是没用的。

所以可以采用两种方式:

        1,使用类似WriteConcern.SAFE这样的写策略来代替默认策略,这样java驱动会自动首先调用getLastError(),然后才将连接放回连接池。

Java代码   收藏代码
  1. DBCollection coll...;  
  2. coll.insert(..., WriteConcern.SAFE);  

 

        2,采用上述的requestStart()和requestDone()方式来维持连接不被释放,中间调用getLastError()获取错误信息。

Java代码   收藏代码
  1. DBCollection coll...;  
  2. coll.insert(..., WriteConcern.SAFE);  
  3. DB db...;  
  4. DBCollection coll...;  
  5. db.requestStart();  
  6. try {  
  7.    coll.insert(...);  
  8.    DBObject err = db.getLastError();  
  9. finally {  
  10.    db.requestDone();  
  11. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值