使用mongodb的orm對映框架Morphia的一些例子
阿新 • • 發佈:2018-12-24
需要下載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); } }