参考:

1、Morphia DAOs

2、https://github.com/mongodb/morphia/wiki

In most circumstances you will want to abstract your data access details into a data access layer, commonly referred to as the Data Access Object (DAO) design pattern. Now that you are equipped with an understanding of the inner workings of MongoDB and you know how to build Morphia objects to abstract documents and collections, you should be tempted to build a DAO object just as you would for a relational database. Fortunately Morphia makes that task easier for you by implementing much of the DAO pattern for you.

Morphia defines a DAO interface named com.google.code.morphia.dao.DAO and an implementation class for you to extend for your DAOs:com.google.code.morphia.dao.BasicDAO. The BasicDAO class implements that majority of the methods that you’re going to need to perform data access, including:

  • count(): returns the total count of documents in the collection
  • count(Query<T> q): returns the total count of documents in the collection that match the specified query criteria
  • delete(T entity): deletes a specified document from the collection
  • deleteById(K id): deletes the document with the specified id
  • deleteByQuery(Query<T> q): deletes all documents that match the specified query
  • ensureIndexes(): validates that an index exists for all fields annotated with the @Indexedannotation, and if not it creates them
  • exists(Query<T> q): returns true if there are documents in the collection that match the specified query, otherwise returns false
  • find(): returns all documents in the collection
  • find(Query<T> q): returns all documents that match the specified query
  • findIds(): returns the ids/keys of all documents in the collection
  • findIds(Query<T> q): returns the ids/keys of all documents in the collection that match the specified query
  • findOne(Query<T> q): returns the first document that matches the specified query; use this when you’re searching by a unique field (or if you know you just want the first document)
  • get(K id): returns the document with the specified key
  • getCollection(): returns the underlying DBCollection for the DAO
  • getDatastore(): returns the underlying Datastore for the DAO
  • save(T entity): saves the specified document to the collection
  • update(Query<T> q, UpdateOperations<T> ops): updates all documents in the collection that match the specified query with the operations specified in the UpdateOperations object
  • updateFirst(Query<T> q, UpdateOperations<T> ops): updates the first document in the collection that matches the specified query with the operations specified in the UpdateOperations object

There are other operations defined by the DAO interface, but these are representative of the basic CRUD type operations you want to do with your documents. The BasicDAO class implements all of these methods, which serves as a great starting point for your own DAO classes.

You may notice all of the generics in the method signatures. The DAO interface and BasicDAO class are both built against generics so that you will not need to cast method parameters or results. When you define your DAO class you would do so specifying the specific type, for example:

public class UserDao extends BasicDAO<User,String>

In this example, the UserDao class extends the BasicDAO class, passing it a User class as the type and String as the key type. By doing this we can execute operations like the following:

// Query for all users
List users = userDao.find().asList();// Save a user
userDao.save( dad );

The thing that you may observe about the DAO interface is that it is light on finders: you can find all objects and actually you can apply filters, which I’ll show later, but you have to do it with a knowledge of Morphia. The strategy, therefore, is to extend the BasicDAO class and implement our own custom finders.

Listings 1 and two show two simple DAO implementations, for the User class and Family class, respectively.

Listing 1. UserDao.java

package com.geekcap.informit.mongodb.morphiaexample.dao;import com.geekcap.informit.mongodb.morphiaexample.model.User;
import com.google.code.morphia.Morphia;
import com.google.code.morphia.dao.BasicDAO;
import com.mongodb.Mongo;import java.util.List;public class UserDao extends BasicDAO<User,String>
{public UserDao(Mongo mongo, Morphia morphia){super( mongo, morphia, "morphiaexample" );}public List findAll(){return ds.find( User.class ).asList();}public List findUnderAge( int age ){// Filter by age less than the specified age and then order by the age (youngest to oldest)return ds.find( User.class ).filter( "age < ", age ).order( "age" ).asList();}
}

Listing 2. FamilyDao.java

package com.geekcap.informit.mongodb.morphiaexample.dao;import com.geekcap.informit.mongodb.morphiaexample.model.Family;
import com.google.code.morphia.Morphia;
import com.google.code.morphia.dao.BasicDAO;
import com.mongodb.Mongo;import java.util.List;public class FamilyDao extends BasicDAO<Family,String>
{public FamilyDao(Mongo mongo, Morphia morphia){super( mongo, morphia, "morphiaexample" );}public List<Family> findBySurname(String surname){// Execute the query using the underlying datasourcereturn ds.find( Family.class ).field( "surname" ).equal( surname ).asList();}
}

Both the UserDao and FamilyDao classes extend BasicDAO, passing the appropriate specific type:User and Family, respectively. The constructors accept two objects:

  • Mongo: tells Morphia how to connect to MongoDB (the address and port); this is the same Mongo instance we have been using in this series
  • Morphia: main entry-point into Morphia, which includes the list of classes to map to MongoDB; this is the same Morphia instance we have been using for the past two articles

The BasicDAO class exposes its underlying Datasource, named ds, which you should use for your finders. The UserDao implements a findUnderAge() method that performs the following steps:

  1. Find all instances of the User class
  2. Filter that list of users to include only those users with an age less than the specified age
  3. Order the results by the age (ascending)
  4. Convert the result to a java.util.List
  5. Return the List

Likewise, the FamilyDao class provides a findBySurname() method that finds all Familyinstances whose surname is equal to the specified surname.

Listing 3 shows how to put this together into a working example, which is a rewrite of the example in the previous section that uses the new DAOs.

Listing 3. MorphiaExample.java

package com.geekcap.informit.mongodb.morphiaexample;import com.geekcap.informit.mongodb.morphiaexample.dao.FamilyDao;
import com.geekcap.informit.mongodb.morphiaexample.dao.UserDao;
import com.geekcap.informit.mongodb.morphiaexample.model.Address;
import com.geekcap.informit.mongodb.morphiaexample.model.Family;
import com.geekcap.informit.mongodb.morphiaexample.model.User;
import com.google.code.morphia.Morphia;
import com.mongodb.Mongo;import java.util.List;/**** @author shaines*/
public class MorphiaExample
{public static void main( String[] args ){try{// Create a Mongo instance that points to the MongoDB running on local hostMongo mongo = new Mongo( "localhost" );// Create a Morphia object and map our model classesMorphia morphia = new Morphia();morphia.map( User.class ).map( Address.class ).map( Family.class );// Create a DAOsUserDao userDao = new UserDao( mongo, morphia );FamilyDao familyDao = new FamilyDao( mongo, morphia );// Query for all users in the databaseSystem.out.println( "Users before we start:" );List<User> users = userDao.find().asList();for( User u : users ){System.out.println( "User: " + u );}// Create an object to persist to the databaseAddress address = new Address();address.setStreet( "123 Some Street" );address.setCity( "My City" );address.setState( "ST" );address.setZipcode( "12345" );User dad = new User();dad.setFirstName( "Steven" );dad.setLastName( "Haines" );dad.setAge( 39 );dad.setAddress( address );// Insert the user into the databaseuserDao.save( dad );User mom = new User();mom.setFirstName( "Linda" );mom.setLastName( "Haines" );mom.setAddress( address );userDao.save( mom );User son = new User();son.setFirstName( "Michael" );son.setLastName( "Haines" );son.setAge( 9 );son.setAddress( address );userDao.save( son );User daughter = new User();daughter.setFirstName("Rebecca");daughter.setLastName("Haines");daughter.setAge(1);daughter.setAddress(address);userDao.save( daughter );// Build the familyFamily family = new Family();family.setSurname("Haines");family.setDad(dad);family.setMom(mom);family.getChildren().add( son );family.getChildren().add(daughter);familyDao.save( family );// Query for all users in the databaseSystem.out.println( "Users using generic find() method:" );users = userDao.find().asList();for( User u : users ){System.out.println( "User: " + u );}// Alternately:System.out.println( "Users using custom findAll() method:" );users = userDao.findAll();for( User u : users ){System.out.println( "User: " + u );}// Find children (under 18)System.out.println( "Children:" );users = userDao.findUnderAge( 18 );for( User u : users ){System.out.println( "User: " + u );}// Use the FamilyDaoSystem.out.println( "Families using DAO" );List<Family> families = familyDao.findBySurname( "Haines" );for( Family f : families ){System.out.println( "Family: " + f.getSurname() );System.out.println( "- Dad: " + f.getDad() );System.out.println( "- Mom: " + f.getMom() );List<User> children = f.getChildren();System.out.println( "Children (" + children.size() + ")" );for( User child : children ) {System.out.println( "\t" + child );}}}catch( Exception e ){e.printStackTrace();}}
}

Listing 3 first creates a Mongo instance that points to a MongoDB instance running on the localhost. Next it creates a Morphia instance and maps the User, Address, and Family classes to it for persistence.

It then creates UserDao and FamilyDao instances, passing it the Mongo and Morphia instances.

The first query, which shows all User documents in the collection, does so using the explicit Morphia find().asList() instead of the findAll() method, just as an example. The alternative is shown later in the source code.

Next, listing 3 creates the User instances and Family instance, and uses the DAOs save()methods to persist those documents. There are a couple examples of querying for all users, both using the Morphia-specific notation as well as the findAll() method. Next, you can see a query for all children (age under 18), which only has the bug that I did not set my wife’s age, so she gets the age “0” which includes her in the list (but I am not going to add her age to an example, I don’t want that kind of trouble!)

Finally, listing 3 uses the FamilyDao to query for all families with the surname “Haines”, which will include only one family the first time this is run [md] there is no clean up code so you’ll see more and more Haines families added each time you execute this example.

Morphia DAOs相关推荐

  1. NoSQL 之 Morphia 操作 MongoDB

    上两篇文章:http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html http://www.cnblogs.com/hoojo/arch ...

  2. morphia(1)-基础

    二.Mapping classes entity类上加注解:@Entity,其成员变量必须有@Id @Id private ObjectId id; 其在mongodb中变量名: _id @Embed ...

  3. Morphia和MongoDB:不断发展的文档结构

    在上一篇有关Morphia的文章中 ,我介绍了一些典型用法,并提到了一些已知问题的警告和解决方法. 我展示了使用Morphia多么容易,以及它与Java世界的交互方式. 为了跟进该帖子,我将讨论如何处 ...

  4. 将MongoDB与Morphia结合使用

    在过去的几年中, NoSQL数据库(例如CouchDB,Cassandra和MongoDB)在不需要运行传统RDBMS的语义和开销的应用程序中得到了普及. 我不会进入选择NoSQL数据库的设计决策,因 ...

  5. Morphia - mongodb之ORM框架

    一.简介 二.注解 1.@Entity 2.@Id 3.@Indexed 4.@Embedded 5.@Transient和@Property 6.@Reference 三.示例 四.参考资料 Mor ...

  6. mongodb morphia

    原文:http://www.blogjava.net/watchzerg/archive/2012/09/20/388109.html 快速开始: @Entity public class Hotel ...

  7. MongoDB+java+spirng+morphia

    MongoDB+java+spirng+morphia Hotle.java packagetest_yu.morphiaSpring;importcom.google.code.morphia.an ...

  8. 从两个模型带你了解DAOS 分布式异步对象存储

    本文分享自华为云社区<DAOS 分布式异步对象存储>,原文作者:debugzhang . 分布式异步对象存储 (DAOS) 是一个开源的对象存储系统,专为大规模分布式非易失性内存 (NVM ...

  9. 使用 Morphia 和 MongoDB 实现持久化

    直接来一个简单的demo: 新建一个maven java project(maven-archetype-quickstart): DBHelper: package com.mongo.dao;im ...

  10. MongoDB的Morphia框架

    Morphia是一个开放源代码的对象关系映射框架,它对MongoDB数据库 java版驱 动进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵MongoDB数据库,也让 ...

最新文章

  1. 使用Keil语言的嵌入式C编程教程(上)
  2. 小试牛刀之Django
  3. Spring Boot 2.1.0 已发布,7 个重大更新! 1
  4. 8086的两种工作模式_Lora自组网网关的两种工作模式
  5. 将字符串转换成16进制
  6. 执行python时,ImportError: No module named xxx的解决方法
  7. 苹果加入AOM联盟 AV1获全主流生态平台支持
  8. 【转】Win8/8.1/Win7小技巧:揪出C盘空间占用的真凶
  9. 深入浅出Google Android这本书怎么样
  10. linux脚本awk,如何在awk脚本中使用shell变量?
  11. CNN转换为SNN的算法
  12. _Linux后台开发6大常用的开源库,让你在同行中脱颖而出
  13. Spring Data JPA 梳理 - JPA是什么
  14. 自从在 IDEA 中用了热部署神器 JRebel,开发效率提升了 10 倍!
  15. 一款度盘高速下载工具
  16. python安装scipy库出错_解决scipy安装(pip install scipy)失败,以及其他问题
  17. win7设置ipsec_Win7系统设置L2TP的方法【图文教程】
  18. Scrapy框架之Spiders类理解
  19. 空想科学教程 (爆笑)1
  20. Jzoj5236 利普希茨

热门文章

  1. windbg调试kvm windows虚机
  2. 修复计算机系统还原,怎么给电脑系统做一键恢复
  3. 《深入理解Bootstrap》勘误
  4. 批处理遍历当前目录和子目录查找指定后缀名的文件并修改后缀名
  5. python 计算走势角度
  6. widows安全策略
  7. JS 事件捕获、事件冒泡以及事件委托图文详解
  8. 关于动车:动车票假如象飞机票那样卖会如何?
  9. 带你玩转以太坊智能合约的”Hello World“
  10. 心情随笔--我与考研战友的故事