使用mongodb的orm映射框架Morphia的一些例子

本文介绍如何使用Morphia ORM工具与MongoDB进行交互,包括实体定义、增删改查操作及索引建立等内容。

需要下载mongodb的驱动和Morphia的jar包目前  Morphia最新为0.99不怎么更新了

package org.senssic.mongodb;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.bson.types.ObjectId;

import com.google.code.morphia.Datastore;
import com.google.code.morphia.Morphia;
import com.google.code.morphia.annotations.Embedded;
import com.google.code.morphia.annotations.Entity;
import com.google.code.morphia.annotations.Id;
import com.google.code.morphia.annotations.Indexed;
import com.google.code.morphia.annotations.Property;
import com.google.code.morphia.annotations.Reference;
import com.google.code.morphia.annotations.Transient;
import com.google.code.morphia.query.Query;
import com.google.code.morphia.query.UpdateOperations;
import com.google.code.morphia.utils.IndexDirection;
import com.mongodb.Mongo;

@Entity("wife")
class Wife {
	@Id
	private ObjectId id;
	private String name;
	private int age;

	public ObjectId getId() {
		return id;
	}

	public void setId(ObjectId id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}

@Embedded
class Address {// 嵌套文档不允许有id
	private int phonNum;
	private String addr;

	public int getPhonNum() {
		return phonNum;
	}

	public void setPhonNum(int phonNum) {
		this.phonNum = phonNum;
	}

	public String getAddr() {
		return addr;
	}

	public void setAddr(String addr) {
		this.addr = addr;
	}
}

@Entity(value = "pro", noClassnameStored = true)
// mongodb中大小写敏感
// noClassnameStored = true 是否在文档中保存类名(如果一个文档中同时存在继承则应该保留)
// 标注实体
class Pro {
	@Id
	// 指定id若为null则数据库会给定id
	private ObjectId id;
	@Property(value = "alias")
	// 重新再数据库中命名
	private String name;
	@Transient
	// 此字段将不会被持久化到数据库中
	private int age;
	@Indexed(value = IndexDirection.ASC, name = "upc", unique = true, dropDups = true)
	// value: 表名这个索引的方向; IndexDirection.ASC(升序),IndexDirection.DESC(降序),
	// IndexDirection.BOTH(两者);默认为 升序。
	// name: 被创建的索引的名称; mongodb默认创建的索引名的格式为(key1_1/-1_key2_1)。
	// unique:
	// 创建一个唯一索引,当创建唯一索引后,当在此字段插入相同的值时将会报错。true:为唯一索引;false:不是唯一索引;默认为:false。
	// dropDups:此参数表明,当为某个字段创建唯一索引时,删除其他相同值的记录。只保留第一条记录。true:删除重复;false:不删除重复(当有重复值时唯一索引创建失败);默认为false。
	// 建立索引 Datastore.ensureIndexes()需要被调用
	private List<String> hobbys;

	@Embedded
	// 映射嵌套文档
	private Address address;
	@Reference
	// 映射其他关联文档 注:此关联文档必须首先存在于数据库中
	// concreteClass: 指定具体的实体类。
	// ignoreMissing: 忽略任何不能解决的参考。
	// lazy: 为参考创建一个代理,这个将在第一次调用时加载(类似Hibernate中的lazy属性)
	// value: 指定在Mongo中存储的属性名。
	private Wife wife;

	public Wife getWife() {
		return wife;
	}

	public void setWife(Wife wife) {
		this.wife = wife;
	}

	public Address getAddress() {
		return address;
	}

	public void setAddress(Address address) {
		this.address = address;
	}

	public ObjectId getId() {
		return id;
	}

	public void setId(ObjectId id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public List<String> getHobbys() {
		return hobbys;
	}

	public void setHobbys(List<String> hobbys) {
		this.hobbys = hobbys;
	}

	@Override
	public String toString() {
		return "名字:" + this.name + "--->年龄:" + this.age;
	}
}

public class MorphiaTast {
	/**
	 * @Description: TODO
	 * @author qiss
	 * @date 2014年6月18日 上午10:21:17
	 */
	public static void main(String[] args) throws Exception {
		Mongo mg = new Mongo();
		Morphia morphia = new Morphia();
		morphia.mapPackage("Pro");
		Datastore ds = morphia.createDatastore(mg, "test");
		ds.ensureIndexes();
		ds.ensureCaps();
		Pro pro = new Pro();
		pro.setName("qiyu");
		pro.setId(new ObjectId(new Date()));
		pro.setAge(20);
		List<String> list = new ArrayList<>();
		list.add("火球");
		list.add("无球");
		pro.setHobbys(list);
		Address address = new Address();
		address.setPhonNum(123456);
		address.setAddr("安徽合肥");
		// 保存嵌套文档
		pro.setAddress(address);
		Wife wife = new Wife();
		wife.setAge(20);
		wife.setName("小丽");
		// 1.保存
		ds.save(wife);
		pro.setWife(ds.find(Wife.class).get());
		ds.save(pro);
		// 2.查询
		Pro p = ds.find(Pro.class).get();// 取得数据库中第一项
		System.out.println(p.toString());
		Query<Pro> query = ds.find(Pro.class);
		@SuppressWarnings("unchecked")
		Iterable<Pro> iterable = (Iterable<Pro>) query.iterator();
		for (Pro pr : iterable) {
			System.out.println(pr);
		}

		p = ds.find(Pro.class).field("name").equal("qiyu").get();// 条件查询
		System.out.println(p);
		// 这里是有效的操作符列表["=", "==", "!=", "<>", ">", "<", ">=", "<=", "in", "nin",
		// "all", "size", "exists"]。如果没有指定操作符默认使用"=",
		//  就像上面的例子,"="和“==”是等价的表示相等,"!="和"<>"是等价的表示不相等。
		List<Pro> ls = ds.find(Pro.class, "name =", "qiyu").asList();
		System.out.println("-------");
		for (Pro pro2 : ls) {
			System.out.println(pro2);
		}
		// 3.删除
		// ds.delete(ds.find(Pro.class, "name =", "qiyu"));// 通过查询删除
		// ds.delete(Pro.class, new ObjectId("53a0e3ccd815c4b3e33ccea1"));//
		// 通过id删除
		// ds.delete(ds.createQuery(Pro.class).filter("name", "sensen"));//
		// 删除过滤项(name为sensen的都删除)
		// FindAndDelete()//如删除一个实体,并且同时返回要删除的项。
		// 4.更新
		List<String> liStrings = new ArrayList<>();
		liStrings.add("上天");
		liStrings.add("下海");
		UpdateOperations<Pro> updateOperations = ds
				.createUpdateOperations(Pro.class).set("name", "lilili")
				.set("hobbys", liStrings);
		ds.update(ds.createQuery(Pro.class), updateOperations);
	}
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值