Morphia操作MongoDB

MongoDB基于分布式文件存储,是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。Morphia 是一个针对Mongo和Java 对象转换的映射的轻量级ORM类型的安全类库。

一、建立工程,工程结构和使用的jar包如下图:



二、代码片段:

1、Hotel.java

package test;

import java.util.Date;

import org.bson.types.ObjectId;

import com.google.code.morphia.annotations.Entity;
import com.google.code.morphia.annotations.Indexed;

import com.google.code.morphia.annotations.Id;
import com.google.code.morphia.utils.IndexDirection;

/**
 * 酒店实体类
 * @author 丑哥最风骚
 * @date 2014-01-10
 */

@Entity(value="m_hotel",noClassnameStored=true)
public class Hotel {
	@Id
	private ObjectId id;				// 主键
	
	@Indexed(value=IndexDirection.ASC, name="hotelName", unique=true, dropDups=true)
	private String hotelName;			// 酒店名称
	
	private String hotelAddress;		// 酒店地址
	private int price;					// 酒店最低价格
	private Date createTime;			// 实体类创建时间
	
	
	public ObjectId getId() {
		return id;
	}
	public void setId(ObjectId id) {
		this.id = id;
	}
	public String getHotelName() {
		return hotelName;
	}
	public void setHotelName(String hotelName) {
		this.hotelName = hotelName;
	}
	public String getHotelAddress() {
		return hotelAddress;
	}
	public void setHotelAddress(String hotelAddress) {
		this.hotelAddress = hotelAddress;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	public Date getCreateTime() {
		return createTime;
	}
	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}
}


2、MorphiaUtil.java

package test;

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.mapping.Mapper;
import com.google.code.morphia.query.Query;
import com.google.code.morphia.query.UpdateOperations;
import com.mongodb.Mongo;

/**
 * CURD的常用函数
 * @author 丑哥最风骚
 * @date 2014-01-10
 */

public class MorphiaUtil {
	private Datastore ds;		// 数据库
	
	/**
	 * 构造函数
	 */
	public MorphiaUtil() throws Exception {
		Morphia morphia = new Morphia();
		Mongo mongo = new Mongo("127.0.0.1", 27017);	// 连接数据库,默认端口27017
		ds = morphia.createDatastore(mongo, "mydb");		// 定义一个数据库,名为mydb
//		ds = morphia.createDatastore(mon, dbName, user, pw)	// 当数据库带有账号和密码时,使用这个定义
	}
	
	
	// 增加一条记录(增加记录,一般情况下由mongoDB自动生成主键的值)
	public void add(Hotel hotel) {
		ds.save(hotel);
	}
	
	// 删除一条记录
	public void delete(Hotel hotel) {
		ds.delete(hotel);
	}
	
	// 删除某个表下的所有记录
	public void deleteAll() {
		Query<Hotel> query = ds.createQuery(Hotel.class);		// 建立一个查询器
		ds.delete(query);
	}
	
	// 根据条件删除一条记录
	public void delete(String id) {
		Query<Hotel> query = ds.createQuery(Hotel.class);
		query.field(Mapper.ID_KEY).equal(ObjectId.massageToObjectId(id));		// 主键必须由String转为ObjectId
		ds.delete(query);
	}
	
	// 查询记录个数
	public int getHotelCnt() {
		Query<Hotel> query = ds.createQuery(Hotel.class);
		// 如果带条件查询
//		query.field("hotelName").equal("如家酒店");
		return (int) query.countAll();
	}
	
	// 查询结果(明确知道只有一条记录,比如通过主键查询)
	public Hotel getHotel(String id) {
		Query<Hotel> query = ds.createQuery(Hotel.class).retrievedFields(true, "hotelName", "hotelAddress");	// 查询结果中只关注名称和地址
		query.field(Mapper.ID_KEY).equal(ObjectId.massageToObjectId(id));		// 主键必须由String转为ObjectId
		return query.get();
	}
	
	// 查询结果 (不明确结果的个数,可以用list返回)
	public List<Hotel> getHotelList() {
		Query<Hotel> query = ds.createQuery(Hotel.class);
		query.field("hotelName").equal("如家酒店");		// 此处是精确查询
//		query.field("hotelName").contains("如家");		// 此处是模糊查询,酒店名称包含'如家' 
		query.field("price").greaterThan(100);			// 查询价格大于100的酒店
		query.field("price").lessThan(500);				// 查询价格小于500的酒店、
		
		query.and(query.criteria("hotelName").contains("如家"), 
					query.criteria("hotelAddress").contains("建设"));	// 与查询
		query.or(query.criteria("hotelName").contains("如家"), 
					query.criteria("hotelName").contains("汉庭"));		// 或查询
		
		query.order("price");							// 查询结果按价格正序排列
//		query.order("-creatTime");						// 查询结果按时间倒序排序
		
		// 分页相关,如果没有offset和limit,则一次性取出所有结果
		query.offset(0);								// 先得到查询结果集,然后从第0个开始取数据
		query.limit(10);								// 先得到查询结果集,一次最多从结果集中获取10个结果
		
		return query.asList();
	}
	
	// 修改记录
	public void update(String id) {
		Query<Hotel> query = ds.createQuery(Hotel.class);
		query.field(Mapper.ID_KEY).equal(ObjectId.massageToObjectId(id));		// 确定修改的记录集
		
		UpdateOperations<Hotel> ops = ds.createUpdateOperations(Hotel.class);	// 建立一个修改器
		ops.set("hotelName", "如家酒店(光谷软件园路)");
		
		ds.update(query, ops);
	}
}


3、Test.java

package test;

import java.util.Date;

import org.bson.types.ObjectId;

public class Test {

	/**
	 * 测试函数
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		
		MorphiaUtil morphiaUtil = new MorphiaUtil();
		
		// 增加一条记录
		Hotel hotel = new Hotel();
//		hotel.setId(ObjectId.get());		// 主键也可以由数据库自动生成
		hotel.setHotelName("如家酒店");
		hotel.setHotelAddress("建设大道001号");
		hotel.setPrice(199);
		hotel.setCreateTime(new Date());
		
		morphiaUtil.add(hotel);
		

	}

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值