zoukankan      html  css  js  c++  java
  • 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;

       }

    }

  • 相关阅读:
    数组函数
    跨域
    连接数据库的几种方式
    PHP语言的优缺点
    盗链
    缓存
    电商架构演进
    分布式集群
    序列化
    json
  • 原文地址:https://www.cnblogs.com/ssjf/p/11466310.html
Copyright © 2011-2022 走看看