mongodb+spring +morphia完整版框架搭建

[list]
[*]Morphia是一个开放源代码的对象关系映射框架,它对MongoDB数据库 java版驱 动进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵MongoDB数据库,也让Java程序员可以从复杂数据库设计中脱离出来,从而将更多的精力投入到业务逻辑中去。Morphia是一个轻量级的类型安全的Java对象to/from MongoDB 库.Morphia 提高了通过注解的方式 来保存mongodb collection。

[/list]
[list]
[*]@Id 注释指示Morphia哪个字段用作文档 ID。如果试图持久保存对象(其 @Id 注释的字段为 null),则Morphia会自动生成 ID 值。  @Entity @Entity 注释是必需的。其声明了在专用MongoDB集合上该类作为文档将持久保存。在默认情况下,Morphia使用类名称来命名集合。  @Embedded @Embedded注释说明Morphia将此对象实例嵌入到另一个对象中去。而不单独的放到一个MongoDB集合。  @Reference @Reference 注释说明对象是对另外一个集合中的文档的引用。在从MongoDB集合中加载对象时,Morphia遵循着这些引用来建立对象关系。  @Indexed 类属性标记@Indexed注释,表明为此属性增加索引。  @Property 类属性标记@Property注释,表明为此属性在MongoDB数据库取一个别名。  @Transient 类属性标记@Transient注释则表明这个字段将不被持久化到数据库。 4. Morphia编程模型

[*]1. 定义被持久类 @Entity classMyEntity { @Id ObjectId id; String name; } 2.

[*]初始化morphia Mongo mongo = new Mongo("localhost");//连接到本地mongoDB数据库 Morphiamorphia = new Morphia(); morphia.mapPackage("MyEntity");//

[*]告诉Morphia映射哪些类 Datastore ds = morphia.createDatastore(mongo ,"myDB");//创建名为“myDB”数据库,

[*]mongo最好使用单实例模式 ds.ensureIndexes(); //在标记为@Id的类属性上创建索引 ds.ensureCaps(); //设置默认的mongoDB集合容量 3. 保存被持久化类 MyEntity e = ...; ds.save(e);//将MyEntity对象持久化到mongoDB数据库中 4. 查询 MyEntity e =ds.find(MyEntity.class).get();//通过类型取的第一个数据项 MyEntitye=ds.find(MyEntity.class).field("name")

Datastore接口把Java对象保存到MongoDB或从MongoDB中访问Java对象提供了安全类型的方法。它提供了get/find/save/delete方法为你操作Java对象。
[/list]
来看代码吧。
配置 文件 xml:

<?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:tx="http://www.springframework.org/schema/tx"
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/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="order" value="1" />
<property name="ignoreUnresolvablePlaceholders" value="true" />
<property name="locations">
<list>
<value>classpath:demo-provider-module.properties</value>
</list>
</property>
</bean>
<!-- writeConcern -->
<bean id="writeConcern" class="com.mongodb.WriteConcern">
<!-- 对应全局的WriteConcern中的w,默认为0 -->
<constructor-arg name="w" value="0" />
<!-- 对应全局的WriteConcern中的wtimeout,默认为0 -->
<constructor-arg name="wTimeoutMS" value="0" />
<!-- 对应全局的WriteConcern.FSYNC_SAFE,如果为真,每次写入要等待写入磁盘,默认为false -->
<constructor-arg name="fsync" value="false" />
<!-- 对应全局的WriteConcern.JOURNAL_SAFE,如果为真,每次写入要等待日志文件写入磁盘,默认为false -->
<constructor-arg name="journal" value="false" />
</bean>

<bean id="mongoClientOption" class="demo.dcn.mongodb.MongoClientOption">
<property name="minConnectionsPerHost" value="50" />
<property name="maxConnectionsPerHost" value="200" />
<property name="threadsAllowedToBlockForConnectionMultiplier" value="20" />
<property name="maxWaitTime" value="12000" />
<property name="maxConnectionIdleTime" value="0" />
<property name="maxConnectionLifeTime" value="0" />
<property name="connectTimeout" value="3000" />
<property name="socketTimeout" value="60000" />
<property name="socketKeepAlive" value="true" />
<property name="writeConcern" ref="writeConcern" />
</bean>
<!-- 使用工厂创建mongo实例 -->
<bean id="mongo" class="demo.dcn.mongodb.MongoFactoryBean">
<!-- mongoDB的配置对象 -->
<property name="mongoOption" ref="mongoClientOption"/>
<!-- 是否主从分离(读取从库),默认为false,读写都在主库 -->
<!-- <property name="readSecondary" value="true" /> -->

<!-- 设定写策略,默认为WriteConcern.SAFE,优先级高于mongoOptions中的safe -->
<property name="writeConcern" value="SAFE" />

<!-- 设定服务器列表,默认为localhost:27017 -->
<property name="serverStrings">
<array>
<value>${mongo.db.host_master}</value>
<!-- <value>${mongo.db.host_salve}</value> -->
</array>
</property>
<!-- 设定认证参数列表,默认为空 -->
<!-- <property name="credentialStrings">
<array>
<value>${mongo.db.credential_1}</value>
</array>
</property> -->
</bean>

<!-- 使用工厂创建morphia实例,同时完成类映射操作 -->
<bean id="morphia"
class="demo.dcn.mongodb.MorphiaFactoryBean">
<!-- 指定要扫描的POJO包路径 -->
<property name="mapPackages">
<array>
<value>demo.dcn.mongodb.vo</value>
</array>
</property>
</bean>
<!-- 使用工厂创建datastore,同时完成index和caps的确认操作 -->
<bean id="datastore"
class="demo.dcn.mongodb.DataStoreFactoryBean">
<property name="morphia" ref="morphia" />
<property name="mongo" ref="mongo" />
<property name="dbName" value="${mongo.db.databaseName_1}" />
<!-- 是否进行index和caps的确认操作,默认为flase -->
<property name="toEnsureIndexes" value="true" /><!-- 是否确认索引存在,默认false -->
<property name="toEnsureCaps" value="true" /><!-- 是否确认caps存在,默认false -->
</bean>
</beans>


[size=large]dataStoreFactoryBean 工厂指定数据连接获取 mongo ,marphia db对象。[/size]

package demo.dcn.mongodb;

import org.mongodb.morphia.Datastore;
import org.mongodb.morphia.Morphia;
import org.springframework.beans.factory.config.AbstractFactoryBean;
import com.mongodb.MongoClient;
public class DataStoreFactoryBean extends AbstractFactoryBean<Datastore> {
代码: [code="ruby"]...
(支持java, ruby, js, xml, html, php, python, c, c++, c#, sql)

private Morphia morphia; //morphia实例,最好是单例
private MongoClient mongo; //mongo实例,最好是单例
private String dbName; //数据库名
private boolean toEnsureIndexes = false; //是否确认索引存在,默认false
private boolean toEnsureCaps = false; //是否确认caps存在,默认false
@Override
protected Datastore createInstance() throws Exception {
Datastore ds = morphia.createDatastore(mongo, dbName);
if (toEnsureIndexes) {
ds.ensureIndexes();
}
if (toEnsureCaps) {
ds.ensureCaps();
}
return ds;
}
@Override
public Class<?> getObjectType() {
return Datastore.class;
}

@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");
}
}
/*----------------------setters-----------------------*/
public Morphia getMorphia() {
return morphia;
}

public void setMorphia(Morphia morphia) {
this.morphia = morphia;
}

public MongoClient getMongo() {
return mongo;
}

public void setMongo(MongoClient mongo) {
this.mongo = mongo;
}

public String getDbName() {
return dbName;
}

public void setDbName(String dbName) {
this.dbName = dbName;
}

public boolean isToEnsureIndexes() {
return toEnsureIndexes;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值