- 浏览: 156660 次
文章分类
- 全部博客 (141)
- js 异步加载 (1)
- 延迟触发 jquery (1)
- android (2)
- Maven Spring Ibatis (1)
- android多线程 (1)
- 技术文章 (2)
- 面试总结 (3)
- Java (3)
- Java程序员 (1)
- linux (2)
- 【Android开发学习之路】 (1)
- ios 技术点 (1)
- Javascript (2)
- 心得 8月 (1)
- 架构师之路 (1)
- leopard dm365 gstreamer (1)
- Oracle (2)
- VC++ (1)
- BFS (1)
- [C++] (1)
- 管理 (1)
- 图像处理 (1)
- DP (2)
- 数据库(SQL Server) (1)
- 系统分析 (1)
- ACM ----- 做不出来刷水题健身 (1)
- 错误笔记 (1)
- 数据库学习 (1)
- Android学习记录 (1)
- 数据库 (1)
- 排序 (1)
- 线段树 (1)
- 散文 (1)
- android开发 (1)
- 杂谈 (1)
- 业务逻辑层 (1)
- 微软等数据结构与算法面试100题 (1)
- c++ (1)
- 数据结构 (1)
- ACM ----基础题 (1)
- ACM_计算几何 (1)
- 学习 (1)
- python与网络编程 (1)
最新评论
-
不死咸鱼:
需要购买视频
JBPM4+ExtJS实战视频教程 -
iame:
good,打算在新项目中使用,thanks
javascript模版引擎-tmpl的bug修复与性能优化 -
lhf1990729:
图片打不开啊。少年。。
[置顶] 通向架构师的道路(第十四天)Axis2 Web Service安全(二) -
gtrgtr:
不错...
java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor错误解决办法 -
nodejs:
这个世界这是怎么了?http://nodejs.iteye.c ...
代码之谜 - 为什么 jdk 中把 String 类设计成 final
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, morphia-0.99.jar
Email:hoojo_@126.com
Blog:http://blog.csdn.net/IBM_hoojo
一、准备工作
1、 首先,下载mongoDB对Java支持的驱动包
驱动包下载地址:https://github.com/mongodb/mongo-java-driver/downloads
mongoDB对Java的相关支持、技术:http://www.mongodb.org/display/DOCS/Java+Language+Center
驱动源码下载:https://download.github.com/mongodb-mongo-java-driver-r2.6.1-7-g6037357.zip
在线查看源码:https://github.com/mongodb/mongo-java-driver
Morphia jar包下载:http://code.google.com/p/morphia/downloads/list
2、 下面建立一个JavaProject工程,导入下载下来的驱动包。即可在Java中使用Morphia,目录如下:
二、Java操作MongoDB示例
在本示例之前你需要启动mongod.exe的服务,在你安装mongoDB的目录中,找到mongod.exe启动服务后,下面的程序才能顺利执行;
1、 Java操作mongoDB数据库,操作索引
Mongo mongo = new Mongo();
这样就创建了一个MongoDB的数据库连接对象,它默认连接到当前机器的localhost地址,端口是27017。
DB db = mongo.getDB(“test”);
这样就获得了一个test的数据库,如果mongoDB中没有创建这个数据库也是可以正常运行的。如果你读过上一篇文章就知道,mongoDB可以在没有创建这个数据库的情况下,完成数据的添加操作。当添加的时候,没有这个库,mongoDB会自动创建当前数据库。
得到了db,下一步我们要获取一个“聚集集合DBCollection”,通过db对象的getCollection方法来完成。
DBCollection users = db.getCollection("users");
这样就获得了一个DBCollection,它相当于我们数据库的“表”。
查询所有数据
DBCursor cur = users.find();
while (cur.hasNext()) {
System.out.println(cur.next());
}
用BasicDBObjectBuilder,向users对象中添加数据
user = BasicDBObjectBuilder.start("id", 1546555)
.append("name", "jojo").add("address", "gz")
.append("email", "hoojo_@126.com")
.get();
插入数据
users.insert(user);
可以利用JSON工具来序列化对象数据
JSON.serialize(cur)
完整源码
package com.hoo.test; import java.net.UnknownHostException; import com.hoo.entity.User; import com.hoo.util.BasicDBObjectUtils; import com.mongodb.BasicDBObjectBuilder; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.DBObject; import com.mongodb.Mongo; import com.mongodb.MongoException; import com.mongodb.util.JSON; /** * <b>function:</b> Mongo实例对象的相关方法测试 * @author hoojo * @createDate 2011-5-24 下午02:42:29 * @file MongoDBTest.java * @package com.hoo.test * @project MongoDB * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class MongoDBTest { public static void main(String[] args) throws UnknownHostException, MongoException { Mongo mg = new Mongo(); System.out.println("查询所有的Database的名称"); for (String name : mg.getDatabaseNames()) { System.out.println("dbName: " + name); } System.out.println("查询test库中的所有collection集合(表)名称"); DB db = mg.getDB("test"); for (String name : db.getCollectionNames()) { System.out.println("collectionName: " + name); } System.out.println("添加测试数据"); DBCollection users = db.getCollection("users"); try { // 用自定义BasicDBObjectUtils工具类,将User Enity对象转换成DBObject DBObject user = BasicDBObjectUtils.castModel2DBObject(new User("345567", "jack", 22, "beijin")); users.insert(user); // 用BasicDBObjectBuilder构建一个DBObject对象 user = BasicDBObjectBuilder.start("id", 1546555).append("name", "jojo").add("address", "gz").append("email", "hoojo_@126.com").get(); users.insert(user); } catch (Exception e) { e.printStackTrace(); } System.out.println("游标查询所有users集合数据"); DBCursor cur = users.find(); while (cur.hasNext()) { System.out.println(cur.next()); } System.out.println("查询游标相关内容"); System.out.println(cur.count()); System.out.println(cur.getCursorId()); System.out.println(cur.getOptions()); System.out.println(cur.getQuery()); System.out.println(cur.getSizes().listIterator()); System.out.println(cur.itcount()); //System.out.println(cur.length()); System.out.println(cur.size()); System.out.println(cur.numGetMores()); System.out.println(cur.curr()); //System.out.println(cur.toArray().get(0)); System.out.println("显示游标查询到的所有内容: " + JSON.serialize(cur)); } }
工具类,将带有getter、setter方法的Java类序列化成DBObject对象
package com.hoo.util; import java.lang.reflect.Method; import com.mongodb.BasicDBObject; import com.mongodb.DBObject; /** * <b>function:</b> 将Entity/Model转换成DBObject * @author hoojo * @createDate 2011-5-30下午01:53:08 * @file BasicDBObjectUtil.java * @package com.hoo.util * @project MongoDB * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ publicclass BasicDBObjectUtils { public static<T> DBObject castModel2DBObject(T entity) throws Exception { Method[] method = entity.getClass().getMethods(); DBObject dbObject = new BasicDBObject(); for (Method m : method) { //System.out.println(m.getName()); if (m.getName().startsWith("get")) { String name = m.getName().replace("get", ""); for (Method m2 : method) { if (m2.getName().equals("set" + name)) { name = name.substring(0, 1).toLowerCase() + name.substring(1); Object returnVal = m.invoke(entity, new Object[] {}); if (returnVal != null) { //System.out.println(name + " : " + m.invoke(shipping, new Object[] {})); dbObject.put(name, returnVal); } } } } } System.out.println("dbObject: " + dbObject); return dbObject; } }
2、 完成索引操作,首先建立一个MongoDB4IndexTest.java,基本测试代码如下:
package com.hoo.test; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import org.bson.types.ObjectId; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.mongodb.BasicDBObject; import com.mongodb.Bytes; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.DBObject; import com.mongodb.Mongo; import com.mongodb.MongoException; import com.mongodb.QueryOperators; import com.mongodb.util.JSON; /** * <b>function:</b> 实现MongoDB的Index操作 * @author hoojo * @createDate 2011-6-2 下午03:21:23 * @file MongoDB4IndexTest.java * @package com.hoo.test * @project MongoDB * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class MongoDB4IndexTest { private Mongo mg = null; private DB db; private DBCollection users; @Before public void init() { try { mg = new Mongo(); //mg = new Mongo("localhost", 27017); } catch (UnknownHostException e) { e.printStackTrace(); } catch (MongoException e) { e.printStackTrace(); } //获取temp DB;如果默认没有创建,mongodb会自动创建 db = mg.getDB("temp"); //获取users DBCollection;如果默认没有创建,mongodb会自动创建 users = db.getCollection("users"); } @After public void destory() { if (mg != null) mg.close(); mg = null; db = null; users = null; System.gc(); } public void print(Object o) { System.out.println(o); } }
3、 下面完成对象Collection的index的操作
/** * <b>function:</b> 测试Collection的index相关操作 * @author hoojo * @createDate 2012-2-16 下午08:32:26 */ @Test public void testIndex() { query(); for (DBObject index : coll.getIndexInfo()) { print("IndexInfo: " + index); } coll.dropIndexes(); //创建索引 coll.createIndex(new BasicDBObject("name", "idx_name")); print(coll.findOne(new BasicDBObject("name", "haha"))); coll.createIndex(coll.findOne(new BasicDBObject("name", "haha"))); DBObject o = new BasicDBObject("unique", true); //coll.createIndex(coll.findOne(), o); // 修改索引,如果存在就修改不存在就添加 coll.ensureIndex(o); coll.ensureIndex("age_1"); coll.ensureIndex(new BasicDBObject("age3_1", 6), new BasicDBObject("ts", -1)); coll.ensureIndex(new BasicDBObject("age_2", 1), new BasicDBObject( "ts" , 1 )); coll.ensureIndex(new BasicDBObject("password", 2), new BasicDBObject( "z" , "idx" )); coll.ensureIndex(new BasicDBObject("password", 1), new BasicDBObject( "etc" , "idx" )); // 创建唯一索引 coll.ensureIndex(new BasicDBObject("emial", 2), new BasicDBObject("unique", false)); // 创建索引,指定索引名称default_index coll.ensureIndex(new BasicDBObject("address", 1), new BasicDBObject( "name" , "default_index")); // 创建索引对象,索引名称user_index coll.ensureIndex(coll.findOne(new BasicDBObject("name", "hoho")), "user_index"); // 唯一索引 coll.ensureIndex(coll.findOne(new BasicDBObject("name", "hehe")), "users_index_unique", true); // 查询所有索引 for (DBObject index : coll.getIndexInfo()) { print("IndexInfo: " + index); } print(DBCollection.genIndexName(coll.findOne())); //coll.dropIndex(coll.findOne()); print(DBCollection.genIndexName(new BasicDBObject("password", 2))); //coll.dropIndex(DBCollection.genIndexName(new BasicDBObject("password", 2))); //coll.dropIndexes(); //coll.dropIndexes("assword_1"); }
三、Morphia基本操作
1、 morphia可以利用annotation对JavaEntity进行注解,那样我们就可以用morphia操作JavaEntity对象
package com.hoo.entity; import com.google.code.morphia.annotations.Entity; import com.google.code.morphia.annotations.Id; /** * <b>function:</b> JavaEntity对象 * @author hoojo * @createDate 2011-5-31上午11:45:21 * @file User.java * @package com.hoo.entity * @project Morphia * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ //利用morphia的annotation进行注解 @Entity public class User { @Id private long id; private String name; private boolean sex; private int age; private String address; public User() { } public User(long id, String name, boolean sex, int age, String address) { super(); this.id = id; this.name = name; this.sex = sex; this.age = age; this.address = address; } //getter、setter @Override public String toString() { return this.id + "#" + this.name + "#" + this.age + "#" + this.sex + "#" + this.address; } }
2、 对Morphia对象一些简单的使用,看看该对象提供了哪些基本的操作方法
package com.hoo.test.morphia; import java.net.UnknownHostException; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.google.code.morphia.Datastore; import com.google.code.morphia.EntityInterceptor; import com.google.code.morphia.Morphia; import com.google.code.morphia.mapping.MappedClass; import com.google.code.morphia.mapping.Mapper; import com.google.code.morphia.mapping.cache.EntityCache; import com.hoo.entity.User; import com.mongodb.BasicDBObjectBuilder; import com.mongodb.Mongo; import com.mongodb.MongoException; /** * <b>function:</b> morphia对象的简单测试 * @author hoojo * @createDate 2011-5-31上午11:30:20 * @file MorphiaTest.java * @package com.hoo.test * @project Morphia * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class MorphiaTest { private Mongo mongo; private Morphia morphia; @Before public void init() { try { mongo = new Mongo(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (MongoException e) { e.printStackTrace(); } morphia = new Morphia(); } private void print(Object o) { if (o != null) { System.out.println(o.toString()); } } /** * <b>function:</b> morphia对象的简单测试 * @author hoojo */ @SuppressWarnings("deprecation") @Test public void testMorphia() { // 创建一个Datastore,过时的方法不推荐使用 Datastore ds = morphia.createDatastore("myTestDB"); print("createDatastore: " + ds); // 创建ds ds = morphia.createDatastore(mongo, "myTestDB"); print("createDatastore: " + ds); // 创建一个带用户名、密码的ds //ds = morphia.createDatastore(mongo, "myTestDB", "admin", new char[] { '1', '2', '3', '4', '5', '6' }); // 设置操作资源对象,这里设置User.class 就可以完成对User的一系列操作 //morphia.map(User.class); //morphia.mapPackage("com.hoo.entity");//会把整个包下面的类都加载进来 // 将对象转成DBObject print("toDBObject: " + morphia.toDBObject(new User(System.currentTimeMillis(), "jackson", true, 22, null))); // 将参数2转换成参数1的类型 print("fromDBObject: " + morphia.fromDBObject(User.class, BasicDBObjectBuilder.start("sex", true).get())); print("getMapper: " + morphia.getMapper()); print("isMapped: " + morphia.isMapped(User.class)); } /** * <b>function:</b> 对Mapper对象相关操作 * @author hoojo * @createDate 2012-2-16下午10:20:38 */ @Test public void testMapper() { Mapper mapper = morphia.getMapper(); // 添加对象映射 print("addMappedClass: " + mapper.addMappedClass(User.class)); //print(mapper.addMappedClass(mapper.addMappedClass(User.class)); // 创建实体缓存 print("createEntityCache: " + mapper.createEntityCache()); print(mapper.getCollectionName("myTestDB")); print(mapper.getConverters()); User user = new User(System.currentTimeMillis(), "jackson", true, 22, null); user.setId(1306814012734L); print(mapper.getId(user)); for (EntityInterceptor ei : mapper.getInterceptors()) { System.out.println("EntityInterceptor: " + ei); } // 查询主键 print("getKey: " + mapper.getKey(user)); // 所有已经映射的class for (MappedClass mc : mapper.getMappedClasses()) { System.out.println("getMappedClasses: " + mc); } print("mcMap: " + mapper.getMCMap()); print("getOptions: " + mapper.getOptions()); print("keyToRef: " + mapper.keyToRef(mapper.getKey(user))); print("refToKey: " + mapper.refToKey(mapper.keyToRef(mapper.getKey(user)))); } /** * <b>function:</b> 实体缓存 * @author hoojo */ @Test public void testEntityCache() { EntityCache ec = morphia.getMapper().createEntityCache(); print("EntityCache: " + ec); Datastore ds = morphia.createDatastore(mongo, "myTestDB"); User user = new User(System.currentTimeMillis(), "jackson", true, 22, null); user.setId(1306814012734L); // 添加实体 ec.putEntity(ds.getKey(user), user); // 代理 ec.putProxy(ds.getKey(user), user); print("getKey: " + ds.getKey(user)); print("getProxy: " + ec.getProxy(ds.getKey(user))); print("getEntity: " + ec.getEntity(ds.getKey(user))); print(ec.exists(ds.getKey(user))); print("stats: " + ec.stats()); } @After public void destory() { mongo = null; morphia = null; System.gc(); } }
四、利用Morphia完成对Datastore对象的CRUD操作
1、 首先添加如下准备代码,随后的方法直接添加到该文件中即可
package com.hoo.test.ds; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.google.code.morphia.Datastore; import com.google.code.morphia.Key; import com.google.code.morphia.Morphia; import com.google.code.morphia.query.UpdateOperations; import com.hoo.entity.User; import com.mongodb.Mongo; import com.mongodb.MongoException; /** * <b>function:</b> Datastore增删改查操作 * @author hoojo * @createDate 2011-5-31下午06:29:04 * @fileDatastore DatastoreTest.java * @package com.hoo.test.ds * @project Morphia * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class DatastoreTest { private Mongo mongo; private Morphia morphia; private Datastore ds; @Before public void init() { try { mongo = new Mongo(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (MongoException e) { e.printStackTrace(); } morphia = new Morphia(); morphia.map(User.class); ds = morphia.createDatastore(mongo, "temp"); } private void print(Object o) { if (o != null) { System.out.println(o.toString()); } } /** * <b>function:</b> 查询所有 * @author hoojo * @createDate 2012-2-16 下午10:36:13 */ private void query() { Iterable<User> it = ds.createQuery(User.class).fetch(); while(it.iterator().hasNext()) { print("fetch: " + it.iterator().next()); } } @After public void destory() { mongo = null; morphia = null; ds = null; System.gc(); } }
2、 增删改CUD操作
/** * <b>function:</b> CUD增删改 * @author hoojo * @createDate 2012-2-16 下午10:46:08 */ @Test public void testCUD() { // 添加测试数据 for (int i = 0; i < 50; i++) { User u = new User(System.currentTimeMillis() + i, "test-" + i, ((i % 2 == 0)? true: false), 18 + i, "china-gz#" + i); print(ds.save(u)); } //ds.delete(ds.createQuery(User.class)); List<User> users = new ArrayList<User>(); users.add(new User(1306907246518L, "zhangsan", true, 22, "china-gz")); User user = new User(System.currentTimeMillis() + 3, "zhaoliu", true, 29, "china-beijin"); users.add(user); users.add(new User(System.currentTimeMillis() + 6, "wangwu", true, 24, "china-shanghai")); users.add(new User(System.currentTimeMillis() + 9, "lisi", true, 26, "china-wuhan")); //添加集合 print("save: " + ds.save(users)); //添加数组 print("save: " + ds.save(users.toArray())); this.query(); print("getKey: " + ds.find(User.class, "id", 1306907246518L).getKey()); //修改操作 UpdateOperations<User> uo = ds.createUpdateOperations(User.class); print("update: " + ds.update(ds.find(User.class, "id", 1306907246518L).getKey(), uo).getUpdatedCount()); uo.add("name", "zhaoliuliu").set("age", 29).set("sex", true).add("address", "gzz"); print("update: " + ds.update(ds.find(User.class, "id", 1306907246518L).getKey(), uo).getUpdatedCount()); print("update: " + ds.update(ds.createQuery(User.class).field("id").equal(1306907246518L), uo).getUpdatedCount()); print("update: " + ds.update(ds.find(User.class, "id", 1306907246518L), uo).getUpdatedCount()); uo = ds.createUpdateOperations(User.class); uo.set("name", "zhaoqq").set("age", 29).set("sex", true).add("address", "fzz"); print("update: " + ds.update(ds.find(User.class, "id", 1306907246518L).get(), uo).getUpdatedCount()); print("update: " + ds.update(ds.createQuery(User.class).field("id").equal(1306907246518L), uo, true).getUpdatedCount()); // 修改第一个对象 print("updateFirst: " + ds.updateFirst(ds.createQuery(User.class).field("id").equal(1306907246518L), uo).getUpdatedCount()); //当参数createIfMissing为true的时候,如果修改的对象不存在就会添加这条数据,如果为false的情况下,不存在也不添加 print("updateFirst: " + ds.updateFirst(ds.createQuery(User.class).field("id").equal(1306907246519L), uo, true).getUpdatedCount()); user.setId(1306907246518L); print("updateFirst: " + ds.updateFirst(ds.createQuery(User.class).field("id").equal(1306907246518L), user, true).getUpdatedCount()); user.setId(1306916670518L); // 合并 print("merge: " + ds.merge(user).getId()); this.query(); //删除 print("delete: " + ds.delete(ds.createQuery(User.class).field("id").equal(1306907246518L)).getN()); print("delete: " + ds.delete(ds.find(User.class, "age", 29).get()).getN()); //print("delete: " + ds.delete(User.class, 1306911594631L).getN()); //print("delete: " + ds.delete(User.class, users).getN()); //ds.delete(ds.createQuery(User.class)); this.query(); }
3、 Find查询操作
/** * <b>function:</b> find查询 * @author hoojo * @createDate 2012-2-16 下午10:45:55 */ @Test public void testFind() { print("find: " + ds.find(User.class).asList()); //like print("find-contains: " + ds.find(User.class).field("name").contains("test-1").asList()); //忽略大小写 print("find-containsIgnoreCase: " + ds.find(User.class).field("name").containsIgnoreCase("ja").asList()); print("find-endsWith: " + ds.find(User.class).field("name").endsWith("22").asList()); print("find-endsWithIgnoreCase: " + ds.find(User.class).field("name").endsWithIgnoreCase("CK").asList()); //过滤null或是没有name属性的 print("find-doesNotExist: " + ds.find(User.class).field("name").doesNotExist().asList()); //查询name有值的数据 print("find-doesNotExist: " + ds.find(User.class).field("name").exists().asList()); //age > 48 print("find-greaterThan: " + ds.find(User.class).field("age").greaterThan(66).asList()); //age >= 48 print("find-greaterThan: " + ds.find(User.class).field("age").greaterThanOrEq(66).asList()); List<Integer> ageList = new ArrayList<Integer>(); ageList.add(22); ageList.add(55); ageList.add(66); //all print("find-hasAllOf: " + ds.find(User.class).field("age").hasAllOf(ageList).asList()); //in print("find-hasAnyOf: " + ds.find(User.class).field("age").hasAnyOf(ageList).asList()); //not in print("find-hasNoneOf: " + ds.find(User.class).field("age").hasNoneOf(ageList).asList()); //elemMatch //print("find-hasThisElement: " + ds.find(User.class).field("age").hasThisElement(55).asList()); print("find-hasThisOne: " + ds.find(User.class).field("age").hasThisOne(55).asList()); print("find-in: " + ds.find(User.class).field("age").in(ageList).asList()); print("find-lessThan: " + ds.find(User.class).field("age").lessThan(20).asList()); print("find-lessThanOrEq: " + ds.find(User.class).field("age").lessThanOrEq(18).asList()); //print("find-lessThanOrEq: " + ds.find(User.class).field("age").near(.2, .8).asList()); print("find: " + ds.find(User.class, "id", 1306813979609L).get()); print("find: " + ds.find(User.class, "age", 28, 1, 2).asList()); print("findAndDelete: " + ds.findAndDelete(ds.createQuery(User.class).field("id").equal(1306813979609L))); print("find: " + ds.find(User.class).asList()); }
4、 Query查询操作
/** * <b>function:</b> query查询 * @author hoojo * @createDate 2012-2-16 下午10:40:10 */ @Test public void testQuery() { // 查询所有 print("query: " + ds.createQuery(User.class).asList()); // 查询主键 print("query key: " + ds.createQuery(User.class).asKeyList()); // 结果集数量 print("query: " + ds.createQuery(User.class).countAll()); // 抓取查询所有记录 Iterable<User> it = ds.createQuery(User.class).fetch(); while(it.iterator().hasNext()) { print("fetch: " + it.iterator().next()); } // null it = ds.createQuery(User.class).fetchEmptyEntities(); while(it.iterator().hasNext()) { print("fetchEmptyEntities: " + it.iterator().next()); } // all key Iterable<Key<User>> itkeys = ds.createQuery(User.class).fetchKeys(); while(itkeys.iterator().hasNext()) { print("fetchKeys: " + itkeys.iterator().next()); } // age > 24 print("query: " + ds.createQuery(User.class).filter("age > ", 24).asList()); // age in (20, 28) print("query: " + ds.createQuery(User.class).filter("age in ", newint[] { 20, 28 }).asList()); // limit 3 print("query: " + ds.createQuery(User.class).limit(3).asList()); // 分页类似MySQL print("query: " + ds.createQuery(User.class).offset(11).limit(5).asList()); // order排序,默认asc print("query: " + ds.createQuery(User.class).order("age").asList()); //desc print("query: " + ds.createQuery(User.class).order("-age").asList()); // 组合排序 order by age, name print("query: " + ds.createQuery(User.class).order("age, name").asList()); print("query: " + ds.createQuery(User.class).queryNonPrimary().asList()); print("query: " + ds.createQuery(User.class).queryPrimaryOnly().asList()); //如果include 为true就表示取该属性的值,其他的默认null,反之为false则该属性为null,取其他的值 print("query: " + ds.createQuery(User.class).retrievedFields(false, "age").asList()); }
5、 get和count查询
/** * <b>function:</b> get查询 * @author hoojo * @createDate 2012-2-16 下午10:39:09 */ @Test public void testGet() { User user = new User(); user.setId(1306916670518L); print("get: " + ds.get(user)); List<Long> ids = new ArrayList<Long>(); ids.add(1306907246519L); ids.add(1306916670524L); // 通过id集合查询相当于in () print("get: " + ds.get(User.class, ids).asList()); // id查询 print("get: " + ds.get(User.class, 1306916670524L)); } /** * <b>function:</b> count查询 * @author hoojo * @createDate 2012-2-16 下午10:38:02 */ @Test public void testGetCount() { User user = new User(); user.setId(1306916670518L); print("getCount: " + ds.getCount(user)); print("getCount: " + ds.getCount(User.class)); List<Long> ids = new ArrayList<Long>(); ids.add(1306907246519L); ids.add(1306916670524L); print("getCount: " + ds.getCount(ds.get(User.class, ids))); // age > 22的记录 print("getCount: " + ds.getCount(ds.createQuery(User.class).filter("age > ", 22))); // 所有 print("countAll: " + ds.get(User.class, ids).countAll()); print("countAll: " + ds.find(User.class).countAll()); }
6、 其他操作
@Test public void testOthers() { query(); /** 索引 */ ds.ensureIndexes(); // 同时用annotation也可以给指定的属性建立索引 // 只需用在JavaEntity建立索引的属性上添加annotation /*@Indexed(value = IndexDirection.ASC, name = "address_index") String address; // 建立唯一索引 @Indexed(value = IndexDirection.ASC, name = "bandName", unique = true) String name;*/ ds.ensureCaps(); User user = new User(); user.setId(1306916670518L); print("getDB: " + ds.getDB()); print("getDefaultWriteConcern: " + ds.getDefaultWriteConcern()); print("DBColl: " + ds.getCollection(User.class)); // 查询User对象对应的集合 Key<User> key = ds.getKey(user); // 主键 print("getKey: " + key); print("exists: " + ds.exists(user)); //是否存在该对象 print("exists: " + ds.exists(ds.getKey(user))); print("getByKey: " + ds.getByKey(User.class, key)); List<Key<User>> keys = new ArrayList<Key<User>>(); keys.add(key); user.setId(1306916670521L); keys.add(ds.getKey(user)); print("getByKey: " + ds.getByKeys(keys)); print("getByKey: " + ds.getByKeys(User.class, keys)); query(); }
用Morphia操作对象相对比较简单,它对MongoDB对Java的操作进行了一些封装,特别是查询这方面的。有没有感觉像是在用Hibernate?
相关推荐
Morphia是针对MongoDB的一个Java持久层框架,它提供了简单易用的API,使得开发者能够方便地在Java应用程序中操作MongoDB数据库。 【Morphia的安装与配置】 要在Java项目中使用Morphia,首先需要下载MongoDB的Java...
1. **连接MongoDB**:使用`MongoClient`和`MongoDatabase`,Morphia可以建立到MongoDB服务器的连接,并选择要操作的数据库。 2. **数据存取**:通过`Datastore`接口,我们可以执行CRUD(创建、读取、更新、删除)...
Morphia是为MongoDB设计的一个强大的Object Document Mapper (ODM)库,它允许Java开发者以面向对象的方式与MongoDB进行交互,极大地简化了数据库操作。 在“morphia-mongodb-examples”项目中,我们看到的是一个...
聚合操作是MongoDB的核心功能之一,通过一系列操作符,如`$project`、`$unwind`、`$match`和`$group`,可以实现复杂的数据处理和分析。在上述需求中,聚合流程大致如下: 1. `$match`:首先,筛选出指定时间范围内...
在传统的SQL世界里,ORM框架如Hibernate简化了与数据库的交互,而在NoSQL领域,Morphia扮演着相同的角色,使得开发者能够以面向对象的方式操作MongoDB数据,而无需直接编写低级的MongoDB查询语言。 **1. MongoDB和...
在本项目“mongodbWeb”中,结合Spring MVC框架和Morphia库,实现了对MongoDB数据库的操作封装,便于在Web应用中进行数据管理。 **Spring MVC与MongoDB结合** Spring MVC是Spring框架的一部分,它提供了模型-视图-...
Morphia 是一个针对MongoDB的Java对象数据映射(ODM)库,它简化了在Java应用中操作非关系型数据库的过程。MongoDB 是一个流行的NoSQL数据库,以其灵活的数据模型和高性能而著称。 在这个"spring MVC morphia mongo...
学习这个项目,你将能够掌握如何在Spring应用中集成MongoDB,使用Morphia进行数据操作,以及如何通过Spring Data接口编写灵活的查询。这将增强你处理非结构化数据的能力,对于构建基于Java的现代Web应用非常有帮助。...
"Morphia-example-1:Java中使用Morphia ODM和Spring的示例项目" 是一个基于Java开发的项目,其主要目的是展示如何在Java应用程序中使用Morphia对象数据映射(ODM)库来操作MongoDB数据库,并结合Spring框架进行集成...
在NoSQL数据库中,通常不支持传统的关系型数据库中的join操作。然而,可以通过其他方式实现类似的功能。 ##### 5.1 出错代码 尝试直接使用类似于关系型数据库中的join语法可能会失败。 ```java Query<Account> ...
MongoDB Java驱动程序是Java应用程序与MongoDB通信的官方接口,提供了丰富的功能,如连接管理、查询构建、数据操作等。 Morphia的主要特点包括: 1. 自动数据绑定:Morphia可以自动将Java对象转换为MongoDB文档,...
MongoDB是一个非关系型(NoSQL)数据库,以其灵活性、高性能和横向扩展性著称。GlacialMapper与MongoDB的集成使得Java开发者能够利用这些特性,尤其是在处理大规模、非结构化数据时。 4. **核心功能** - **实体...
在Java Play Framework中,Morphia是用于操作MongoDB的一个对象数据映射(ODM)库。它的核心功能是将Java对象转换为MongoDB中的文档,反之亦然。这使得开发人员能够利用面向对象编程的优点,同时享受到NoSQL数据库的...
Morphia一个nosql的ORM框架 对此二次封装
Morphia不仅提高了开发效率,还通过其丰富的API简化了对MongoDB的操作,使其成为Java开发者处理NoSQL数据的理想工具。 #### 二、Morphia查询基础 Morphia支持多种查询方法,包括过滤条件、排序、偏移量、限制等。...
MongoDB是一种流行的NoSQL数据库系统,特别适用于处理大规模非结构化或半结构化的数据。它以其面向文档的数据模型,灵活性和高性能而受到青睐。在Java开发中,MongoDB经常被用作后端存储,因为它提供了丰富的Java...
这使得开发者可以使用熟悉的 Spring 模式来操作 NoSQL 数据库,提高了开发效率和代码的可维护性。在实际项目中,还需要考虑事务管理、数据安全、性能优化等高级话题,确保系统的稳定和高效运行。
1. **对象-文档映射(Object-Document Mapping, ODM)**:Morphia通过注解或配置文件将Java对象映射到MongoDB的文档结构,允许开发者使用面向对象的方式来操作数据,降低了学习曲线。 2. **自动类型转换**:Morphia...