Mongodb官方提供的Java驅動,儲存與讀取,需要的者是DBObject對象,這是一個介面,實現put,get等方法,跟map類似,如果我們要直接把普通的java對象儲存到mongodb,就需要先轉換成DBObject對象,或者直接實現DBObject介面,操作起來相當複雜。還好,monodb驅動帶了把json轉換成DBObject對象的功能,加上Google的Gson,就可以實現把普通的對象儲存到mongodb中。如果要從mogodb中讀出對象,反過來操作即可,但有一點需要注意的是,mongodb的文檔沒有固定的欄位,所以用Gson轉換,可能因為各個文件屬性不同,轉出的對象屬性都是空的,要確保在插入時都是插入同一個類的對象。
下面的例子是把User對象插入到Mongodb中,並讀出來
User.java:
| 代碼如下 |
複製代碼 |
package com.mongo; public class User { String name; int age; Oid _id; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } /** * Mongodb會自動產生ObjectId * @author fhp * */ public class Oid{ String $oid; public String get$oid() { return $oid; } public void set$oid(String $oid) { this.$oid = $oid; } } } |
Main.java:
| 代碼如下 |
複製代碼 |
package com.mongo; import java.net.UnknownHostException; import com.google.gson.Gson; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.DBObject; import com.mongodb.MongoClient; import com.mongodb.util.JSON; public class Main { /** * @param args * @throws UnknownHostException */ public static void main(String[] args) throws UnknownHostException { // TODO Auto-generated method stub MongoClient mongoClient = new MongoClient(); DB psdoc = mongoClient.getDB("psdoc"); DBCollection user=psdoc.getCollection("user"); User u1=new User(); u1.setAge(20); u1.setName("ssss"); Gson gson=new Gson(); //轉換成json字串,再轉換成DBObject對象 DBObject dbObject = (DBObject) JSON.parse(gson.toJson(u1)); //插入資料庫 user.insert(dbObject); DBCursor cursor=user.find(); while(cursor.hasNext()) { DBObject obj=cursor.next(); //反轉 User u=gson.fromJson(obj.toString(), User.class); System.out.println(u.name); } } } |
為了方便,可以直接把Gson整合進驅動裡,直接修改驅動的原始碼
com.mongodb.DBCollection.java:
新增方法:
| 代碼如下 |
複製代碼 |
/** * 把普通的對象寫入資料庫 * * @param obj * @return */ public WriteResult insert(Object obj) { Gson gson = new Gson(); DBObject dbObject = (DBObject) JSON.parse(gson.toJson(obj)); gson=null; return insert(dbObject); } com.mongodb.DBCursor.java: |
新增方法
| 代碼如下 |
複製代碼 |
/** * 從資料庫讀出對象 * @param obj * @param clazz * @return */ public <T> T nextObj(Class<T> clazz) { _checkType( CursorType.ITERATOR ); Gson gson=new Gson(); T u=gson.fromJson(_next().toString(), clazz); gson=null; return u; } |
修改後的調用方法:
| 代碼如下 |
複製代碼 |
Main.java: package com.mongo; import java.net.UnknownHostException; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.MongoClient; public class Main { /** * @param args * @throws UnknownHostException */ public static void main(String[] args) throws UnknownHostException { // TODO Auto-generated method stub MongoClient mongoClient = new MongoClient(); DB psdoc = mongoClient.getDB("psdoc"); DBCollection user=psdoc.getCollection("user"); User u1=new User(); u1.setAge(20); u1.setName("ssss"); //直接插入對象 user.insert(u1); DBCursor cursor=user.find(); while(cursor.hasNext()) { //傳入類參數,反回該類對象 User u=cursor.nextObj(User.class); System.out.println(u.name); } } } |