Java連接mongoDB
Java連接MongoDB需要驅動包,個人所用包為mongo-2.10.0.jar.可以在網上下載最新版本.
package org.dennisit.mongodb.study; import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.Mongo; /** * * MongoDBUtil.java * * 功 能: Java連接MongoDB小Demo(連接並插入一條數據) * 類 名: MongoDBUtil * * ver 変更日 角色 擔當者 変更內容 * ────────────────────────────────────────────── * V1.00 2013-1-16 Demo模塊 蘇若年 初版 * * Copyright (c) 2013 dennisit corporation All Rights Reserved. * * Email:<a href="mailto:DennisIT@163.com">發送郵件</a> * */
public class MongoDBUtil { public static void main(String[] args) { Mongo mongo = null; try { //通過連接字符串得到一個數據庫實例的連接
mongo = new Mongo("127.0.0.1",27017); } catch (Exception e) { e.printStackTrace(); } //獲得一個數據庫對象,mydb為數據庫民稱
DB db = mongo.getDB("mydb"); //指定安全授權信息[mydb數據庫的用戶名為mydbusr,密碼為123]
db.authenticate("mydbusr", "123".toCharArray()); //聲明一個collection對象
DBCollection collection = db.getCollection("user"); //聲明一個document文檔對象,用戶存儲數據
BasicDBObject doc = new BasicDBObject(); doc.put("name", "suruonian"); doc.put("email", "dennisit@163.com"); BasicDBObject experience = new BasicDBObject(); experience.put("year of 2012", "i work in hangzhou"); experience.put("year of 2013", "i work in shenzhen"); doc.put("work experience", experience); //調用collection的insert方法,將數據持久化到磁盤上.
collection.insert(doc); System.out.println("test data insert finish "); } } 這時登錄到mydb.查看 > db.user.find({},{_id:0}); { "name" : "suruonian", "email" : "dennisit@163.com", "work experience" : { "year of 2012" : "i work in hangzhou", "year of 2013" : "i work in shenzhen" } } >
mongoDB查詢數據
通過findOne()查詢一條數據
//連接到mongodb //獲得一個數據庫對象,mydb為數據庫民稱
DB db = mongo.getDB("mydb"); //指定安全授權信息[mydb數據庫的用戶名為mydbusr,密碼為123]
db.authenticate("mydbusr", "123".toCharArray()); //聲明一個collection對象
DBCollection collection = db.getCollection("user"); DBObject userdoc= collection.findOne(); System.out.println("查詢到的一條記錄為:" + userdoc);
mongoDB更新數據
將user集合中name為suruonian的name值改成dennisit.
//連接到mongodb //聲明collection對象
DBCollection collection = db.getCollection("user"); //定義一個查詢對象,
DBObject updateAim = new BasicDBObject(); updateAim.put("name", "suruonian"); System.out.println("通過用戶名查找到的對象為:" + collection.findOne(updateAim)); //定義一個更新對象,類似於set語句
DBObject updatedValue = new BasicDBObject(); updatedValue.put("name", "dennisit"); //db.user.update({name:"suruonian"},{$set:{name:dennisit}});
DBObject updateSetValue = new BasicDBObject("$set",updatedValue); //將查詢對象和更新對象作為參數傳給update來完成更新.
collection.update(updateAim, updateSetValue); System.out.println("更新后查詢到的一條記錄為:" + collection.findOne());
mongoDB刪除數據
刪除操作user集合中name為dennisit的用戶
//連接到mongodb //聲明collection對象
DBCollection collection = db.getCollection("user"); //定義一個查詢對象,
DBObject aimObj = new BasicDBObject(); aimObj.put("name", "dennisit"); System.out.println("通過用戶名查找到的對象為:" + collection.findOne(aimObj)); collection.remove(aimObj); System.out.println("刪除后查詢到的一條記錄為:" + collection.findOne());
MonggoDB保證事物的一致性
MongoDB的Java驅動是線程安全的,對於一般的應用,只要一個mongo實例即可.mongo有個內置的連接池(連接池默認可容納10個數據庫連接),在有大量寫和讀的環境中,為了確保在一個session中使用同一個DB時,可以通過DB類的requestStart()方法打開失去控制,待所有業務代碼編寫完畢后,再通過DB類的requestDone()方法結束事物控制.這樣就保證了事物的原子性.
//聲明collection對象
DBCollection collection = db.getCollection("user"); //開始事務控制
db.requestStart(); //事務相關操作 //結束事物控制
db.requestDone();
MongoDB庫級別操作
獲取連接的IP地址
mongo.getAddress();
列出所有數據庫[此操作只針對超級用戶]
mongo.getDatabaseNames();
刪除指定數據庫[此操作只針對超級用戶]
mongo.dropDatabase("testdb");
代碼演示
public static void main(String[] args) { Mongo mongo = null; try { //通過連接字符串得到一個數據庫實例的連接
mongo = new Mongo("127.0.0.1",27017); } catch (Exception e) { e.printStackTrace(); } //連接超級用戶
DB db = mongo.getDB("admin"); //指定安全授權信息[超級用戶的用戶名為root,密碼為root123]
db.authenticate("root", "root123".toCharArray()); //getAddress方法獲取IP和端口
System.out.println("當前連接的IP和端口為:" + mongo.getAddress()); //列出所有數據庫,此操作只針對超級用戶
System.out.println("系統中的所有數據庫為:" + mongo.getDatabaseNames()); //刪除數據庫,此操作只針對超級用戶
mongo.dropDatabase("testdb"); System.out.println("系統中的所有數據庫為:" + mongo.getDatabaseNames()); } 控制台輸出信息 當前連接的IP和端口為:127.0.0.1:27017 系統中的所有數據庫為:[admin, mydb, testdb, local, test] 系統中的所有數據庫為:[admin, mydb, local, test]
MongoDB對用戶的操作
為連接的數據庫添加用戶
DB db = mongo.getDB("mydb"); db.addUser("username", "password".toCharArray(),true);
參數說明
第一個參數為要條件的用戶名
第二個參數為要添加的用戶對應的訪問口令
第三個參數為readOnly,代表用戶的權限,為true表示值讀權限,為false表示為讀/寫權限.默認為false.不傳參代表默認.
刪除某個用戶
DB db = mongo.getDB("mydb"); db.removeUser("username");
參數說明
傳入的參數為要刪除的用戶名.要刪除的用戶必須應是已存在的.
MongoDB對集合collection的操作
Collection是MongoDB中存儲數據的最小單元.
列出連接數據庫下的所有集合
DB db = mongo.getDB("mydb"); //指定安全授權信息[超級用戶的用戶名為root,密碼為root123]
db.authenticate("mydbusr", "123".toCharArray()); //列出mydb數據庫中的所有collection
Set<String> collets = db.getCollectionNames(); for(String str : collets){ System.out.println(str); }
判斷某個collection是否存在
//判斷user集合是否存在,返回值為boolean類型
System.out.println(db.collectionExists("user"));
新建collection
Java可以通過DB類的createCollection(String name, DBObject option)方法新建集合
參數說明
第一個參數表示創建的collection的名字
第二個參數決定了是否創建的是Capped Collection.
//創建非CappedCollection對象,false表示不是一個CappedCollection
DBObject optial = new BasicDBObject().append("capped", false); //顯示創建非CappedCollection
db.createCollection("nocapped", optial); System.out.println(db.getCollection("nocapped").getStats().toString()); //創建CappedCollection對象,true表示是一個CappedCollection
DBObject opt = new BasicDBObject().append("capped", true).append("max", 5); db.createCollection("iscapped", opt); System.out.println(db.getCollection("iscapped").getStats().toString()); //使用isCapped()判斷是否為CappedCollection
System.out.println(db.getCollection("nocapped").isCapped()); //false
System.out.println(db.getCollection("iscapped").isCapped()); //true
刪除collection
通過DBCollection的drop()方法刪除集合.
DBCollection collect = db.getCollection("iscapped"); collect.drop(); //刪除iscapped集合
計算document數量
//控制台插入測試數據for (i=1; i<=5;i++){ db.user.insert( {name:"user"+i , age: i+4*5 } ); }
DBCollection collectuser = db.getCollection("user"); System.out.println("集合" + collectuser + "下共有" + collectuser.getCount() + "條記錄"); BasicDBObject obj = new BasicDBObject(); BasicDBObject gtTag = new BasicDBObject(); gtTag.put("$gt", 23); //db.user.find({age:{$gt:23}});
obj.put("age", gtTag); System.out.println("集合" + collectuser + "下年齡大於25的共有" + collectuser.getCount(obj) + "條記錄"); 控制台輸出 集合user下共有5條記錄 集合user下年齡大於25的共有2條記錄
通過游標獲取所有document
Java可以通過游標DBCursor的方式來獲取每一條document.
DBCollection collection = db.getCollection("user"); //用游標獲取所有數據
DBCursor cur = collection.find(); while(cur.hasNext()){ System.out.println(cur.next()); } 也可以查詢部分,如部分顯示:DBCursor cur = collection.find().limit(3);
對索引的操做
創建索引
Java可以通過DBCollection類的createIndex(DBObject keys)方法創建索引,它接收一個DBObject類型的參數“keys”用於表明在哪些列上創建索引.
DBCollection collection = db.getCollection("user"); //在user集合的name列上創建索引
collection.createIndex(new BasicDBObject("name",1)); 可以通過db.user.getIndexes();查看索引信息
獲取索引
DBCollection類的getIndexInfo();
DBCollection collection = db.getCollection("user"); //獲取集合中的所有索引信息
List<DBObject> list = collection.getIndexInfo(); for(DBObject var : list){ System.out.println(var); } 類似於 db.user.getIndexes();
刪除索引
DBCollection的dropIndexes()刪除當前集合中的所有索引.
DBCollection collection = db.getCollection("user"); //刪除集合中的指定索引信息,刪除name索引,1表示刪除為真
collection.dropIndex(new BasicDBObject("name",1)); //刪除該集合中所有索引[_id索引不支持刪除]
collection.dropIndexes(); 可以通過db.user.getIndexKeys();查看user集合中的索引
Java對MongoDB的高級查詢
使用QueryBuilder查詢構造器對MongoDB進行高級查詢
SQL語句: select * from user where username = ‘user3’; MongoDB: db.user.find( { name:"user3"} ); Java代碼: DBCollection collection = db.getCollection("user"); //查詢用戶名為user3的用戶
DBObject query = new QueryBuilder().put("name").is("user3").get(); DBCursor cur = collection.find(query); while(cur.hasNext()){ System.out.println(cur.next()); } 輸出結果: { "_id" : { "$oid" : "50f6d250778eafb6ef5bcee7"} , "name" : "user3" , "age" : 23.0}
notEquals不等於
查詢user集合中用戶名name值不等於user3的用戶
SQL語句: select * from user where username != ‘user3’; MongoDB: db.user.find( { name:{$ne:"user3"} } ); Java代碼: DBCollection collection = db.getCollection("user"); //查詢用戶名不為user3的用戶
DBObject query = new QueryBuilder().put("name").notEquals("user3").get(); DBCursor cur = collection.find(query); while(cur.hasNext()){ System.out.println(cur.next()); } 輸出結果: { "_id" : { "$oid" : "50f6d250778eafb6ef5bcee5"} , "name" : "user1" , "age" : 21.0} { "_id" : { "$oid" : "50f6d250778eafb6ef5bcee6"} , "name" : "user2" , "age" : 22.0} { "_id" : { "$oid" : "50f6d250778eafb6ef5bcee8"} , "name" : "user4" , "age" : 24.0} { "_id" : { "$oid" : "50f6d250778eafb6ef5bcee9"} , "name" : "user5" , "age" : 25.0}
greaterThan大於
查詢user集合中age大於22的用戶
SQL語句: select * from user where age > 22; MongoDB: db.user.find( { age:{$gt:22} } ); QueryBuilder構造: DBObject query = new QueryBuilder().put("age").greaterThan(22).get();
greaterThanEquals大於等於
查詢user集合中age大於等於22的用戶
SQL語句: select * from user where age >= 22; MongoDB: db.user.find( { age:{$gte:22} } ); QueryBuilder構造: DBObject query = new QueryBuilder().put("age").greaterThanEquals(22).get();
lessThan小於
查詢user集合中age小於22的用戶
SQL語句: select * from user where age < 22; MongoDB: db.user.find( { age:{$lt:22} } ); QueryBuilder構造: DBObject query = new QueryBuilder().put("age").lessThan(22).get();
lessThanEquals小於等於
查詢user集合中age小於等於22的用戶
SQL語句: select * from user where age <= 22; MongoDB: db.user.find( { age:{$lte:22} } ); QueryBuilder構造: DBObject query = new QueryBuilder().put("age").lessThanEquals(22).get();
In范圍內
查詢user集合中age在23或24的記錄
SQL語句: select * from user where age in (23,24); MongoDB: db.user.find( { age:{$in:[23,24]} } ); Java代碼: DBCollection collection = db.getCollection("user"); //查詢user集合中age為23或者24的用戶
int[] inList = {23,24}; DBObject query = new QueryBuilder().put("age").in(inList).get(); DBCursor cur = collection.find(query); while(cur.hasNext()){ System.out.println(cur.next()); }
notIn范圍外
查詢user集合中age不是23或24的記錄
SQL語句: select * from user where age not in (23,24); MongoDB: db.user.find( { age:{$nin:[23,24]} } ); Java代碼: DBCollection collection = db.getCollection("user"); //查詢user集合中age為23或者24的用戶
int[] inList = {23,24}; DBObject query = new QueryBuilder().put("age").notIn(inList).get(); DBCursor cur = collection.find(query);
and邏輯與
查詢user集合中age大於22並且性別為”man“的用戶
SQL語句: select * from user where sex = ‘man’ and age > 20; MongoDB: db.user.find({sex:"man",age:{$gt:20}}); Java代碼: //查詢user集合中age大於22並且性別為”man“的用戶
DBObject query = new QueryBuilder().put("sex").is("man").and("age").greaterThan(20).get();
正則表達式
查詢name以user開頭的記錄
SQL語句: select * from user where name like ‘user%’; MongoDB: db.user.find({name:/^user.*/}); Java代碼: DBCollection collection = db.getCollection("user"); Pattern pattern = Pattern.compile("^user"); BasicDBObject query = new BasicDBObject("name",pattern);
分頁查詢
mongoDB中通過skip()和limit()結合實現分頁
public static void main(String[] args) { Mongo mongo = null; try { //通過連接字符串得到一個數據庫實例的連接
mongo = new Mongo("127.0.0.1",27017); } catch (Exception e) { e.printStackTrace(); } //連接超級用戶
DB db = mongo.getDB("mydb"); //指定安全授權信息[超級用戶的用戶名為root,密碼為root123]
db.authenticate("mydbusr", "123".toCharArray()); int perNum = 10; //每頁顯示的數目
int count = 0; //數據庫中總共記錄數目
int pageNum = 0; //分頁后的頁數
DBCollection collection = db.getCollection("user"); count = (int)collection.getCount(); //總共記錄數
pageNum = (count-1)/perNum + 1; //計算總共頁數
System.out.println("數據庫"+collection+"中共有"+count+"條記錄,每頁顯示"+perNum+"條記錄,可顯示"+pageNum+"頁"); //循環分頁打印
for(int i=0; i<pageNum; i++){ System.out.println("------------第" + (i+1) + "頁數據------------"); DBCursor cur = collection.find().skip(i*perNum).limit(perNum); while(cur.hasNext()){ System.out.println(cur.next()); } } }
Java操作GridFS
插入數據
使用GridFS類的createFile(File file)方法可以將大文件保存到MongoDB中,該方法接收一個參數,表示本地文件路徑
public static void main(String[] args) { Mongo mongo = null; try { mongo = new Mongo("127.0.0.1",27017); } catch (Exception e) { // TODO: handle exception
} DB db = mongo.getDB("mydb"); db.authenticate("mydbusr", "123".toCharArray()); File zipFile = new File("D:/freemarker源碼.rar"); //創建文件對象 //將文件存放到file數據庫中
GridFS gfs = new GridFS(db,"file"); //創建大文件對象輸入流
GridFSInputFile gfsFile = null; try { //將本地文件存儲到mongo中
gfsFile = gfs.createFile(zipFile); } catch (Exception e) { e.printStackTrace(); } //設置存儲的文件名
gfsFile.setFilename("demozip"); gfsFile.save(); } 在mydb數據庫下查看存儲的文件信息 > db mydb > show collections; file.chunks file.files system.indexes system.users user > db.file.files.findOne(); { "_id" : ObjectId("50f780a7de886482c92a56c9"), "chunkSize" : NumberLong(262144), "length" : NumberLong(83711), "md5" : "51f235ccf838511eb0f53633dbca22b3", "filename" : "demozip", "contentType" : null, "uploadDate" : ISODate("2013-01-17T04:40:07.240Z"), "aliases" : null }
查詢數據
因為上傳了一個zip文檔,為了方便觀察,使用GridFS類的findOne(DBObject query)方法,按文件名查找數據庫中的GridFS對象信息,該方法結束1個參數,代表查詢條件.
DB db = mongo.getDB("mydb"); db.authenticate("mydbusr", "123".toCharArray()); //將文件存放到file數據庫中
GridFS gfs = new GridFS(db,"file"); //查詢GridFS數據,按照文件名查詢 db.file.files.findOne({filename:"demozip"});
GridFSDBFile zipfile = gfs.findOne("demozip"); System.out.println(zipfile);
讀取並保存數據
首先用find或者findOne方法找到GridFS對象,再用writeTo方法將數據寫到本地.
DB db = mongo.getDB("mydb"); db.authenticate("mydbusr", "123".toCharArray()); GridFS gfs = new GridFS(db,"file"); //查詢GridFS數據,按照文件名查詢 db.file.files.find({filename:"demozip"});
GridFSDBFile zipfile = gfs.findOne("demozip"); System.out.println("服務器端文件MD5值為:" + zipfile.getMD5()); try { //將讀取到的文件寫到本地
zipfile.writeTo("E:/downgidfs.zip"); } catch (Exception e) { // TODO: handle exception
e.printStackTrace(); } 控制台輸出:服務器端文件MD5值為:51f235ccf838511eb0f53633dbca22b3 驗證下載到的文件的MD5 E:\>md5sum downgidfs.zip 51f235ccf838511eb0f53633dbca22b3 *downgidfs.zip
刪除數據
Java中使用remove(DBObject query)來實現移除數據
GridFS gfs = new GridFS(db,"file"); //查詢GridFS數據,按照文件名查詢 db.file.files.find({filename:"demozip"});
GridFSDBFile zipfile = gfs.findOne("demozip"); //刪除查詢到的GridFS數據
gfs.remove(zipfile);
轉載請注明出處:[http://www.cnblogs.com/dennisit/archive/2013/01/29/2881006.html]