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);
}
}