Morphia是一个开放源代码的对象关系映射框架,它对MongoDB数据库 java版驱动进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵MongoDB数据库,也让Java程序员可以从复杂数据库设计中脱离出来,从而将更多的精力投入到业务逻辑中去。
mongoDB原生的api是面向数据的操作,Morphia框架是面向对象的,下面贴出一个小例子,需要的jar包除了mongo的jar包外,还需要Morphia官方发布的jar包,地址为http://code.google.com/p/morphia ,另外为了打印方便,我还用到了fastjson的jar包,请自行下载。
这个例子的实体为User,主键为自己实现的自增主键(替换了MONGO原生的24位主键),并实现了User的添加,修改,删除,等操作
首先建立一个类,作为存储Seqence的表,这个表由“用户表名”,“当前序列值”组成,在mongo数据库中将生成名为_STOREDSEQENCE的序列表
StoredSeqence.java
package com.look.test;
import java.io.Serializable;
import com.google.code.morphia.annotations.Entity;
import com.google.code.morphia.annotations.Id;
/**
* 存储各表自增主键序列的表
*/
@Entity("_STOREDSEQENCE")
public class StoredSeqence implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private String collName;
private Long value;
public StoredSeqence(){
}
public StoredSeqence(String collName) {
this.collName = collName;
}
public Long getValue() {
return value;
}
public void setValue(Long value) {
this.value = value;
}
public String getCollName() {
return collName;
}
public void setCollName(String collName) {
this.collName = collName;
}
}
IncrementBase.java
package com.look.test;
import com.google.code.morphia.Datastore;
import com.google.code.morphia.annotations.Id;
import com.google.code.morphia.annotations.PrePersist;
import com.google.code.morphia.annotations.Transient;
import com.google.code.morphia.query.Query;
/**
* Mongo需要自增长数字类型主键的表需继承该类
* @author LiuKe
* @version 1.0 2013-10-28
*/
public abstract class IncrementBase {
@Id
Long _id;
@Transient
protected Datastore ds;
public void setDs(Datastore ds) {
this.ds = ds;
}
//这个注解的意思是,每次在持久化之前,先执行这个方法
@PrePersist
void prePersist() {
//自增性主键的处理
if (_id == null) {
String collName = ds.getCollection(getClass()).getName();//获取表名
Query q = ds.find(StoredSeqence.class, "_id",collName);
StoredSeqence ss = q.get();
if(ss==null){//不存在该实体的注册,则新创建一个
ss = new StoredSeqence(collName);
ss.setValue(1l);
}else{
ss.setValue(ss.getValue()+1);
}
ds.save(ss);
_id=ss.getValue();
}
}
/**
* 不提供setId方法
*/
public Long getId() {
return _id;
}
}
下面是User.java,继承了IncrementBase
package com.look.test;
import com.google.code.morphia.annotations.Entity;
@Entity(noClassnameStored=true)
public class User extends IncrementBase {
private String userName;
private String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
Test.java
package com.look.test;
import java.net.UnknownHostException;
import java.util.List;
import com.alibaba.fastjson.JSON;
import com.google.code.morphia.Datastore;
import com.google.code.morphia.Morphia;
import com.google.code.morphia.annotations.PrePersist;
import com.google.code.morphia.query.UpdateOperations;
import com.mongodb.Mongo;
import com.mongodb.MongoException;
public class Test{
private static Datastore datastore = null ;
static
{
Mongo mongo = null;
try {
mongo = new Mongo("192.168.1.15",33458);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (MongoException e) {
e.printStackTrace();
}
datastore = new Morphia().createDatastore(mongo, "test");
}
public User findUser(String userName ,String password) {
User user = new User();
user.setUserName(userName);
user.setPassword(password);
user.setDs(datastore);
User resultUser = datastore.find(User.class,"userName",userName).get();
System.out.println(JSON.toJSONString(resultUser));
return resultUser;
}
public void createUser(String userName , String password) {
User user = new User();
user.setUserName(userName);
user.setPassword(password);
user.setDs(datastore);//注意这一句是必不可少的,@PrePersist注解的方法,会用datastore去查找表名
datastore.save(user);
}
public void deleteUser(String userName , String password) {
User user = new User();
user.setUserName(userName);
user.setPassword(password);
user.setDs(datastore);
datastore.delete(datastore.find(User.class,"userName",userName).get());
}
public void updateUser(String userName , String password , String newPass) {
User user = new User();
user.setUserName(userName);
user.setPassword(password);
user.setDs(datastore);
User resultUser = findUser(userName, password);
UpdateOperations ops = datastore.createUpdateOperations(User.class).set("password", newPass);
datastore.update(resultUser, ops);
System.out.println("修改完毕");
}
public void listAllUser()
{
List userList = datastore.find(User.class).asList();
for(User u : userList)
{
System.out.println(JSON.toJSONString(u));
}
}
public static void main(String[] args) {
Test test = new Test();
test.createUser("user1", "123"); //创建
// test.deleteUser("user1","123");//删除
// test.findUser("user1","123");//查询
// test.updateUser("user1","123","456");//修改
// test.listAllUser();//列表
}
}
有一处我还要特别强调一下,在使用User实例之前,一定要set一个Datastore实例,因为在@PrePersist注解的方法中,使用了datastore去查找表名,以便
存储在_STOREDSEQENCE表。
参考的链接http://www.oschina.net/code/snippet_35115_2915