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

时间:2022-06-25 01:28:39

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