Mongo之Morphia API

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

你可能感兴趣的:(mongo)