Mongo的ORM框架的学习Morphia(十五)Morphia+spring整合
转自:http://topmanopensource.iyunv.com/blog/1449889package com.easyway.morphia.mongodb.services;
import org.bson.types.ObjectId;
import com.easyway.morphia.mongodb.dao.IHotelDAO;
import com.easyway.morphia.mongodb.model.Hotel;
/**
*
* @Title: TODO
* @Description: 实现TODO
* @Copyright:Copyright (c) 2011
* @Company:易程科技股份有限公司
* @Date:2012-3-10
* @author
* @version 1.0
*/
public class HotelServiceImpl extends MongoBaseServiceImpl<Hotel, ObjectId> implements IHotelService
{
private IHotelDAO hotelDAO;
public IHotelDAO getHotelDAO() {
return hotelDAO;
}
public void setHotelDAO(IHotelDAO hotelDAO) {
this.hotelDAO = hotelDAO;
super.setBaseDao(hotelDAO);
}
}
package com.easyway.morphia.mongodb.services;
import org.bson.types.ObjectId;
import com.easyway.morphia.mongodb.model.Hotel;
/**
*
* @Title: TODO
* @Description: 实现TODO
* @Copyright:Copyright (c) 2011
* @Company:易程科技股份有限公司
* @Date:2012-3-10
* @author
* @version 1.0
*/
public interface IHotelService extends IMongoBaseService<Hotel, ObjectId>
{
}
package com.easyway.morphia.mongodb.services;
import com.google.code.morphia.Datastore;
import com.google.code.morphia.Key;
import com.google.code.morphia.query.Query;
import com.google.code.morphia.query.QueryResults;
/**
*
* @Title: TODO
* @Description: 实现TODO
* @Copyright:Copyright (c) 2011
* @Company:易程科技股份有限公司
* @Date:2012-3-10
* @author
* @version 1.0
*/
public interface IMongoBaseService<T, K>
{
public long count();
public long count(Query<T> q);
public longcount(String key, Object value) ;
publicvoiddelete(T entity) ;
publicvoiddeleteById(K id);
publicvoiddeleteByQuery(Query<T> q) ;
publicbooleanexists(Query<T> q);
publicbooleanexists(String key, Object value) ;
publicQueryResults<T>find() ;
publicQueryResults<T>find(Query<T> q) ;
publicT findOne(Query<T> q) ;
publicTfindOne(String key, Object value) ;
publicKey<T>save(T entity) ;
public DatastoregetDatastore();
public Tget(K id) ;
public Query<T> createQuery() ;
}
package com.easyway.morphia.mongodb.services;
import com.google.code.morphia.Datastore;
import com.google.code.morphia.Key;
import com.google.code.morphia.dao.DAO;
import com.google.code.morphia.query.Query;
import com.google.code.morphia.query.QueryResults;
/**
*
* @Title: TODO
* @Description: 实现TODO
* @Copyright:Copyright (c) 2011
* @Company:易程科技股份有限公司
* @Date:2012-3-10
* @author
* @version 1.0
*/
public class MongoBaseServiceImpl<T, K> implements IMongoBaseService<T, K>
{
private DAO<T, K>baseDao;
public long count()
{
return baseDao.count();
}
public long count(Query<T> q)
{
return baseDao.count(q);
}
public long count(String key, Object value)
{
return baseDao.count(key, value);
}
public void delete(T entity)
{
baseDao.delete(entity);
}
public void deleteById(K id)
{
baseDao.deleteById(id);
}
public void deleteByQuery(Query<T> q)
{
baseDao.deleteByQuery(q);
}
public boolean exists(Query<T> q)
{
return baseDao.exists(q);
}
public boolean exists(String key, Object value)
{
return baseDao.exists(key, value);
}
public QueryResults<T> find()
{
return baseDao.find();
}
public QueryResults<T> find(Query<T> q)
{
return baseDao.find(q);
}
public T findOne(Query<T> q)
{
return (T) baseDao.findOne(q);
}
public T findOne(String key, Object value)
{
return (T) baseDao.findOne(key, value);
}
public Key<T> save(T entity)
{
return baseDao.save(entity);
}
public DAO getBaseDao()
{
return baseDao;
}
public void setBaseDao(DAO baseDao)
{
this.baseDao = baseDao;
}
public Datastore getDatastore()
{
return baseDao.getDatastore();
}
public T get(K id)
{
return (T) baseDao.get(id);
}
public Query<T> createQuery()
{
return baseDao.createQuery();
}
}
Model:
package com.easyway.morphia.mongodb.model;
import org.bson.types.ObjectId;
import com.google.code.morphia.annotations.*;
/**
*
* @Title: TODO
* @Description: 实现TODO
* @Copyright:Copyright (c) 2011
* @Company:易程科技股份有限公司
* @Date:2012-3-10
* @author
* @version 1.0
*/
@Entity
public class Hotel
{
@Id private ObjectId oid;
private String trackName;
private String address;
public ObjectId getOid() {
return oid;
}
public void setOid(ObjectId oid) {
this.oid = oid;
}
public String getTrackName() {
return trackName;
}
public void setTrackName(String trackName) {
this.trackName = trackName;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
Dao:
package com.easyway.morphia.mongodb.dao;
import org.bson.types.ObjectId;
import com.easyway.morphia.mongodb.model.Hotel;
import com.google.code.morphia.dao.DAO;
/**
*
* @Title: TODO
* @Description: 实现TODO
* @Copyright:Copyright (c) 2011
* @Company:易程科技股份有限公司
* @Date:2012-3-10
* @author
* @version 1.0
*/
public interface IHotelDAO extends DAO<Hotel, ObjectId>
{
}
package com.easyway.morphia.mongodb.dao;
import org.bson.types.ObjectId;
import com.easyway.morphia.mongodb.model.Hotel;
import com.google.code.morphia.Datastore;
import com.google.code.morphia.dao.BasicDAO;
/**
*
* @Title: TODO
* @Description: 实现TODO
* @Copyright:Copyright (c) 2011
* @Company:易程科技股份有限公司
* @Date:2012-3-10
* @author
* @version 1.0
*/
public class HotelDAOImpl extends BasicDAO<Hotel, ObjectId> implements IHotelDAO
{
protected HotelDAOImpl(Datastore ds)
{
super(ds);
}
}
sping和morphia的扩展类:
package com.easyway.morphia.mongodb.ext;
import org.springframework.beans.factory.config.AbstractFactoryBean;
import org.springframework.util.StringUtils;
import com.google.code.morphia.Datastore;
import com.google.code.morphia.Morphia;
import com.mongodb.Mongo;
/**
*
* @Title: 通过扩展AbstractFactoryBean创建DataStore的FactoryBean类
* @Description: 实现TODO
* @Copyright:Copyright (c) 2011
* @Company:易程科技股份有限公司
* @Date:2012-3-3
* @author
* @version 1.0
*/
public class DataStoreFactoryBean extends AbstractFactoryBean<Datastore> {
private Morphia morphia;
private Mongo mongo;
private String dbName;
private String user;
private String password;
@Override
public Class<?> getObjectType() {
return Datastore.class;
}
@Override
protected Datastore createInstance() throws Exception {
if (StringUtils.hasText(user)) {
return morphia.createDatastore(mongo, dbName, user, password.toCharArray());
}
return morphia.createDatastore(mongo, dbName);
}
@Override
public void afterPropertiesSet() throws Exception {
super.afterPropertiesSet();
if (mongo == null) {
throw new IllegalStateException("mongo is not set");
}
if (morphia == null) {
throw new IllegalStateException("morphia is not set");
}
}
public void setMorphia(Morphia morphia) {
this.morphia = morphia;
}
public void setMongo(Mongo mongo) {
this.mongo = mongo;
}
public void setDbName(String dbName) {
this.dbName = dbName;
}
public void setUser(String user) {
this.user = user;
}
public void setPassword(String password) {
this.password = password;
}
}
package com.easyway.morphia.mongodb.ext;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.BeanCreationException;
import org.springframework.beans.factory.config.AbstractFactoryBean;
import com.mongodb.Mongo;
import com.mongodb.MongoOptions;
import com.mongodb.ServerAddress;
/**
*
* @Title: 通过扩展AbstractFactoryBean创建Mongo的FactoryBean类
* @Description: 实现TODO
* @Copyright:Copyright (c) 2011
* @Company:易程科技股份有限公司
* @Date:2012-3-10
* @author
* @version 1.0
*/
public class MongoFactoryBean extends AbstractFactoryBean<Mongo> {
private List<ServerAddress> replicaSetSeeds = new ArrayList<ServerAddress>();
private MongoOptions mongoOptions;
@Override
public Class<?> getObjectType() {
return Mongo.class;
}
@Override
protected Mongo createInstance() throws Exception {
if (replicaSetSeeds.size() > 0) {
if (mongoOptions != null) {
return new Mongo(replicaSetSeeds, mongoOptions);
}
return new Mongo(replicaSetSeeds);
}
return new Mongo();
}
public void setMultiAddress(String[] serverAddresses) {
replSeeds(serverAddresses);
}
private void replSeeds(String... serverAddresses) {
try {
replicaSetSeeds.clear();
for (String addr : serverAddresses) {
String[] a = addr.split(":");
String host = a;
if (a.length > 2) {
throw new IllegalArgumentException("Invalid Server Address : " + addr);
}else if(a.length == 2) {
replicaSetSeeds.add(new ServerAddress(host, Integer.parseInt(a)));
}else{
replicaSetSeeds.add(new ServerAddress(host));
}
}
} catch (Exception e) {
throw new BeanCreationException("Error while creating replicaSetAddresses",e);
}
}
public void setAddress(String serverAddress) {
replSeeds(serverAddress);
}
}
package com.easyway.morphia.mongodb.ext;
import org.springframework.beans.factory.config.AbstractFactoryBean;
import com.google.code.morphia.Morphia;
/**
*
* @Title: 通过继承AbstractFactoryBean<Morphia> 用来创建 Morphia的工厂bean
*
* @Description: 实现TODO
* @Copyright:Copyright (c) 2011
* @Company:易程科技股份有限公司
* @Date:2012-3-3
* @author
* @version 1.0
*/
public class MorphiaFactoryBean extends AbstractFactoryBean<Morphia> {
private String[] mapPackages;
private String[] mapClasses;
private boolean ignoreInvalidClasses;
@Override
public Class<?> getObjectType() {
return Morphia.class;
}
@Override
protected Morphia createInstance() throws Exception {
Morphia m = new Morphia();
if (mapPackages != null) {
for (String packageName : mapPackages) {
m.mapPackage(packageName, ignoreInvalidClasses);
}
}
if (mapClasses != null) {
for (String entityClass : mapClasses) {
m.map(Class.forName(entityClass));
}
}
return m;
}
public void setMapPackages(String[] mapPackages) {
this.mapPackages = mapPackages;
}
public void setMapClasses(String[] mapClasses) {
this.mapClasses = mapClasses;
}
public void setIgnoreInvalidClasses(boolean ignoreInvalidClasses) {
this.ignoreInvalidClasses = ignoreInvalidClasses;
}
}
spring的配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
default-autowire="byName">
<context:annotation-config />
<!-- 导入属性配置文件 -->
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath*:Mongo-db.properties</value>
</list>
</property>
</bean>
<beanid="mongo"class="com.mongodb.Mongo">
<constructor-arg index="0">
<value>${mongo.db.host}</value>
</constructor-arg>
</bean>
<bean id="morphia" class="com.easyway.mongodb.ext.MorphiaFactoryBean">
<property name="mapClasses">
<value>com.easyway.mongodb.model.Hotel</value>
</property>
</bean>
<bean id="datastore"class="com.easyway.mongodb.ext.DataStoreFactoryBean" >
<property name="morphia">
<ref bean="morphia"/>
</property>
<property name="mongo">
<ref bean="mongo"/>
</property>
<property name="dbName">
<value>
${mongo.db.databaseName}
</value>
</property>
</bean>
<beanid="hotelDAO" class="com.easyway.mongodb.dao.HotelDAO" >
<constructor-arg index="0" >
<refbean="mongo"/>
</constructor-arg>
<constructor-arg index="1" >
<refbean="morphia"/>
</constructor-arg>
<constructor-arg index="2" >
<value>
${mongo.db.databaseName}
</value>
</constructor-arg>
</bean>
</beans>
测试类如下:
package com.easyway.morphia.mongodb.app;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.easyway.morphia.mongodb.model.Hotel;
import com.easyway.morphia.mongodb.services.IHotelService;
/**
*
* @Title: TODO
* @Description: 实现TODO
* @Copyright:Copyright (c) 2011
* @Company:易程科技股份有限公司
* @Date:2012-3-10
* @author
* @version 1.0
*/
public class HotelApp {
public static void main(String[] args) {
ApplicationContextctx=new ClassPathXmlApplicationContext("classpath:applicationContext-resource.xml");
IHotelServicehotelSrv=(IHotelService)ctx.getBean("trackService");
Hotelhotel=new Hotel();
hotel.setAddress("Model 168地址 ");
hotel.setTrackName("跟踪地址");
hotelSrv.save(hotel);
}
}
页:
[1]