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

    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 等等
     
     
     
    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) 编辑
     
     
     
    使用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) 编辑
     
     
     
     
    Java IO 理论笔记
    posted @ 2011-05-09 11:16 hoojo 阅读(1910) | 评论 (2) 编辑
     
     
     
     
    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) 编辑
     
     
     
     
    FreeMarker整合Spring 3
    posted @ 2011-04-19 10:12 hoojo 阅读(1885) | 评论 (5) 编辑
     
     
     
     
     
     
     
    二、CXF 入门示例
    posted @ 2011-03-29 15:55 hoojo 阅读(2748) | 评论 (2) 编辑
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    使用FolderBrowserDialog组件选择文件夹
    使用OpenFileDialog组件打开多个文
    使用OpenFileDialog组件打开对话框
    获取弹出对话框的相关返回值
    PAT 甲级 1139 First Contact (30 分)
    PAT 甲级 1139 First Contact (30 分)
    PAT 甲级 1138 Postorder Traversal (25 分)
    PAT 甲级 1138 Postorder Traversal (25 分)
    PAT 甲级 1137 Final Grading (25 分)
    PAT 甲级 1137 Final Grading (25 分)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2355521.html
Copyright © 2011-2022 走看看