314598340 发表于 2016-12-2 09:33:59

Mongo的ORM框架的学习Morphia(十) morphia应用

  转自:http://topmanopensource.iyunv.com/blog/1439688


package com.easyway.mongodb.model;
import com.google.code.morphia.annotations.Embedded;
import com.google.code.morphia.annotations.Property;
/**
*
* @Title: mongo的框架morphia的学习
* @Description:
* @Copyright:Copyright (c) 2011
* @Company:易程科技股份有限公司
* @Date:2012-2-29
* @author longgangbai
* @version 1.0
*/
@Embedded
public class Address {
@Property("address_street")
private String street;
@Property
private String postCode;
public Address() {
super();
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getPostCode() {
return postCode;
}
public void setPostCode(String postCode) {
this.postCode = postCode;
}
}


package com.easyway.mongodb.model;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.Vector;
import com.google.code.morphia.annotations.Embedded;
import com.google.code.morphia.annotations.Entity;
import com.google.code.morphia.annotations.Transient;
/**
*
* @Title: mongo的框架morphia的学习
* @Description:
* @Copyright:Copyright (c) 2011
* @Company:易程科技股份有限公司
* @Date:2012-2-29
* @author longgangbai
* @version 1.0
*/
@Entity("hotels")
public class Hotel extends BasicEntry {
private static final long serialVersionUID = 1L;

public enum Type { BUSINESS, LEISURE }
private String name;
private Date startDate;
private Date endDate;

private int stars;
private boolean takesCreditCards;
private Type type;
private Set<String> tags;
public static Hotel createHotel(){
return new Hotel();
}
@Transient
private String temp;
@Embedded
private Address address;
@Embedded(concreteClass = Vector.class)
private List<PhoneNumber> phoneNumbers;
private Hotel() {
super();
tags = new HashSet<String>();
phoneNumbers = new Vector<PhoneNumber>();
}
public Date getEndDate() {
return endDate;
}

public void setEndDate(Date endDate) {
this.endDate = endDate;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getStars() {
return stars;
}
public void setStars(int stars) {
this.stars = stars;
}
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
public boolean isTakesCreditCards() {
return takesCreditCards;
}
public void setTakesCreditCards(boolean takesCreditCards) {
this.takesCreditCards = takesCreditCards;
}
public Type getType() {
return type;
}
public void setType(Type type) {
this.type = type;
}
public Set<String> getTags() {
return tags;
}
public void setTags(Set<String> tags) {
this.tags = tags;
}
public List<PhoneNumber> getPhoneNumbers() {
return phoneNumbers;
}
public void setPhoneNumbers(List<PhoneNumber> phoneNumbers) {
this.phoneNumbers = phoneNumbers;
}
public String getTemp() {
return temp;
}
public void setTemp(String temp) {
this.temp = temp;
}
}


package com.easyway.mongodb.model;
import com.google.code.morphia.annotations.Embedded;
import com.google.code.morphia.annotations.Property;
/**
*
* @Title: mongo的框架morphia的学习
* @Description:
* @Copyright:Copyright (c) 2011
* @Company:易程科技股份有限公司
* @Date:2012-2-29
* @author longgangbai
* @version 1.0
*/
@Embedded
public class PhoneNumber {
public enum Type { PHONE, FAX }
@Property
private int countryCode;
@Property
private int localExtension;
@Property
private Type type;
public PhoneNumber() {
this.type = Type.PHONE;
}
public PhoneNumber( int countryCode, int localExtension, Type type ) {
this.countryCode = countryCode;
this.localExtension = localExtension;
this.type = type;
}
public int getCountryCode() {
return countryCode;
}
public void setCountryCode(int countryCode) {
this.countryCode = countryCode;
}
public int getLocalExtension() {
return localExtension;
}
public void setLocalExtension(int localExtension) {
this.localExtension = localExtension;
}
public Type getType() {
return type;
}
public void setType(Type type) {
this.type = type;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final PhoneNumber other = (PhoneNumber) obj;
if (this.countryCode != other.countryCode) {
return false;
}
if (this.localExtension != other.localExtension) {
return false;
}
if (this.type != other.type) {
return false;
}
return true;
}
@Override
public int hashCode() {
int hash = 5;
hash = 43 * hash + this.countryCode;
hash = 43 * hash + this.localExtension;
hash = 43 * hash + this.type.hashCode();
return hash;
}
}


package com.easyway.mongodb.model;
import java.io.Serializable;
import org.bson.types.ObjectId;
import com.google.code.morphia.annotations.Id;
/**
*
* @Title: mongo的框架morphia的学习
* @Description:
* @Copyright:Copyright (c) 2011
* @Company:易程科技股份有限公司
* @Date:2012-2-29
* @author longgangbai
* @version 1.0
*/
public abstract class BasicEntry implements Serializable {
private static final long serialVersionUID = 1L;
/** The id for this instance */
@Id
protected String id = new ObjectId().toString();
public BasicEntry() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}

  数据访问层:


package com.easyway.mongodb.dao;
import java.io.IOException;
import java.net.UnknownHostException;
import java.util.Properties;
import com.google.code.morphia.AdvancedDatastore;
import com.google.code.morphia.Datastore;
import com.google.code.morphia.Morphia;
import com.google.code.morphia.dao.BasicDAO;
import com.mongodb.DB;
import com.mongodb.Mongo;
import com.mongodb.MongoOptions;
import com.mongodb.ServerAddress;
/**
* 针对morphia的封装的DAO层
* @Title:
* @Description: 实现TODO
* @Copyright:Copyright (c) 2011
* @Company:易程科技股份有限公司
* @Date:2012-3-2
* @author
* @version 1.0
*/
public class BaseDAO<BasicEntry, String> extends BasicDAO<BasicEntry, String> {

protected static Datastore ds=null;
protected static AdvancedDatastore ads;
private static final Properties properties=new Properties();
/**
* 静态语句用于加载mongo 相关的配置文件
*/
static {
try {
properties.load(BaseDAO.class.getResourceAsStream("/Mongo-db.properties"));
initDAO();
} catch (IOException e) {
e.printStackTrace();
}
}
public BaseDAO() {
super(ds);
}
/**
* 用于初始化Mongodb 数据库的数据访问层的方法
* @throws UnknownHostException
* @throws NumberFormatException
*
*/
protected static void initDAO() throws NumberFormatException, UnknownHostException {
ServerAddress sa=new ServerAddress(properties.getProperty("mongo.db.host"),Integer.parseInt(properties.getProperty("mongo.db.port")));
MongoOptions options=new MongoOptions();
options.connectionsPerHost=Integer.parseInt(properties.getProperty("mongo.db.connectionsPerHost"));//pool size(驱动的链接池大小)./* mongod --dbpath ..\db --maxConns 20(并发数) */默认都为10
Mongo mongo=new Mongo(sa, options);
DB db=mongo.getDB(properties.getProperty("mongo.db.databaseName"));
Morphia morphia = new Morphia();
ds =   morphia.createDatastore(mongo, db.getName());
ads = (AdvancedDatastore) ds;
}
}


package com.easyway.mongodb.dao;
import java.util.Date;
import java.util.List;
import com.easyway.mongodb.model.Hotel;
import com.easyway.mongodb.model.Hotel.Type;
import com.google.code.morphia.query.Query;
import com.google.code.morphia.query.UpdateOperations;
/**
*
* @Title: mongo的框架morphia的学习
* @Description:
* @Copyright:Copyright (c) 2011
* @Company:易程科技股份有限公司
* @Date:2012-2-29
* @author longgangbai
* @version 1.0
*/
public class HotelDAO extends BaseDAO<Hotel, String> {
public HotelDAO() {
}
/**
*
*/
public void batchUpdate(int stars){
Query<Hotel> query=createQuery().filter("stars", stars);
UpdateOperations<Hotel> mods = createUpdateOperations().inc("stars", 1);
update(query, mods);
}
/**
* 条件查询
* @param hotel
*/
public List<Hotel> findHotelByCondition(int stars){
Query<Hotel> query=createQuery().filter("stars", stars).order("stars");
return find(query).asList();
}
/**
* 保存的方法
* @param hotel
*/
public void updateHotel(Hotel hotel){
}
/**
* 统计小于 stars<5 的hotel
* @return
*/
public Long countHotel(){
Query<Hotel> query=this.createQuery().field("stars").lessThan(5);
return this.count(query);
}
/**
* 删除Hotel
* @param hotelId
*/
public void deleteHotelById(String hotelId){
this.deleteById(hotelId);
}
/**
* 根据id查询Hotel
* @param hotelId
* @return
*/
public Hotel getHotelById(String hotelId){
return this.get(hotelId);
}
/**
* 批量删除hotel对象
*/
public void deleteByQuery() {
Query<Hotel> query=createQuery();
query.filter("stars in", new Integer[]{3,4});
this.deleteByQuery(query);
}

/**
* 保存的方法
* @param hotel
*/
public void saveHotel(Hotel hotel){
super.save(hotel);
}
/**
* 分页的方法
* @param offset
* @param limit
* @param order
* @return
*/
public List<Hotel> pageQuery(int offset,int limit,String order){
return this.createQuery().limit(limit).offset(offset).order(order).asList();
}
/**
* 查询是否存在特定类型的酒店
* @param type
* @return
*/
public boolean queryBusinessHotelType(Type type){
return this.exists("type", type);
}
/**
* 根据特定字段查询相关的Hotel
* @param fieldName
* @param fieldValue
* @return
*/
public Hotel findHotel(String fieldName,Object fieldValue){
return this.findOne(fieldName, fieldValue);
}
/**
* <p>Create a filter based on the specified condition and value.
* </p><p>
* <b>Note</b>: Property is in the form of "name op" ("age >").
* </p><p>
* Valid operators are ["=", "==","!=", "<>", ">", "<", ">=", "<=", "in", "nin", "all", "size", "exists"]
* </p>
* <p>Examples:</p>
*
* <ul>
* <li>{@code filter("yearsOfOperation >", 5)}</li>
* <li>{@code filter("rooms.maxBeds >=", 2)}</li>
* <li>{@code filter("rooms.bathrooms exists", 1)}</li>
* <li>{@code filter("stars in", new Long[]{3,4}) //3 and 4 stars (midrange?)}</li>
* <li>{@code filter("age >=", age)}</li>
* <li>{@code filter("age =", age)}</li>
* <li>{@code filter("age", age)} (if no operator, = is assumed)</li>
* <li>{@code filter("age !=", age)}</li>
* <li>{@code filter("age in", ageList)}</li>
* <li>{@code filter("customers.loyaltyYears in", yearsList)}</li>
* </ul>
*
* <p>You can filter on id properties <strong>if</strong> this query is
* restricted to a Class<T>.
* 时间重叠规律:
*   酒店入住时间的开始时间小于等于查询条件的结束时间,并且酒店入住时间的结束时间大于等于查询条件的开始时间
*/
public boolean queryHotelHasPerson(Date startDate,Date endDate,String name){
return this.createQuery()
.filter("name=", name)
.filter("startDate >=",endDate)
.filter("endDate <=", startDate)
.countAll()>0;
}
}

  测试类:


package com.easyway.mongodb.app;
import java.util.Date;
import com.easyway.mongodb.dao.HotelDAO;
import com.easyway.mongodb.model.Address;
import com.easyway.mongodb.model.Hotel;
/**
*
* @Title: TODO
* @Description: 实现TODO
* @Copyright:Copyright (c) 2011
* @Company:易程科技股份有限公司
* @Date:2012-3-2
* @author
* @version 1.0
*/
public class HotelApp {
public static void main(String[] args) {
HotelDAOhotelDAO=new HotelDAO();
Hotel borg =Hotel.createHotel();
borg.setName("Hotel Borg");
borg.setStars(4);
borg.setTakesCreditCards(true);
borg.setStartDate(new Date());
borg.setType(Hotel.Type.LEISURE);
Address borgAddr = new Address();
borgAddr.setStreet("Posthusstraeti 11");
borgAddr.setPostCode("101");
borg.setAddress(borgAddr);
hotelDAO.save(borg);
long count=hotelDAO.countHotel();
System.out.println("count="+count);
}
}

 
页: [1]
查看完整版本: Mongo的ORM框架的学习Morphia(十) morphia应用