NoSQL 之 Morphia 操作 MongoDB

系统 2991 0
 

上两篇文章: 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

IDE:eclipse、MyEclipse 8

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,目录如下:

clip_image002

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

JavaEE
EJB、JDBC、JDO、RMI、JPA、JTA、JMS、 JCA、 JNDI 等等
 
 
 
 
 
JSP 手记
posted @  2012-01-29 14:44  hoojo 阅读(187) |  评论 (0)   编辑
 
 
 
 
 
 
 
Spring REST
posted @  2011-06-10 11:08  hoojo 阅读(2015) |  评论 (5)   编辑
 
 
 
 
 
 
 
 
Jibx 处理XML
posted @  2011-04-27 11:47  hoojo 阅读(1096) |  评论 (0)   编辑
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

NoSQL 之 Morphia 操作 MongoDB


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论