1. 什么是Morphia

Morphia是一个开放源代码的对象关系映射框架,它对MongoDB数据库 java版驱动进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵MongoDB数据库,也让Java程序员可以从复杂数据库设计中脱离出来,从而将更多的精力投入到业务逻辑中去。Morphia是一个轻量级的类型安全的Java对象to/from MongoDB库,具有以下特征:

· 它易于使用,而且非常轻巧 ,每种类型使用一次反射。

· 数据存储(DataStore) 和 DAO<T,V> 访问抽象,或自己实现...

· 使用运行时验证的类型安全 (Type-safe)和 Fluent 查询(Query) 支持

· 基于注解的行为映射,无XML文件

· 扩展 : Validation(jsr303) ,以及SLF4J日志

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

· 可与Guice、Spring和其它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,直接将这两个jar包include到项目中即可,当然在程序的运行前应保证MongoDB数据库后台服务进程已经启动。(MongoDB数据库的具体安装使用请参考其它相关资料),要求使用Java SE 5或更高版本。

3. Morphia 中Java 注释使用

Morphia使用Java注释的特性来描述Java对象如何被持久化到MongoDB数据库中去。以下是Morphia比较常用的注释。

l @Id

@Id 注释指示 Morphia 哪个字段用作文档 ID。如果试图持久保存对象(其 @Id 注释的字段为 null),则 Morphia 会自动生成 ID 值。

l @Entity

@Entity 注释是必需的。其声明了在专用MongoDB集合上该类作为文档将持久保存。在默认情况下,Morphia 使用类名称来命名集合。

l @Embedded

@Embedded 注释说明 Morphia将此对象实例嵌入到另一个对象中去。而不单独的放到一个MongoDB 集合。

l @Reference

@Reference 注释说明对象是对另外一个集合中的文档的引用。在从 MongoDB 集合中加载对象时,Morphia 遵循着这些引用来建立对象关系。

l @Indexed

类属性标记@Indexed注释, 表明为此属性增加索引。

l @Property

类属性标记@ Property注释, 表明为此属性在MongoDB数据库取一个别名。

l @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方法返回一个实体对象通过@Id。get方法只是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,直接将这两个jar包include到项目中即可,当然在程序的运行前应保证MongoDB数据库后台服务进程已经启动。(MongoDB数据库的具体安装使用请参考其它相关资料),要求使用Java SE 5或更高版本。

1. Morphia 中Java 注释使用

Morphia使用Java注释的特性来描述Java对象如何被持久化到MongoDB数据库中去。以下是Morphia比较常用的注释。

l @Id

@Id 注释指示 Morphia 哪个字段用作文档 ID。如果试图持久保存对象(其 @Id 注释的字段为 null),则 Morphia 会自动生成 ID 值。

l @Entity

@Entity 注释是必需的。其声明了在专用MongoDB集合上该类作为文档将持久保存。在默认情况下,Morphia 使用类名称来命名集合。

l @Embedded

@Embedded 注释说明 Morphia将此对象实例嵌入到另一个对象中去。而不单独的放到一个MongoDB 集合。

l @Reference

@Reference 注释说明对象是对另外一个集合中的文档的引用。在从 MongoDB 集合中加载对象时,Morphia 遵循着这些引用来建立对象关系。

l @Indexed

类属性标记@Indexed注释, 表明为此属性增加索引。

l @Property

类属性标记@ Property注释, 表明为此属性在MongoDB数据库取一个别名。

l @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方法返回一个实体对象通过@Id。get方法只是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;

}

}

Morphia开发简介的更多相关文章

  1. Scrum敏捷开发简介

    Agile 敏捷开发实践中,强调团队的自我管理.在 Scrum 中,自我团队管理体现在每天的 Scrum 会议中和日常的协同工作,在每天的 Scrum 例会中,团队成员一般回答一下几个问题 : 昨天完 ...

  2. Kendo UI 移动应用开发简介

    Kendo UI 移动应用开发简介 Kendo UI 支持开发 Web 应用,前面介绍的 SPA,也支持开发移动应用,至于使用 HTML5 + JavaScript + CSS 开发移动是不是一个好的 ...

  3. Webservice WCF WebApi 前端数据可视化 前端数据可视化 C# asp.net PhoneGap html5 C# Where 网站分布式开发简介 EntityFramework Core依赖注入上下文方式不同造成内存泄漏了解一下? SQL Server之深入理解STUFF 你必须知道的EntityFramework 6.x和EntityFramework Cor

    Webservice WCF WebApi   注明:改编加组合 在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web API.在.net平台下, ...

  4. Linux C++ 开发简介

    主要介绍将Windows程序迁移到Linux系统相关知识 简介 Windows程序迁移到Linux系统可能需要修改很多代码, 既需要了解Linux平台的开发知识, 也需要了解Windows平台代码如何 ...

  5. Linux C++ 开发简介(包括Linux守护线程)

    阅读目录 简介 操作系统 编辑器 编译器 构建系统 调试 IDE 可执行程序.动态库.静态库 服务 Windows服务简介 创建Windows服务 注册Windows服务 管理Windows服务 Li ...

  6. 机器学习的Spark与Scala开发简介

     一.机器学习常用开发软件:Spark.Scala 1. Spark简介: MLlib包含的库文件有: 分类 降维 回归 聚类 推荐系统 自然语言处理 在线学习 统计学习方法:偏向理论性,数理统计的方 ...

  7. Python自动化开发-简介

    1.Python简介 Python创始人  Guido Van Rossum,人称"龟叔",1989年圣诞节期间,为了在阿姆斯特丹打发时间,开发的一个新的脚本解释程序 作为ABC语 ...

  8. 微信小程序原生开发简介

    简介: 总结: 1. 逻辑层使用js引擎,视图层使用webview渲染 2. 微信小程序已经支持了绝大部分的 ES6 API 3. 可以自动补全css的兼容语法 文档:https://develope ...

  9. JUC——JUC开发简介(一)

    前言 JUC是Java5.0开始提供的一组专门实现多线程并发处理的开发框架,利用JUC开发架构可以有效的解决实际线程项目开发之中出现的死锁.阻塞.资源访问与公平机制. 此笔记主要记录java.util ...

随机推荐

  1. vim 批量添加删除注释

    vim中单行注释只是多行注释的一个特例,这里统一进行多行注释的讲解 (1)添加批量注释 ctrl+v 进入列编辑模式,向下或向上移动光标,把需要注释的行的开头标记起来,然后按大写的I(shift+i) ...

  2. C#[WinForm]实现自动更新

    C#[WinForm]实现自动更新 winform程序相对web程序而言,功能更强大,编程更方便,但软件更新却相当麻烦,要到客户端一台一台地升级,面对这个实际问题,在最近的一个小项目中,本人设计了一个 ...

  3. ASP汉字转拼音函数的方法

    <% 'ASP汉字转拼音函数 Set d = CreateObject("Scripting.Dictionary") d.add "a",-20319 ...

  4. ANTLR4加载csv数据

    实现功能: 编写一个自定义的监听器,将逗号分隔符文件(csv)中的数据加载到一种数据结构--“由Map组成的List”中. antlr4文件: grammar CSV; file : hdr row+ ...

  5. Netty精进01

    为什么要学习Netty? 目前基于Netty实现的一些优秀的开源框架:Dubbo.RocketMQ.Spark.Spring5.Flink.ElasticSearch.gRPC……这些还说明不了为什么 ...

  6. 测开之路七十九:python 文件处理和对象的写入读取

    """处理文件:open(文件名, 模式,编码) 'r' 打开阅读(默认)'w' 打开写入,首先截断文件'x' 打开独占创建,如果文件已经存在则失败'a' 打开写入,追加 ...

  7. 配置最漂亮的PyCharm界面,Python程序员必备!

    高逼格超美的IDE界面,是每个程序员的梦想! 随着人工智能/机器学习的兴起,Python作为一门“漂亮的语言”,再次获得广大程序员的关注.而JetBrains出品的PyCharm无疑是最好用的Pyth ...

  8. 协程分析之context上下文切换

    协程现在已经不是个新东西了,很多语言都提供了原生支持,也有很多开源的库也提供了协程支持. 最近为了要给tbox增加协程,特地研究了下各大开源协程库的实现,例如:libtask, libmill, bo ...

  9. Using text search in Web page with Sikuli

    在網頁中如何使用Sikuli找特定字串呢? 原理: 我們可以使用 組合鍵 ctrl + 來放大網頁的比例,使得sikuli的OCR功能找的更清準 實作: for i in range(4): type ...

  10. 合并石子 (区间dp+前缀和)

    [题目描述] N堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分.计算出将N堆石子合并成一堆的最小得分. [题目链接] http: ...