上一节我们了解了通过客户端mongo对数据库进行访问,本节我们使用mongodb的java驱动来操作mongodb数据库。
官方文档:http://docs.mongodb.org/ecosystem/drivers/java/
1.添加maven 依赖jar包
<dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>2.13.0</version> </dependency>2.java操作实例,详情参考代码
package cn.slimsmart.mongodb.demo.crud; import java.net.UnknownHostException; import java.util.Date; import java.util.Set; import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.DBObject; import com.mongodb.MongoClient; import com.mongodb.WriteConcern; import com.mongodb.WriteResult; public class MongoTest { private static MongoClient mongoClient; public static void main(String[] args) throws UnknownHostException { // 初始化mongoClient mongoClient = new MongoClient("192.168.36.61", 23000); // 1.数据库列表 for (String s : mongoClient.getDatabaseNames()) { System.out.println("DatabaseName=" + s); } // 2.链接student数据库 DB db = mongoClient.getDB("student"); mongoClient.setWriteConcern(WriteConcern.JOURNALED); // 3.用户验证 @SuppressWarnings("deprecation") boolean auth = db.authenticate("admin", "".toCharArray()); System.out.println("auth=" + auth); // 4.集合列表 Set<String> colls = db.getCollectionNames(); for (String s : colls) { System.out.println("CollectionName=" + s); } // 5.获取摸个集合对象 DBCollection coll = db.getCollection("user"); System.out.println("----------save-------------"); save(coll); System.out.println("----------query-------------"); query(coll); System.out.println("----------update-------------"); update(coll); System.out.println("----------delete-------------"); delete(coll); } // 新增数据 public static void save(DBCollection coll) { BasicDBObject doc = new BasicDBObject("_id", "6").append("name", new BasicDBObject("username", "zhangsan").append("nickname", "张三")) .append("password", "123456").append("password", "123456").append("regionName", "北京").append("works", "5").append("birth", new Date()); WriteResult result = coll.insert(doc); System.out.println("insert-result: " + result); } //查询 public static void query(DBCollection coll) { // 1查询 - one DBObject myDoc = coll.findOne(); System.out.println(myDoc); // 2 查询 - 数量 System.out.println(coll.getCount()); // 3查询 - 全部 DBCursor cursor = coll.find(); while (cursor.hasNext()) { System.out.println("全部--------" + cursor.next()); } // 4查询 - 过滤 - 等于 BasicDBObject query = new BasicDBObject("age", 1); cursor = coll.find(query); while (cursor.hasNext()) { System.out.println("age=1--------" + cursor.next()); } // 5查询 - 过滤条件 - 不等于 query = new BasicDBObject("age", new BasicDBObject("$ne", 1)); cursor = coll.find(query); while (cursor.hasNext()) { System.out.println("age!=1" + cursor.next()); } // 6查询 - 过滤条件 - 20 < i <= 30 query = new BasicDBObject("age", new BasicDBObject("$gt", 20).append("$lte", 30)); cursor = coll.find(query); while (cursor.hasNext()) { System.out.println("20<age<=30" + cursor.next()); } } //更新 public static void update(DBCollection coll) { DBObject search = coll.findOne(new BasicDBObject("_id", "6")); BasicDBObject object = new BasicDBObject().append("$set", new BasicDBObject("password", "1211111")).append("$set", new BasicDBObject("birth", new Date())); /* * upsert when true, inserts a document if no document matches the update query criteria * multi when true, updates all documents in the collection that match the update query criteria, otherwise only updates one */ WriteResult result = coll.update(search, object, true, true); System.out.println("update-result: " + result); } //删除 public static void delete(DBCollection coll) { DBObject search = coll.findOne(new BasicDBObject("_id", "6")); WriteResult result = coll.remove(search); System.out.println("remove-result: " + result); } }3.mongodb 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完全是线程安全的。事实上,你不管怎么样调用都是同一实例,因为他们进行了缓存。
DB db...; db.requestStart(); try { db.requestEnsureConnection(); code.... } finally { db.requestDone(); }在单独写操作上的WriteConcern选项
1,使用类似WriteConcern.SAFE这样的写策略来代替默认策略,这样java驱动会自动首先调用getLastError(),然后才将连接放回连接池。
DBCollection coll...; coll.insert(..., WriteConcern.SAFE);
2,采用上述的requestStart()和requestDone()方式来维持连接不被释放,中间调用getLastError()获取错误信息。
DBCollection coll...; coll.insert(..., WriteConcern.SAFE); DB db...; DBCollection coll...; db.requestStart(); try { coll.insert(...); DBObject err = db.getLastError(); } finally { db.requestDone(); }
4.mongoDB分页的两种方法
mongoDB的分页查询是通过limit(),skip(),sort()这三个函数组合进行分页查询的
下面这个是我的测试数据
db.test.find().sort({"age":1});
第一种方法
查询第一页的数据:db.test.find().sort({"age":1}).limit(2);
查询第二页的数据:db.test.find().sort({"age":1}).skip(2).limit(2);
查询其他页数以此类推。。。
第二种方法
查询第一页的数据:db.test.find().sort({"age":1}).limit(2);
这个是获取第一页最后一条记录的值,然后排除前面的记录,就能获取到新的记录了
总结来说,如果数据量不是很大的话,可以使用第一种方法,毕竟比较简单,如果数据量比较大的话,使用第二种方法比较好,因为这样就可以不用到skip()这个函数,skip跳过太多的记录,效率有点低。