java开源mongodb orm框架

背景

    公司之前要做一个互联网产品,由于产品的特性,决定使用NoSQL数据库mongodb作为底层存储。

 

    在项目进入开发阶段时,发现使用mongodb的java driver是件非常头疼的事。像当年写jdbc一样,拼写查询条件,结果集转换。业务逻辑里就出现了很多重复的代码使得项目整体变得臃肿。

 

    在网上找了一些开源的orm框架,包括Morphia。确实简化了很多代码,与driver的sdk也进行了隔离,不过用起来还是感觉不太方便,operater都封装成了方法,却没有覆盖所有的。还有就是还是跟driver的使用一样,数据库的操作全部写在代码里了,假如要修改一个查询操作的状态值我必须修改代码重新编译。

 

    最后决定自己写一个简单的类似ibatis的框架,只需要满足当前业务的需求即可,于是在接下来的三周都挤一些时间来完成这个部分。结果比预期的要好,同事在使用的时候也都比较认可,便采用到了各个项目中。

 

    由于当时时间有限,与的比较快,总体结构不是很好,现在整理出来方便以后可以使用。与其他ORM框架不一样的地方是所有的数据库操作都是在配置文件中的,可以很方便的维护配置文件。

 

    Mongodb-orm 代码托管在github上 https://github.com/yuxiangping/mongodb-orm   有兴趣的可以看看。 

 

    介绍一下项目中的使用

    1.  使用时加入该jar包依赖

    2.  使用spring实例化

 

 

<bean id="mongoTemplet" class="com.mongodb.client.MongoClientTemplet">
	    <property name="factory">
	        <bean class="com.mongodb.client.MongoORMFactoryBean">
	            <property name="dataSource">
	                <bean class="com.mongodb.client.MongoDataSource">
	                    <property name="nodeList" value="192.168.1.0:80,192.168.1.1:8080,192.168.1.2:80" />
						<property name="dbName" value="yourDBName" />
						<property name="userName" value="userName" />
						<property name="passWord" value="passWord" />
						
						<!-- 以下为可选参数 -->
						<property name="connectionsPerHost" value="" />
						<property name="threadsAllowedToBlock" value="" />
						<property name="connectionTimeOut" value="" />
						<property name="maxRetryTime" value="" />
						<property name="socketTimeOut" value="" />
	                </bean>
	            </property>
	            <property name="configLocations">
	                <list>
						<value>classpath:mql/model1-mql.xml</value>
						<value>classpath:mql/model2-mql.xml</value>
					</list>
	            </property>
	        </bean>
	    </property>
	</bean>

 

   也可以使用代码进行实例化

 

    3.  代码中使用MongoTemplet即可实现对数据库的操作。

public class MongoORMTest {

  private MongoTemplet templet;
  
  public Model findOne() {
    String id = "xxxxx";
    return templet.findOne("findByID", id);
  }
  
  public List<Model> findList() {
    Map parameter = new HashMap();
    parameter.put("status", 1);
    
    int skip = 0;
    int limit = 20;
    
    return templet.find("findList", parameter, limit, skip);
  }
  
  public String insert() {
    Model model = new Model();
    model.setName("xxxxx");
    model.setTime(System.currentTimeMillis());
    
    return templet.insert("insert", model);
  }
  
  public void update() {
    Map parameter = new HashMap();
    parameter.put("time", 1);
    parameter.put("status", 1);
    
    templet.update("update", parameter);
  }
  
}

 

     MongoTemplet根据用户指定的statement找到配置文件并执行。

 

     上面示例中的代码需要以下的配置文件支持

      

<mql>
	<mapping id="model" class="test.mongodborm.Model">
		<property column="_id" name="id" />
		<property column="name" name="name" />
		<property column="time" name="time" value="0" />
		<property column="status" name="status" />
	</mapping>

	<select id="findByID" collection="test_sample">
		<query class="java.lang.String">
			<property column="_id" name="${value}" type="objectid"/>			
		</query>
		<field mapping="model" />
	</select>

	<select id="findList" collection="test_sample">
		<query class="java.util.Map">
			<property column="status" name="status">
		</query>
		<field mapping="model" />
	</select>

	<insert id="insert" collection="test_sample">
		<document mapping="model" />
	</insert>	
		
	<update id="update" collection="test_sample">
		<query class="java.util.Map">
			<property column="time" operate="gte" name="time"/>
		</query>
		<action class="java.util.Map">
			<property column="status" operate="set" name="status" />
		</action>
	</update>

</mql>

 

     完成以上步骤就可以在项目中进行使用了。更多的用法及支持可以访问 github

    

mongodb-orm简介Mongodb ORM是基于javaORM框架,简化了SDK的使用,使代码变得更清晰、简单。 与Ibatis类似,将查询、执行语句封装在xml,与代码隔离。简称MQL。 项目使用加入mongodb orm的支持包1. 添加jar包或maven支持<dependency>     <groupId>com.mongodborm</groupId>     <artifactId>mongodb-orm</artifactId>     <version>0.0.1-RELEASE</version> </dependency>2. 初始化mongodb templet        spring初始化<bean id="mongoTemplet" class="com.mongodb.client.MongoClientTemplet">     <property name="factory">         <bean class="com.mongodb.client.MongoORMFactoryBean">             <property name="dataSource">                 <bean class="com.mongodb.client.MongoDataSource">                     <property name="nodeList" value="127.0.0.1:27017" />                     <property name="dbName" value="your db name" />                     <property name="userName" value="user name" />                     <property name="passWord" value="password" /> <!-- 可使用默认值 --> <property name="connectionsPerHost" value="" />                     <property name="threadsAllowedToBlock" value="" />                     <property name="connectionTimeOut" value="" />                     <property name="maxRetryTime" value="" />                     <property name="socketTimeOut" value="" />                 </bean>             </property>             <property name="configLocations">                 <list>                     <value>classpath:mql/mongo-mql.xml</value>                 </list>             </property>         </bean>     </property> </bean>        代码初始化    try {       Resource resource =  new ClassPathResource("mongo-mql.xml");           MongoORMFactoryBean factory = new MongoORMFactoryBean();       factory.setConfigLocations(new Resource[]{resource});       factory.init();          MongoClientTemplet templet = new MongoClientTemplet();       templet.setFactory(factory);       templet.init();     } catch(Exception e) {       e.printStackTrace();     }编写MQLMapping<mapping id="model" class="test.mongodborm.Model">         <property column="_id" name="id" />         <property column="name" name="name" />         <property column="time" name="time" value="0" />         <property column="status" name="status" /> </mapping> <mapping id="extendModel" class="test.mongodborm.Model" extends="model">     <property column="newProperty" name="newProperty" /> </mapping>  select<select id="queryModelList" collection="test_sample">     <query class="java.lang.String">         <property column="name" name="${value}" />     </query>     <field mapping="model" />     <order>         <property column="time" value="desc" />     </order> </select> update/findAndModify<update id="updateModel" collection="test_sample">     <query class="test.mongodborm.Model$Child">         <property column="name" name="name" ignoreNull="true" />         <property column="time" operate="gte" value="0" type="number" />         <property column="status" operate="in">             <list type="number">0,1</list>         </property>     </query>     <action class="java.util.Map">         <property column="name" name="name" operate="set" />         <property column="status" operate="set" />     </action> </update>有嵌套的查询<select id="queryModelList3" collection="test_sample">     <query class="java.lang.String">         <property column="_id" value="${value}" />         <property column="time" value="0" type="number" />     </query>     <field class="java.util.Map">         <property column="name" name="name" />         <property column="parent" name="parent">             <value class="test.mongodborm.Model$Parent">                 <property column="name" name="name" />                 <property column="child" name="child">                     <value class="test.mongodborm.Model$Child">                         <property column="name" name="name" />                         <property column="time" name="time" value="0" />                     </value>                 </property>                 <property column="data" name="data">                     <value class="java.util.Map">                         <property column="title" name="title" />                         <property column="content" name="content" />                     </value>                 </property>             </value>         </property>         <property column="data" name="data">             <value class="java.util.Map">                 <property column="title" name="title" />                 <property column="content" name="content" />             </value>         </property>     </field>     <order class="java.util.Map">         <property column="time" name="time" value="desc" />     </order> </select>Templet用法Model model = mongoTemplet.findOne("queryModelList", "yuxiangping"); List<Model> list = mongoTemplet.findOne("queryModelList", ""); Model model = new Model(); model.setTime(1L); Map<String, String> action = new HashMap<String, String>(); action.put("name", "yuxiangping-update"); int update = mongoT emplet.update("updateModel", model, action);        更多的使用方法参见 sample.xml 标签:Mongodb
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值