好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

NoSQL 之 Morphia 操作 MongoDB

NoSQL 之 Morphia 操作 MongoDB

 

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

http://www.cnblogs.com/hoojo/archive/2011/06/02/2068665.html

介绍到了在MongoDB的控制台完成MongoDB的数据操作、以及通过Java MongoDB 的驱动完成在Java中对MongoDB的操作,通过前两篇文章我们对MongoDB有了全面、深刻的认识和理解。现在我们就看看利用Morphia库来操作MongoDB。

开发环境:

System:Windows

Database:mongoDB

开发依赖库:

JavaEE5、mongo-2.5.3.jar、junit-4.8.2.jar

Email:hoojo_@126.com

Blog: http://blog.csdn.net/IBM_hoojo

http://hoojo.cnblogs.com/

一、准备工作

1、 首先,下载mongoDB对Java支持的驱动包

驱动包下载地址: https://github.com/mongodb/mongo-java-driver/downloads

mongoDB对Java的相关支持、技术: http://www.mongodb.org/display/DOCS/Java+Language+Center

驱动源码下载: https://download.github.com/mongodb-mongo-java-driver-r2.6.1-7-g6037357.zip

在线查看源码: https://github.com/mongodb/mongo-java-driver

Morphia jar包下载: http://code.google.com/p/morphia/downloads/list

2、 下面建立一个JavaProject工程,导入下载下来的驱动包。即可在Java中使用Morphia,目录如下:

二、Java操作MongoDB示例

在本示例之前你需要启动mongod.exe的服务,在你安装mongoDB的目录中,找到mongod.exe启动服务后,下面的程序才能顺利执行;

1、 Java操作mongoDB数据库,操作索引

Mongo mongo = new Mongo();

这样就创建了一个MongoDB的数据库连接对象,它默认连接到当前机器的localhost地址,端口是27017。

DB db = mongo.getDB(“test”);

这样就获得了一个test的数据库,如果mongoDB中没有创建这个数据库也是可以正常运行的。如果你 读过上一篇文章 就知道,mongoDB可以在没有创建这个数据库的情况下,完成数据的添加操作。当添加的时候,没有这个库,mongoDB会自动创建当前数据库。

得到了db,下一步我们要获取一个“聚集集合DBCollection”,通过db对象的getCollection方法来完成。

DBCollection users = db.getCollection("users");

这样就获得了一个DBCollection,它相当于我们数据库的“表”。

查询所有数据

DBCursor cur = users.find();

while (cur.hasNext()) {

System.out.println(cur.next());

}

用BasicDBObjectBuilder,向users对象中添加数据

user = BasicDBObjectBuilder. start ("id", 1546555)

.append("name", "jojo").add("address", "gz")

.append("email", "hoojo_@126.com")

.get();

插入数据

users.insert(user);

可以利用JSON工具来序列化对象数据

JSON. serialize (cur)

完整源码

 package  com.hoo.test;
 
 import  java.net.UnknownHostException;
 import  com.hoo.entity.User;
 import  com.hoo.util.BasicDBObjectUtils;
 import  com.mongodb.BasicDBObjectBuilder;
 import  com.mongodb.DB;
 import  com.mongodb.DBCollection;
 import  com.mongodb.DBCursor;
 import  com.mongodb.DBObject;
 import  com.mongodb.Mongo;
 import  com.mongodb.MongoException;
 import  com.mongodb.util.JSON;
 
 /** 
  * <b>function:</b> Mongo实例对象的相关方法测试 
  * @author hoojo 
  * @createDate 2011-5-24 下午02:42:29 
  * @file MongoDBTest.java 
  * @package com.hoo.test 
  * @project MongoDB 
  * @blog http://blog.csdn.net/IBM_hoojo 
  * @email hoojo_@126.com 
  * @version 1.0 
  */ 
 public   class  MongoDBTest {
 
     public   static   void  main(String[] args)  throws  UnknownHostException, MongoException {
        Mongo mg =  new  Mongo();
        
        System.out.println( "查询所有的Database的名称" );
         for  (String name : mg.getDatabaseNames()) {
            System.out.println( "dbName: "  + name);
        }
        
        System.out.println( "查询test库中的所有collection集合(表)名称" );
        DB db = mg.getDB( "test" );
         for  (String name : db.getCollectionNames()) {
            System.out.println( "collectionName: "  + name);
        }
        
        System.out.println( "添加测试数据" );
        DBCollection users = db.getCollection( "users" );
         try  {
             // 用自定义BasicDBObjectUtils工具类,将User Enity对象转换成DBObject 
            DBObject user = BasicDBObjectUtils.castModel2DBObject( new  User( "345567" ,  "jack" , 22,  "beijin" ));
            users.insert(user);
             // 用BasicDBObjectBuilder构建一个DBObject对象 
            user = BasicDBObjectBuilder.start( "id" , 1546555).append( "name" ,  "jojo" ).add( "address" ,  "gz" ).append( "email" ,  "hoojo_@126.com" ).get();
            users.insert(user);
        }  catch  (Exception e) {
            e.printStackTrace();
        }
        
        System.out.println( "游标查询所有users集合数据" );
        DBCursor cur = users.find();
         while  (cur.hasNext()) {
            System.out.println(cur.next());
        }
        System.out.println( "查询游标相关内容" );
        System.out.println(cur.count());
        System.out.println(cur.getCursorId());
        System.out.println(cur.getOptions());
        System.out.println(cur.getQuery());
        System.out.println(cur.getSizes().listIterator());
        
        System.out.println(cur.itcount());
         //System.out.println(cur.length()); 
        System.out.println(cur.size());
        System.out.println(cur.numGetMores());
        System.out.println(cur.curr());
         //System.out.println(cur.toArray().get(0)); 
        
        System.out.println( "显示游标查询到的所有内容: "  + JSON.serialize(cur));
    }
}

工具类,将带有getter、setter方法的Java类序列化成DBObject对象

 package  com.hoo.util;
 
 import  java.lang.reflect.Method;
 import  com.mongodb.BasicDBObject;
 import  com.mongodb.DBObject;
 
 /** 
  * <b>function:</b> 将Entity/Model转换成DBObject 
  * @author hoojo 
  * @createDate 2011-5-30下午01:53:08 
  * @file BasicDBObjectUtil.java 
  * @package com.hoo.util 
  * @project MongoDB 
  * @blog http://blog.csdn.net/IBM_hoojo 
  * @email hoojo_@126.com 
  * @version 1.0 
  */ 
publicclass BasicDBObjectUtils {
     public   static <T> DBObject castModel2DBObject(T entity)  throws  Exception {
        Method[] method =  entity.getClass().getMethods();
        
        DBObject dbObject =  new  BasicDBObject();
         for  (Method m : method) {
             //System.out.println(m.getName()); 
             if  (m.getName().startsWith( "get" )) {
                String name = m.getName().replace( "get" ,  "" );
                 for  (Method m2 : method) {
                     if  (m2.getName().equals( "set"  + name)) {
                        name = name.substring(0, 1).toLowerCase() + name.substring(1);
                        Object returnVal = m.invoke(entity,  new  Object[] {});
                         if  (returnVal != null) {
                             //System.out.println(name + " : " + m.invoke(shipping, new Object[] {})); 
                            dbObject.put(name, returnVal);
                        }
                    }
                }
            }
        }
        System.out.println( "dbObject: "  + dbObject);
         return  dbObject;
    }
}

2、 完成索引操作,首先建立一个MongoDB4IndexTest.java,基本测试代码如下:

 package  com.hoo.test;
 
 import  java.net.UnknownHostException;
 import  java.util.ArrayList;
 import  java.util.List;
 import  org.bson.types.ObjectId;
 import  org.junit.After;
 import  org.junit.Before;
 import  org.junit.Test;
 import  com.mongodb.BasicDBObject;
 import  com.mongodb.Bytes;
 import  com.mongodb.DB;
 import  com.mongodb.DBCollection;
 import  com.mongodb.DBCursor;
 import  com.mongodb.DBObject;
 import  com.mongodb.Mongo;
 import  com.mongodb.MongoException;
 import  com.mongodb.QueryOperators;
 import  com.mongodb.util.JSON;
 
 /** 
  * <b>function:</b> 实现MongoDB的Index操作 
  * @author hoojo 
  * @createDate 2011-6-2 下午03:21:23 
  * @file MongoDB4IndexTest.java 
  * @package com.hoo.test 
  * @project MongoDB 
  * @blog http://blog.csdn.net/IBM_hoojo 
  * @email hoojo_@126.com 
  * @version 1.0 
  */ 
 public   class  MongoDB4IndexTest {
    
     private  Mongo mg = null;
     private  DB db;
     private  DBCollection users;
    
    @Before
     public   void  init() {
         try  {
            mg =  new  Mongo();
             //mg = new Mongo("localhost", 27017); 
        }  catch  (UnknownHostException e) {
            e.printStackTrace();
        }  catch  (MongoException e) {
            e.printStackTrace();
        }
         //获取temp DB;如果默认没有创建,mongodb会自动创建 
        db = mg.getDB( "temp" );
         //获取users DBCollection;如果默认没有创建,mongodb会自动创建 
        users = db.getCollection( "users" );
    }
    
    @After
     public   void  destory() {
         if  (mg != null)
            mg.close();
        mg = null;
        db = null;
        users = null;
        System.gc();
    }
    
     public   void  print(Object o) {
        System.out.println(o);
    }
}

3、 下面完成对象Collection的index的操作

 /** 
  * <b>function:</b> 测试Collection的index相关操作 
  * @author hoojo 
  * @createDate 2012-2-16 下午08:32:26 
  */ 
@Test
 public   void  testIndex() {
    query();
    
     for  (DBObject index : coll.getIndexInfo()) {
        print( "IndexInfo: "  + index);
    }
    
    coll.dropIndexes();
     //创建索引 
    coll.createIndex( new  BasicDBObject( "name" ,  "idx_name" ));
    print(coll.findOne( new  BasicDBObject( "name" ,  "haha" )));
    coll.createIndex(coll.findOne( new  BasicDBObject( "name" ,  "haha" )));
    DBObject o =  new  BasicDBObject( "unique" , true);
     //coll.createIndex(coll.findOne(), o); 
    
     // 修改索引,如果存在就修改不存在就添加 
    coll.ensureIndex(o);
    coll.ensureIndex( "age_1" );
    coll.ensureIndex( new  BasicDBObject( "age3_1" , 6),  new  BasicDBObject( "ts" , -1));
    coll.ensureIndex( new  BasicDBObject( "age_2" , 1),  new  BasicDBObject(  "ts"  , 1 ));
    coll.ensureIndex( new  BasicDBObject( "password" , 2),  new  BasicDBObject(  "z"  ,  "idx"  ));
    coll.ensureIndex( new  BasicDBObject( "password" , 1),  new  BasicDBObject(  "etc"  ,  "idx"  ));
     // 创建唯一索引 
    coll.ensureIndex( new  BasicDBObject( "emial" , 2),  new  BasicDBObject( "unique" , false));
     // 创建索引,指定索引名称default_index 
    coll.ensureIndex( new  BasicDBObject( "address" , 1),  new  BasicDBObject(  "name"  ,  "default_index" ));
     // 创建索引对象,索引名称user_index 
    coll.ensureIndex(coll.findOne( new  BasicDBObject( "name" ,  "hoho" )),  "user_index" );
     // 唯一索引 
    coll.ensureIndex(coll.findOne( new  BasicDBObject( "name" ,  "hehe" )),  "users_index_unique" , true);
    
     // 查询所有索引 
     for  (DBObject index : coll.getIndexInfo()) {
        print( "IndexInfo: "  + index);
    }
    
    print(DBCollection.genIndexName(coll.findOne()));
    
     //coll.dropIndex(coll.findOne()); 
    print(DBCollection.genIndexName( new  BasicDBObject( "password" , 2)));
     //coll.dropIndex(DBCollection.genIndexName(new BasicDBObject("password", 2))); 
     //coll.dropIndexes(); 
     //coll.dropIndexes("assword_1"); 
}

三、Morphia基本操作

1、 morphia可以利用annotation对JavaEntity进行注解,那样我们就可以用morphia操作JavaEntity对象

 package  com.hoo.entity;
 
 import  com.google.code.morphia.annotations.Entity;
 import  com.google.code.morphia.annotations.Id;
 
 /** 
  * <b>function:</b> JavaEntity对象 
  * @author hoojo 
  * @createDate 2011-5-31上午11:45:21 
  * @file User.java 
  * @package com.hoo.entity 
  * @project Morphia 
  * @blog http://blog.csdn.net/IBM_hoojo 
  * @email hoojo_@126.com 
  * @version 1.0 
  */ 
 //利用morphia的annotation进行注解 
@Entity
 public   class  User {
    @Id
     private   long  id;
    
     private  String name;
     private   boolean  sex;
     private   int  age;
     private  String address;
    
     public  User() {
    }
     public  User( long  id, String name,  boolean  sex,  int  age, String address) {
         super ();
         this .id = id;
         this .name = name;
         this .sex = sex;
         this .age = age;
         this .address = address;
    }
     //getter、setter 
    
    @Override
     public  String toString() {
         return   this .id +  "#"  +  this .name +  "#"  +  this .age +  "#"  +  this .sex +  "#"  +  this .address;
    }
}

2、 对Morphia对象一些简单的使用,看看该对象提供了哪些基本的操作方法

 package  com.hoo.test.morphia;
 
 import  java.net.UnknownHostException;
 import  org.junit.After;
 import  org.junit.Before;
 import  org.junit.Test;
 import  com.google.code.morphia.Datastore;
 import  com.google.code.morphia.EntityInterceptor;
 import  com.google.code.morphia.Morphia;
 import  com.google.code.morphia.mapping.MappedClass;
 import  com.google.code.morphia.mapping.Mapper;
 import  com.google.code.morphia.mapping.cache.EntityCache;
 import  com.hoo.entity.User;
 import  com.mongodb.BasicDBObjectBuilder;
 import  com.mongodb.Mongo;
 import  com.mongodb.MongoException;
 
 /** 
  * <b>function:</b> morphia对象的简单测试 
  * @author hoojo 
  * @createDate 2011-5-31上午11:30:20 
  * @file MorphiaTest.java 
  * @package com.hoo.test 
  * @project Morphia 
  * @blog http://blog.csdn.net/IBM_hoojo 
  * @email hoojo_@126.com 
  * @version 1.0 
  */ 
 public   class  MorphiaTest {
     private  Mongo mongo;
     private  Morphia morphia;
    
    @Before
     public   void  init() {
         try  {
            mongo =  new  Mongo();
        }  catch  (UnknownHostException e) {
            e.printStackTrace();
        }  catch  (MongoException e) {
            e.printStackTrace();
        }
        morphia =  new  Morphia();
    }
    
     private   void  print(Object o) {
         if  (o != null) {
            System.out.println(o.toString());
        }
    }
    
     /** 
      * <b>function:</b> morphia对象的简单测试 
      * @author hoojo 
      */ 
    @SuppressWarnings( "deprecation" )
    @Test
     public   void  testMorphia() {
         // 创建一个Datastore,过时的方法不推荐使用 
        Datastore ds = morphia.createDatastore( "myTestDB" );
        print( "createDatastore: "  + ds);
         // 创建ds 
        ds = morphia.createDatastore(mongo,  "myTestDB" );
        print( "createDatastore: "  + ds);
         // 创建一个带用户名、密码的ds 
         //ds = morphia.createDatastore(mongo, "myTestDB", "admin", new char[] { '1', '2', '3', '4', '5', '6' }); 
        
         // 设置操作资源对象,这里设置User.class 就可以完成对User的一系列操作 
         //morphia.map(User.class); 
         //morphia.mapPackage("com.hoo.entity");//会把整个包下面的类都加载进来 
         // 将对象转成DBObject 
        print( "toDBObject: "  + morphia.toDBObject( new  User(System.currentTimeMillis(),  "jackson" , true, 22, null)));
         // 将参数2转换成参数1的类型 
        print( "fromDBObject: "  + morphia.fromDBObject(User. class , BasicDBObjectBuilder.start( "sex" , true).get()));
        print( "getMapper: "  + morphia.getMapper());
        print( "isMapped: "  + morphia.isMapped(User. class ));
        
    }
    
     /** 
      * <b>function:</b> 对Mapper对象相关操作 
      * @author hoojo 
      * @createDate 2012-2-16下午10:20:38 
      */ 
    @Test
     public   void  testMapper() {
        Mapper mapper = morphia.getMapper();
         // 添加对象映射 
        print( "addMappedClass: "  + mapper.addMappedClass(User. class ));
         //print(mapper.addMappedClass(mapper.addMappedClass(User.class)); 
        
         // 创建实体缓存 
        print( "createEntityCache: "  + mapper.createEntityCache());
        print(mapper.getCollectionName( "myTestDB" ));
        print(mapper.getConverters());
        User user =  new  User(System.currentTimeMillis(),  "jackson" , true, 22, null);
        user.setId(1306814012734L);
        print(mapper.getId(user));
        
         for  (EntityInterceptor ei : mapper.getInterceptors()) {
            System.out.println( "EntityInterceptor: "  + ei);
        }
 
         // 查询主键 
        print( "getKey: "  + mapper.getKey(user));
         // 所有已经映射的class 
         for  (MappedClass mc : mapper.getMappedClasses()) {
            System.out.println( "getMappedClasses: "  + mc);
        }
        
        print( "mcMap: "  + mapper.getMCMap());
        
        print( "getOptions: "  + mapper.getOptions());
        print( "keyToRef: "  + mapper.keyToRef(mapper.getKey(user)));
        print( "refToKey: "  + mapper.refToKey(mapper.keyToRef(mapper.getKey(user))));
    }
    
     /** 
      * <b>function:</b> 实体缓存 
      * @author hoojo 
      */ 
    @Test
     public   void  testEntityCache() {
        EntityCache ec = morphia.getMapper().createEntityCache();
        print( "EntityCache: "  + ec);
        Datastore ds = morphia.createDatastore(mongo,  "myTestDB" );
        User user =  new  User(System.currentTimeMillis(),  "jackson" , true, 22, null);
        user.setId(1306814012734L);
        
         // 添加实体 
        ec.putEntity(ds.getKey(user), user);
         // 代理 
        ec.putProxy(ds.getKey(user), user);
        
        print( "getKey: "  + ds.getKey(user));
        print( "getProxy: "  + ec.getProxy(ds.getKey(user)));
        print( "getEntity: "  + ec.getEntity(ds.getKey(user)));
        
        print(ec.exists(ds.getKey(user)));
        
        print( "stats: "  + ec.stats());
    }
    
    @After
     public   void  destory() {
        mongo = null;
        morphia = null;
        System.gc();
    }
}

四、利用Morphia完成对Datastore对象的CRUD操作

1、 首先添加如下准备代码,随后的方法直接添加到该文件中即可

 package  com.hoo.test.ds;
 
 import  java.net.UnknownHostException;
 import  java.util.ArrayList;
 import  java.util.List;
 import  org.junit.After;
 import  org.junit.Before;
 import  org.junit.Test;
 import  com.google.code.morphia.Datastore;
 import  com.google.code.morphia.Key;
 import  com.google.code.morphia.Morphia;
 import  com.google.code.morphia.query.UpdateOperations;
 import  com.hoo.entity.User;
 import  com.mongodb.Mongo;
 import  com.mongodb.MongoException;
 
 /** 
  * <b>function:</b> Datastore增删改查操作 
  * @author hoojo 
  * @createDate 2011-5-31下午06:29:04 
  * @fileDatastore DatastoreTest.java 
  * @package com.hoo.test.ds 
  * @project Morphia 
  * @blog http://blog.csdn.net/IBM_hoojo 
  * @email hoojo_@126.com 
  * @version 1.0 
  */ 
 public   class  DatastoreTest {
     private  Mongo mongo;
     private  Morphia morphia;
     private  Datastore ds;
    
    @Before
     public   void  init() {
         try  {
            mongo =  new  Mongo();
        }  catch  (UnknownHostException e) {
            e.printStackTrace();
        }  catch  (MongoException e) {
            e.printStackTrace();
        }
        morphia =  new  Morphia();
        morphia.map(User. class );
        ds = morphia.createDatastore(mongo,  "temp" );
    }
    
     private   void  print(Object o) {
         if  (o != null) {
            System.out.println(o.toString());
        }
    }
    
    
     /** 
     * <b>function:</b> 查询所有 
     * @author hoojo 
     * @createDate 2012-2-16 下午10:36:13 
     */ 
     private   void  query() {
        Iterable<User> it = ds.createQuery(User. class ).fetch();
         while (it.iterator().hasNext()) {
            print( "fetch: "  + it.iterator().next());
        }
    }
    
    @After
     public   void  destory() {
        mongo = null;
        morphia = null;
        ds = null;
        System.gc();
    }
}

2、 增删改CUD操作

 /** 
  * <b>function:</b> CUD增删改 
  * @author hoojo 
  * @createDate 2012-2-16 下午10:46:08 
  */ 
@Test
 public   void  testCUD() {
     // 添加测试数据 
     for  ( int  i = 0; i < 50; i++) {
        User u =  new  User(System.currentTimeMillis() + i,  "test-"  + i, ((i % 2 == 0)? true: false), 18 + i,  "china-gz#"  + i);
        print(ds.save(u));
    }
     //ds.delete(ds.createQuery(User.class)); 
    
    List<User> users =  new  ArrayList<User>();
    users.add( new  User(1306907246518L,  "zhangsan" , true, 22,  "china-gz" ));
    User user =  new  User(System.currentTimeMillis() + 3,  "zhaoliu" , true, 29,  "china-beijin" );
    users.add(user);
    users.add( new  User(System.currentTimeMillis() + 6,  "wangwu" , true, 24,  "china-shanghai" ));
    users.add( new  User(System.currentTimeMillis() + 9,  "lisi" , true, 26,  "china-wuhan" ));
     //添加集合 
    print( "save: "  + ds.save(users));
    
     //添加数组 
    print( "save: "  + ds.save(users.toArray()));
    
     this .query();
    print( "getKey: "  + ds.find(User. class ,  "id" , 1306907246518L).getKey());
    
     //修改操作 
    UpdateOperations<User> uo = ds.createUpdateOperations(User. class );
    
    print( "update: "  + ds.update(ds.find(User. class ,  "id" , 1306907246518L).getKey(), uo).getUpdatedCount());
    uo.add( "name" ,  "zhaoliuliu" ).set( "age" , 29).set( "sex" , true).add( "address" ,  "gzz" );
    print( "update: "  + ds.update(ds.find(User. class ,  "id" , 1306907246518L).getKey(), uo).getUpdatedCount());
 
    print( "update: "  + ds.update(ds.createQuery(User. class ).field( "id" ).equal(1306907246518L), uo).getUpdatedCount());
    print( "update: "  + ds.update(ds.find(User. class ,  "id" , 1306907246518L), uo).getUpdatedCount());
    
    uo = ds.createUpdateOperations(User. class );
    uo.set( "name" ,  "zhaoqq" ).set( "age" , 29).set( "sex" , true).add( "address" ,  "fzz" );
    print( "update: "  + ds.update(ds.find(User. class ,  "id" , 1306907246518L).get(), uo).getUpdatedCount());
    
    print( "update: "  + ds.update(ds.createQuery(User. class ).field( "id" ).equal(1306907246518L), uo, true).getUpdatedCount());
    
     // 修改第一个对象 
    print( "updateFirst: "  + ds.updateFirst(ds.createQuery(User. class ).field( "id" ).equal(1306907246518L), uo).getUpdatedCount());
     //当参数createIfMissing为true的时候,如果修改的对象不存在就会添加这条数据,如果为false的情况下,不存在也不添加 
    print( "updateFirst: "  + ds.updateFirst(ds.createQuery(User. class ).field( "id" ).equal(1306907246519L), uo, true).getUpdatedCount());
    user.setId(1306907246518L);
    print( "updateFirst: "  + ds.updateFirst(ds.createQuery(User. class ).field( "id" ).equal(1306907246518L), user, true).getUpdatedCount());
    
    user.setId(1306916670518L);
     // 合并 
    print( "merge: "  + ds.merge(user).getId());
     this .query();
    
     //删除 
    print( "delete: "  + ds.delete(ds.createQuery(User. class ).field( "id" ).equal(1306907246518L)).getN());
    print( "delete: "  + ds.delete(ds.find(User. class ,  "age" , 29).get()).getN());
     //print("delete: " + ds.delete(User.class, 1306911594631L).getN()); 
     //print("delete: " + ds.delete(User.class, users).getN()); 
     //ds.delete(ds.createQuery(User.class)); 
     this .query();
}

3、 Find查询操作

 /** 
  * <b>function:</b> find查询 
  * @author hoojo 
  * @createDate 2012-2-16 下午10:45:55 
  */ 
@Test
 public   void  testFind() {
    print( "find: "  + ds.find(User. class ).asList());
     //like 
    print( "find-contains: "  + ds.find(User. class ).field( "name" ).contains( "test-1" ).asList());
     //忽略大小写 
    print( "find-containsIgnoreCase: "  + ds.find(User. class ).field( "name" ).containsIgnoreCase( "ja" ).asList());
    
    print( "find-endsWith: "  + ds.find(User. class ).field( "name" ).endsWith( "22" ).asList());
    print( "find-endsWithIgnoreCase: "  + ds.find(User. class ).field( "name" ).endsWithIgnoreCase( "CK" ).asList());
    
     //过滤null或是没有name属性的 
    print( "find-doesNotExist: "  + ds.find(User. class ).field( "name" ).doesNotExist().asList());
     //查询name有值的数据 
    print( "find-doesNotExist: "  + ds.find(User. class ).field( "name" ).exists().asList());
     //age > 48 
    print( "find-greaterThan: "  + ds.find(User. class ).field( "age" ).greaterThan(66).asList());
     //age >= 48 
    print( "find-greaterThan: "  + ds.find(User. class ).field( "age" ).greaterThanOrEq(66).asList());
    
    List<Integer> ageList =  new  ArrayList<Integer>(); 
    ageList.add(22);
    ageList.add(55);
    ageList.add(66);
     //all 
    print( "find-hasAllOf: "  + ds.find(User. class ).field( "age" ).hasAllOf(ageList).asList());
     //in 
    print( "find-hasAnyOf: "  + ds.find(User. class ).field( "age" ).hasAnyOf(ageList).asList());
     //not in 
    print( "find-hasNoneOf: "  + ds.find(User. class ).field( "age" ).hasNoneOf(ageList).asList());
     //elemMatch 
     //print("find-hasThisElement: " + ds.find(User.class).field("age").hasThisElement(55).asList()); 
    print( "find-hasThisOne: "  + ds.find(User. class ).field( "age" ).hasThisOne(55).asList());
    
    print( "find-in: "  + ds.find(User. class ).field( "age" ).in(ageList).asList());
    print( "find-lessThan: "  + ds.find(User. class ).field( "age" ).lessThan(20).asList());
    print( "find-lessThanOrEq: "  + ds.find(User. class ).field( "age" ).lessThanOrEq(18).asList());
    
     //print("find-lessThanOrEq: " + ds.find(User.class).field("age").near(.2, .8).asList()); 
    
    print( "find: "  + ds.find(User. class ,  "id" , 1306813979609L).get());
    print( "find: "  + ds.find(User. class ,  "age" , 28, 1, 2).asList());
    
    print( "findAndDelete: "  + ds.findAndDelete(ds.createQuery(User. class ).field( "id" ).equal(1306813979609L)));
    print( "find: "  + ds.find(User. class ).asList());
}

4、 Query查询操作

 /** 
  * <b>function:</b> query查询 
  * @author hoojo 
  * @createDate 2012-2-16 下午10:40:10 
  */ 
@Test
 public   void  testQuery() {
     // 查询所有 
    print( "query: "  + ds.createQuery(User. class ).asList());
     // 查询主键 
    print( "query key: "  + ds.createQuery(User. class ).asKeyList());
     // 结果集数量 
    print( "query: "  + ds.createQuery(User. class ).countAll());
     // 抓取查询所有记录 
    Iterable<User> it = ds.createQuery(User. class ).fetch();
     while (it.iterator().hasNext()) {
        print( "fetch: "  + it.iterator().next());
    }
    
     // null  
    it = ds.createQuery(User. class ).fetchEmptyEntities();
     while (it.iterator().hasNext()) {
        print( "fetchEmptyEntities: "  + it.iterator().next());
    }
    
     // all key 
    Iterable<Key<User>> itkeys = ds.createQuery(User. class ).fetchKeys();
     while (itkeys.iterator().hasNext()) {
        print( "fetchKeys: "  + itkeys.iterator().next());
    }
    
     // age > 24 
    print( "query: "  + ds.createQuery(User. class ).filter( "age > " , 24).asList());
     // age in (20, 28) 
    print( "query: "  + ds.createQuery(User. class ).filter( "age in " , newint[] { 20, 28 }).asList());
    
     // limit 3 
    print( "query: "  + ds.createQuery(User. class ).limit(3).asList());
     // 分页类似MySQL 
    print( "query: "  + ds.createQuery(User. class ).offset(11).limit(5).asList());
     // order排序,默认asc 
    print( "query: "  + ds.createQuery(User. class ).order( "age" ).asList());
     //desc 
    print( "query: "  + ds.createQuery(User. class ).order( "-age" ).asList());
     // 组合排序 order by age, name 
    print( "query: "  + ds.createQuery(User. class ).order( "age, name" ).asList());
    
    print( "query: "  + ds.createQuery(User. class ).queryNonPrimary().asList());
    print( "query: "  + ds.createQuery(User. class ).queryPrimaryOnly().asList());
     //如果include 为true就表示取该属性的值,其他的默认null,反之为false则该属性为null,取其他的值 
    print( "query: "  + ds.createQuery(User. class ).retrievedFields(false,  "age" ).asList());
}

5、 get和count查询

 /** 
  * <b>function:</b> get查询 
  * @author hoojo 
  * @createDate 2012-2-16 下午10:39:09 
  */ 
@Test
 public   void  testGet() {
    User user =  new  User();
    user.setId(1306916670518L);
    print( "get: "  + ds.get(user));
    List<Long> ids =  new  ArrayList<Long>();
    ids.add(1306907246519L);
    ids.add(1306916670524L);
     // 通过id集合查询相当于in () 
    print( "get: "  + ds.get(User. class , ids).asList());
     // id查询 
    print( "get: "  + ds.get(User. class , 1306916670524L));
}
 
 /** 
  * <b>function:</b> count查询 
  * @author hoojo 
  * @createDate 2012-2-16 下午10:38:02 
  */ 
@Test
 public   void  testGetCount() {
    User user =  new  User();
    user.setId(1306916670518L);
    print( "getCount: "  + ds.getCount(user));
    print( "getCount: "  + ds.getCount(User. class ));
    
    List<Long> ids =  new  ArrayList<Long>();
    ids.add(1306907246519L);
    ids.add(1306916670524L);
    print( "getCount: "  + ds.getCount(ds.get(User. class , ids)));
    
     // age > 22的记录 
    print( "getCount: "  + ds.getCount(ds.createQuery(User. class ).filter( "age > " , 22)));
     // 所有 
    print( "countAll: "  + ds.get(User. class , ids).countAll());
    print( "countAll: "  + ds.find(User. class ).countAll());
}

6、 其他操作

@Test
 public   void  testOthers() {
    query();
     /** 索引 */ 
    ds.ensureIndexes(); 
     // 同时用annotation也可以给指定的属性建立索引 
     // 只需用在JavaEntity建立索引的属性上添加annotation 
     /*@Indexed(value = IndexDirection.ASC, name = "address_index") 
     String address; 
     // 建立唯一索引 
     @Indexed(value = IndexDirection.ASC, name = "bandName", unique = true) 
     String name;*/ 
 
    ds.ensureCaps();
    User user =  new  User();
    user.setId(1306916670518L);
    print( "getDB: "  + ds.getDB());
    print( "getDefaultWriteConcern: "  + ds.getDefaultWriteConcern());
    print( "DBColl: "  + ds.getCollection(User. class ));  // 查询User对象对应的集合 
    Key<User> key = ds.getKey(user);  // 主键 
    print( "getKey: "  + key);
    print( "exists: "  + ds.exists(user));  //是否存在该对象 
    print( "exists: "  + ds.exists(ds.getKey(user)));
    
    print( "getByKey: "  + ds.getByKey(User. class , key));
    List<Key<User>> keys =  new  ArrayList<Key<User>>();
    keys.add(key);
    user.setId(1306916670521L);
    keys.add(ds.getKey(user));
    print( "getByKey: "  + ds.getByKeys(keys));
    print( "getByKey: "  + ds.getByKeys(User. class , keys));
    
    query();
}

用Morphia操作对象相对比较简单,它对MongoDB对Java的操作进行了一些封装,特别是查询这方面的。有没有感觉像是在用Hibernate?

作者: hoojo  
出处:  http://www.cnblogs.com/hoojo/archive/2012/02/17/2355384.html 
blog: http://blog.csdn.net/IBM_hoojo
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。


版权所有,转载请注明出处   本文出自: http://www.cnblogs.com/hoojo/archive/2012/02/17/2355384.html 
版权所有,欢迎转载,转载请注明出处,谢谢

JavaEE

EJB、JDBC、JDO、RMI、JPA、JTA、JMS、 JCA、 JNDI 等等

NoSQL 之 Morphia 操作 MongoDB

posted @  2012-02-17 10:25  hoojo 阅读(100) |  评论 (0)   编辑

 

分享文件一个上传工具类

posted @  2012-02-10 13:48  hoojo 阅读(205) |  评论 (0)   编辑

 

缩放图片工具类,创建缩略图、伸缩图片比例

posted @  2012-02-08 13:58  hoojo 阅读(130) |  评论 (0)   编辑

 

Struts 笔记

posted @  2012-01-29 16:44  hoojo 阅读(711) |  评论 (0)   编辑

 

Servlet 手记

posted @  2012-01-29 15:48  hoojo 阅读(59) |  评论 (0)   编辑

 

JSP 手记

posted @  2012-01-29 14:44  hoojo 阅读(187) |  评论 (0)   编辑

 

Solr开发文档

posted @  2011-10-21 16:25  hoojo 阅读(1956) |  评论 (2)   编辑

 

Java 多线程断点下载文件

posted @  2011-09-30 18:25  hoojo 阅读(1770) |  评论 (6)   编辑

 

BlazeDS 整合 Flex HelloWorld 示例

posted @  2011-09-16 15:21  hoojo 阅读(1122) |  评论 (0)   编辑

 

使用Dom4j操作XML

posted @  2011-08-12 09:44  hoojo 阅读(1356) |  评论 (1)   编辑

 

JDOM 操作XML

posted @  2011-08-11 11:24  hoojo 阅读(900) |  评论 (0)   编辑

 

Java JDBC 理论笔记

posted @  2011-06-10 15:01  hoojo 阅读(741) |  评论 (0)   编辑

 

Spring REST

posted @  2011-06-10 11:08  hoojo 阅读(2015) |  评论 (5)   编辑

 

Struts2、Spring3、MyBatis3整合ExtJS,完成CheckNodeColumnTree

posted @  2011-05-12 12:52  hoojo 阅读(1173) |  评论 (5)   编辑

 

Struts2、Spring3、MyBatis3整合ExtJS,完成ColumnTree 【二】

posted @  2011-05-11 17:38  hoojo 阅读(1795) |  评论 (2)   编辑

 

Struts2、Spring3、MyBatis3整合ExtJS,完成ColumnTree 【一】

posted @  2011-05-11 17:14  hoojo 阅读(2517) |  评论 (0)   编辑

 

Java IO 理论笔记

posted @  2011-05-09 11:16  hoojo 阅读(1910) |  评论 (2)   编辑

 

SpringMVC 中整合JSON、XML视图二

posted @  2011-04-29 12:36  hoojo 阅读(1471) |  评论 (0)   编辑

 

SpringMVC 中整合JSON、XML视图一

posted @  2011-04-29 11:33  hoojo 阅读(2405) |  评论 (1)   编辑

 

Java 的JSON、XML转换方法——目录索引

posted @  2011-04-27 13:00  hoojo 阅读(2337) |  评论 (3)   编辑

 

Jibx 处理XML

posted @  2011-04-27 11:47  hoojo 阅读(1096) |  评论 (0)   编辑

 

Jaxb2 转换XML文档

posted @  2011-04-26 11:02  hoojo 阅读(1206) |  评论 (1)   编辑

 

用Castor 处理XML文档

posted @  2011-04-25 10:48  hoojo 阅读(1614) |  评论 (6)   编辑

 

xStream完美转换XML、JSON

posted @  2011-04-22 18:46  hoojo 阅读(6181) |  评论 (3)   编辑

 

Jackson 框架,轻易转换JSON

posted @  2011-04-22 10:45  hoojo 阅读(5525) |  评论 (3)   编辑

 

JSON-lib框架,转换JSON、XML不再困难

posted @  2011-04-21 17:24  hoojo 阅读(9434) |  评论 (4)   编辑

 

FreeMarker整合Spring 3

posted @  2011-04-19 10:12  hoojo 阅读(1885) |  评论 (5)   编辑

 

MyBatis3整合Spring3的Transaction事务处理

posted @  2011-04-15 18:14  hoojo 阅读(2864) |  评论 (5)   编辑

 

MyBatis3整合Spring3、SpringMVC3

posted @  2011-04-15 10:06  hoojo 阅读(4446) |  评论 (24)   编辑

 

CXF WebService 开发文档-目录索引

posted @  2011-03-30 11:52  hoojo 阅读(2001) |  评论 (0)   编辑

 

四、CXF WebService中传递复杂类型对象

posted @  2011-03-30 10:51  hoojo 阅读(3188) |  评论 (2)   编辑

 

五、CXF WebService整合Spring

posted @  2011-03-30 10:50  hoojo 阅读(7767) |  评论 (0)   编辑

 

三、CXF对Interceptor拦截器的支持

posted @  2011-03-30 10:12  hoojo 阅读(1701) |  评论 (0)   编辑

 

二、CXF 入门示例

posted @  2011-03-29 15:55  hoojo 阅读(2748) |  评论 (2)   编辑

 

一、CXF WebService准备工作

posted @  2011-03-29 15:21  hoojo 阅读(1100) |  评论 (0)   编辑

 

五、WebService会话Session的管理

posted @  2011-03-16 10:54  hoojo 阅读(1074) |  评论 (2)   编辑

 

Axis2.x WebService开发指南-目录索引

posted @  2011-03-16 10:51  hoojo 阅读(2262) |  评论 (0)   编辑

 

十、 使用SoapMonitor监视WebService的请求和响应信息

posted @  2011-03-16 10:41  hoojo 阅读(452) |  评论 (0)   编辑

 

九、 编写Module模块

posted @  2011-03-16 10:36  hoojo 阅读(248) |  评论 (0)   编辑

 

八、 异步调用WebService

posted @  2011-03-16 10:26  hoojo 阅读(810) |  评论 (2)   编辑

 

七、 用Spring创建的JavaBean发布成WebService

posted @  2011-03-16 10:18  hoojo 阅读(718) |  评论 (3)   编辑

 

六、 跨多个WebService管理Session

posted @  2011-03-16 10:07  hoojo 阅读(581) |  评论 (1)   编辑

 

四、 用axis2的辅助工具发布、调用WebService

posted @  2011-03-16 09:54  hoojo 阅读(1173) |  评论 (2)   编辑

 

三、 复杂对象类型的WebService

posted @  2011-03-15 18:59  hoojo 阅读(970) |  评论 (2)   编辑

 

二、Axis2的简单WebService示例

posted @  2011-03-15 18:52  hoojo 阅读(974) |  评论 (0)   编辑

 

一、Axis2 WebService开发准备工作

posted @  2011-03-15 18:44  hoojo 阅读(1074) |  评论 (0)   编辑

 

Struts2、Spring、Hibernate整合ExtJS

posted @  2011-01-07 11:58  hoojo 阅读(4528) |  评论 (12)   编辑

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于NoSQL 之 Morphia 操作 MongoDB的详细内容...

  阅读:49次