上两篇文章:http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.htmlhtml
http://www.cnblogs.com/hoojo/archive/2011/06/02/2068665.htmljava
介绍到了在MongoDB的控制台完成MongoDB的数据操做、以及经过Java MongoDB 的驱动完成在Java中对MongoDB的操做,经过前两篇文章咱们对MongoDB有了全面、深入的认识和理解。如今咱们就看看利用Morphia库来操做MongoDB。git
开发环境:github
System:Windowsmongodb
IDE:eclipse、MyEclipse 8数据库
Database:mongoDB数组
开发依赖库:缓存
JavaEE五、mongo-2.5.3.jar、junit-4.8.2.jarapp
Email:hoojo_@126.comless
Blog:http://blog.csdn.net/IBM_hoojo
一、 首先,下载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
二、 下面创建一个JavaProject工程,导入下载下来的驱动包。便可在Java中使用Morphia,目录以下:
在本示例以前你须要启动mongod.exe的服务,在你安装mongoDB的目录中,找到mongod.exe启动服务后,下面的程序才能顺利执行;
一、 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;
}
}
二、 完成索引操做,首先创建一个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);
}
}
三、 下面完成对象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能够利用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;
}
}
二、 对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();
}
}
一、 首先添加以下准备代码,随后的方法直接添加到该文件中便可
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();
}
}
二、 增删改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();
}
三、 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());
}
四、 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());
}
五、 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());
}
六、 其余操做
@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?