1. 程式人生 > >使用mongodb的orm對映框架Morphia的一些例子

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

需要下載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);
	}
}