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);
}
}
} |