1. 程式人生 > >MongoDB儲存Java物件的三種方法

MongoDB儲存Java物件的三種方法

MongoDB有三種方法來儲存java物件,一種是通過類實現DBObject介面,一種是利用spring-mongodb工具的物件對映功能,把java物件轉換成MongoDB的BSON文件,一種是通過序列化類例項,轉成二進位制儲存,MongoDB是支援二進位制的資料格式的。下面分別介紹三種方法:

1.實現DBObject介面

用這種方法的話類還是個DBObject,存取物件屬性都要用到put和get方法,感覺很不方便,這個我們可以參考官網的例子:

  1. public class Tweet implements DBObject {  
  2.     /* ... */  
  3. }     
  1. Tweet myTweet = new
     Tweet();  
  2. myTweet.put("user", userId);  
  3. myTweet.put("message", msg);  
  4. myTweet.put("date"new Date());  
  5. collection.insert(myTweet);  
  1. collection.setObjectClass(Tweet.class);  
  2. Tweet myTweet = (Tweet)collection.findOne();  
  1. Tweet myTweet = (Tweet)collection.findOne();  
  2. myTweet.put("message", newMsg);  
  3. collection.save(myTweet);  

可能大家已經發現,這種方法只適用於新的類,如果是原有的類這樣做就不合適了。

2.使用spring-mongodb

使用spring-mongodb持久化物件有一個不好的地方就是它把目前還不支援把實體類的欄位通過二進位制的方式儲存,而是把類中的欄位都儲存為欄位的格式,如果一個類裡面有其它封閉類作為屬性,則從mongodb中讀取時就要經過很多反射來對映到實體類上。為什麼會有這樣的需求呢?我是在把cas的ticket儲存端換成mongodb時需要的,它有提供jpa的儲存層,我們知道關係資料庫中有種LOB的型別是用來儲存二進位制資料的,直接通過@LOB標註就可以,我覺得spring-mongodb也應該加個二進位制儲存的註解功能,有時間的話自己實現個。

3.序列化類例項,轉成二進位制儲存

接下來就說一下通過二進位制儲存類的方法,以下均使用官方java客戶端操作:

序列化儲存,主要用到ObjectOutputStream:

  1. DBObject dbo = new BasicDBObject();  
  2.     ByteArrayOutputStream outputStream = new ByteArrayOutputStream();  
  3.     ObjectOutputStream out = new ObjectOutputStream(outputStream);  
  4.     out.writeObject(yourJavaObject);  
  5.     dbo.put("JavaObject", outputStream.toByteArray());  
  6.     out.close();  
  7.     outputStream.close();  
  8.     collection.insert(dbo);  

反序列化讀取,主要用到ObjectInputStream:

  1. DBObject object = collection.findOne();  
  2.     byte[] javaObjectByte = (byte[]) object.get("JavaObject");  
  3.     InputStream inputStream = new ByteArrayInputStream(javaObjectByte);  
  4.     ObjectInputStream in = new ObjectInputStream(inputStream);  
  5.     JavaObject javaObject = (Service) in.readObject();  
  6.     in.close();  
  7.     inputStream.close();  
//序列化類例項,轉成二進位制儲存
	public void insertByte(Source source) throws IOException{
		DBObject dbo = new BasicDBObject();  
	    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();  
	    ObjectOutputStream out = new ObjectOutputStream(outputStream);  
	    out.writeObject(source);  
	    dbo.put("JavaObject", outputStream.toByteArray());  
	    out.close();  
	    outputStream.close();  
	    mongoTemplate.insert(dbo, "source");
	}