背景
公司之前要做一个互联网产品,由于产品的特性,决定使用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