Morphia開發簡介


1.  什么是Morphia

Morphia是一個開放源代碼的對象關系映射框架,它對MongoDB數據庫 java版驅動進行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱MongoDB數據庫,也讓Java程序員可以從復雜數據庫設計中脫離出來,從而將更多的精力投入到業務邏輯中去Morphia是一個輕量級的類型安全的Java對象to/from MongoDB ,具有以下特征:

·  易於使用,而且非常輕巧 ,每種類型使用一次反射

·  數據存儲(DataStore  DAO<T,V> 訪問抽象,或自己實現...

·  使用運行時驗證的類型安全 Type-safe)和 Fluent 查詢(Query) 支持

·  基於注解的行為映射,無XML文件

·  擴展  Validationjsr303 ,以及SLF4J日志

·  生命周期方法/事件(Lifecycle Method/Event 支持

·  可與GuiceSpring和其它DI框架很好整合或協作

·  很多擴展點(新的注解,轉換器,行為映射,日志等)

·  不存儲Null/Empty值(默認)

·  GWT支持(實體僅為POJO- GWT忽略注釋)

·  允許原始類型、void toObject(DBObject) DBObject  fromObject(Object) fromObject的高級映射器

2.  Morphia開發環境配置

首先,從http://code.google.com/p/morphia/downloads/list下載Morphia開發包,最新版為morphia-0.99.jar然后從http://www.mongodb.org/downloads 下載MongoDB數據庫 java版驅動最新版為mongo-2.7.2.jar,直接將這兩個jarinclude到項目中即可,當然在程序的運行前應保證MongoDB數據庫后台服務進程已經啟動。(MongoDB數據庫的具體安裝使用請參考其它相關資料),要求使用Java SE 5或更高版本。

3.  Morphia Java 注釋使用

Morphia使用Java的特性來描述Java對象如何被持久化到MongoDB數據庫中去。以下是Morphia比較常用的注

@Id

@Id 注釋指示 Morphia 哪個字段用作文檔 ID。如果試圖持久保存對象(其 @Id 注釋的字段為 null),則 Morphia 會自動生成 ID 值。

@Entity

@Entity 注釋是必需的。其聲明了在專用MongoDB集合上該類作為文檔將持久保存。在默認情況下,Morphia 使用類名稱來命名集合。

@Embedded

@Embedded 注釋說明 Morphia將此對象實例嵌入到另一個對象中去。而不單獨的放到一個MongoDB 集合

@Reference

 @Reference 注釋說明對象是對另外一個集合中的文檔的引用。在從 MongoDB 集合中加載對象時,Morphia 遵循着這些引用來建立對象關系

@Indexed

類屬性標記@Indexed注釋, 表明為此屬性增加索引。

@Property

類屬性標記@ Property注釋, 表明為此屬性在MongoDB數據庫取一個別名。

@Transient

類屬性標記@Transient注釋則表明這個字段將不被持久化到數據庫。

4.  Morphia編程模型

本節上通過定義一個簡單的類以及一些操作代碼片段來說明Morphia功能的編程模型,使得我們可以從總體上了解Morphia開發。

1.  定義被持久類

@Entity

class MyEntity {

@Id

ObjectId id;

String name;

}

2.  初始化morphia

Mongo mongo = new Mongo("localhost");//連接到本地mongoDB數據庫

Morphia morphia = new Morphia();

morphia.mapPackage("MyEntity");//告訴Morphia映射哪些類

Datastore ds = morphia.createDatastore(mongo ,"myDB");//創建名為“myDB”數據庫,mongo最好使用單實例模式

ds.ensureIndexes(); //在標記為@Id的類屬性上創建索引

ds.ensureCaps(); //設置默認的mongoDB集合容量

3.  保存被持久化類

MyEntity e = ...;

ds.save(e);//將MyEntity對象持久化到mongoDB數據庫中

4.  查詢

MyEntity e =ds.find(MyEntity.class).get();//通過類型取的第一個數據項

MyEntity e = ds.find(MyEntity.class).field("name")

.equal("someName").get();

5.  Datasotre接口

Datastore接口把Java對象保存到MongoDB或從MongoDB中訪問Java對象提供了安全類型的方法。它提供了get/find/save/delete方法為你操作Java對象。

 

5.1  Get方法

 Get方法返回一個實體對象通過@Idget方法只是find(...)方法的一個精簡版,通過ID訪問。會返回一個實體對象,或者null如果沒有找到的話。

Datastore ds = ...

Hotel hotel = ds.get(Hotel.class, hotelId);

5.2  Find方法

  find方法只是對Query的一個輕量級的封裝。 作為封裝它將返回一個Query,它實現Iterable<T>QueryResults接口。

 

//在循環中使用

for(Hotel hotel : ds.find(Hotel.class, "stars >", 3))

   print(hotel);

//作為一個List返回

List<Hotel> hotels = ds.find(Hotel.class, "stars >", 3).asList();

//對結果排序

List<Hotel> hotels = ds.find(Hotel.class, "stars >", 3).sort("-stars").asList();

//返回第一個符合條件的結果

Hotel gsHotel = ds.find(Hotel.class, "name", "Grand Sierra").get();

這里是有效的操作符列表["=", "==", "!=", "<>", ">", "<", ">=", "<=", "in", "nin", "all", "size", "exists"]如果沒有指定操作符默認使用"=",  就像上面的例子,"="“==”是等價的表示相等,"!=""<>"是等價的表示不等。

5.3   Save方法

      大部分對MongoDB數據庫操作的工作Morphia映射解析工作已由Morphia完成。本方法直截了當,只要我們在定義持久化類時使用好Morphia 注釋即可。

Hotel hotel = new Hotel();

ds.save(hotel);

//@Id 屬性如果沒有指定的話,將被自動生成, 

ObjectId id = hotel.getId();

5.4   Delete方法

它已很好的自我解釋,delete方法將MongoDB數據庫刪除數據項基於一個查詢id其它條件

Datastore ds = ...

//通過指定主鍵Id刪除數據項

ds.delete(Hotel.class, "Grand Sierra Resort");

//基於一個查詢,刪除數據項

ds.delete(ds.createQuery(Hotel.class).filter("pendingDelete", true));

morphia支持mongoDB以原子方式做一些操作功能。刪除一個實體,並且同時返回要刪除的項。 FindAndDelete方法首先查詢要刪除的項,並且刪除。

5.5  Update方法

Updates應用在服務器上並且允許復雜但非常有效的修改。 假設要跟蹤一個用戶的最近網站登錄信息。在任何成功登錄網站的用戶都修改時間,但是不必加載此用戶的信息然后在重新保存整個對象信息。而是相反地,你可以局部的修改並且執行一個有效的修改。

@Entity

class User

{

   @Id private ObjectId id;

   private long lastLogin;

   //... 其它屬性

   private Query<User> queryToFindMe() {

return datastore.createQuery(User.class)

.field(Mapper.ID_KEY).equal(id);

   }

   public void loggedIn(){

      long now = System.currentTimeMillis();

      UpdateOperations<User>  ops  = datastore.

createUpdateOperations(User.class).set("lastLogin", now);

      ds.update(queryToFindMe(), ops);

      lastLogin = now;

   }

}

首先,從http://code.google.com/p/morphia/downloads/list下載Morphia開發包,最新版為morphia-0.99.jar然后從http://www.mongodb.org/downloads 下載MongoDB數據庫 java版驅動最新版為mongo-2.7.2.jar,直接將這兩個jarinclude到項目中即可,當然在程序的運行前應保證MongoDB數據庫后台服務進程已經啟動。(MongoDB數據庫的具體安裝使用請參考其它相關資料),要求使用Java SE 5或更高版本。

1.  Morphia Java 注釋使用

Morphia使用Java的特性來描述Java對象如何被持久化到MongoDB數據庫中去。以下是Morphia比較常用的注

@Id

@Id 注釋指示 Morphia 哪個字段用作文檔 ID。如果試圖持久保存對象(其 @Id 注釋的字段為 null),則 Morphia 會自動生成 ID 值。

@Entity

@Entity 注釋是必需的。其聲明了在專用MongoDB集合上該類作為文檔將持久保存。在默認情況下,Morphia 使用類名稱來命名集合。

@Embedded

@Embedded 注釋說明 Morphia將此對象實例嵌入到另一個對象中去。而不單獨的放到一個MongoDB 集合

@Reference

 @Reference 注釋說明對象是對另外一個集合中的文檔的引用。在從 MongoDB 集合中加載對象時,Morphia 遵循着這些引用來建立對象關系

@Indexed

類屬性標記@Indexed注釋, 表明為此屬性增加索引。

@Property

類屬性標記@ Property注釋, 表明為此屬性在MongoDB數據庫取一個別名。

@Transient

類屬性標記@Transient注釋則表明這個字段將不被持久化到數據庫。

2.  Morphia編程模型

本節上通過定義一個簡單的類以及一些操作代碼片段來說明Morphia功能的編程模型,使得我們可以從總體上了解Morphia開發。

1.  定義被持久類

@Entity

class MyEntity {

@Id

ObjectId id;

String name;

}

2.  初始化morphia

Mongo mongo = new Mongo("localhost");//連接到本地mongoDB數據庫

Morphia morphia = new Morphia();

morphia.mapPackage("MyEntity");//告訴Morphia映射哪些類

Datastore ds = morphia.createDatastore(mongo ,"myDB");//創建名為“myDB”數據庫,mongo最好使用單實例模式

ds.ensureIndexes(); //在標記為@Id的類屬性上創建索引

ds.ensureCaps(); //設置默認的mongoDB集合容量

3.  保存被持久化類

MyEntity e = ...;

ds.save(e);//將MyEntity對象持久化到mongoDB數據庫中

4.  查詢

MyEntity e =ds.find(MyEntity.class).get();//通過類型取的第一個數據項

MyEntity e = ds.find(MyEntity.class).field("name")

.equal("someName").get();

3.  Datasotre接口

Datastore接口把Java對象保存到MongoDB或從MongoDB中訪問Java對象提供了安全類型的方法。它提供了get/find/save/delete方法為你操作Java對象。

 

5.1  Get方法

 Get方法返回一個實體對象通過@Idget方法只是find(...)方法的一個精簡版,通過ID訪問。會返回一個實體對象,或者null如果沒有找到的話。

Datastore ds = ...

Hotel hotel = ds.get(Hotel.class, hotelId);

5.2  Find方法

  find方法只是對Query的一個輕量級的封裝。 作為封裝它將返回一個Query,它實現Iterable<T>QueryResults接口。

 

//在循環中使用

for(Hotel hotel : ds.find(Hotel.class, "stars >", 3))

   print(hotel);

//作為一個List返回

List<Hotel> hotels = ds.find(Hotel.class, "stars >", 3).asList();

//對結果排序

List<Hotel> hotels = ds.find(Hotel.class, "stars >", 3).sort("-stars").asList();

//返回第一個符合條件的結果

Hotel gsHotel = ds.find(Hotel.class, "name", "Grand Sierra").get();

這里是有效的操作符列表["=", "==", "!=", "<>", ">", "<", ">=", "<=", "in", "nin", "all", "size", "exists"]如果沒有指定操作符默認使用"=",  就像上面的例子,"="“==”是等價的表示相等,"!=""<>"是等價的表示不等。

5.3   Save方法

      大部分對MongoDB數據庫操作的工作Morphia映射解析工作已由Morphia完成。本方法直截了當,只要我們在定義持久化類時使用好Morphia 注釋即可。

Hotel hotel = new Hotel();

ds.save(hotel);

//@Id 屬性如果沒有指定的話,將被自動生成, 

ObjectId id = hotel.getId();

5.4   Delete方法

它已很好的自我解釋,delete方法將MongoDB數據庫刪除數據項基於一個查詢id其它條件

Datastore ds = ...

//通過指定主鍵Id刪除數據項

ds.delete(Hotel.class, "Grand Sierra Resort");

//基於一個查詢,刪除數據項

ds.delete(ds.createQuery(Hotel.class).filter("pendingDelete", true));

morphia支持mongoDB以原子方式做一些操作功能。刪除一個實體,並且同時返回要刪除的項。 FindAndDelete方法首先查詢要刪除的項,並且刪除。

5.5  Update方法

Updates應用在服務器上並且允許復雜但非常有效的修改。 假設要跟蹤一個用戶的最近網站登錄信息。在任何成功登錄網站的用戶都修改時間,但是不必加載此用戶的信息然后在重新保存整個對象信息。而是相反地,你可以局部的修改並且執行一個有效的修改。

@Entity

class User

{

   @Id private ObjectId id;

   private long lastLogin;

   //... 其它屬性

   private Query<User> queryToFindMe() {

return datastore.createQuery(User.class)

.field(Mapper.ID_KEY).equal(id);

   }

   public void loggedIn(){

      long now = System.currentTimeMillis();

      UpdateOperations<User>  ops  = datastore.

createUpdateOperations(User.class).set("lastLogin", now);

      ds.update(queryToFindMe(), ops);

      lastLogin = now;

   }

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM