MongoDB Plugin 1.0.4

简介

因为自己工作中会需要用到MongoDB,为了在JAVA上用MongoDB用得更舒服,所以开发了这个工具。

相较于之前的版本,几乎重写所有代码。

要求java7及以上,MongoDB由于3.0后改变较大,最好是3.2或以上。

具有以下特性:

  • 与MongoDB版本同步,完美支持最新的3.2.6版本.
  • 使用方式更像是自然语言,用起来更舒适。
  • 简化mongodb java driver 的操作,降低学习成本。
  • 支持MongoDB的授权机制(可以使用用户名和密码登录)、支持连接MongoDB副本集、读写分离、安全写入、SSL连接等特性。
  • 内置JFinal和Resty插件。(基于最新版的JFinal和Resty)

如有疑问可加群:557692142或发送邮件到t-baby@zomake.com

项目地址:https://github.com/T-baby/MongoDB-Plugin


1.0.4

–RestyPlugin–

修复一个启动时的bug

–MongoKit–

增加了find(Class),用于反序列化

–MongoQuery–

增加set(Object)方法,用于序列化对象

加载

普通

可以直接到https://github.com/T-baby/MongoDB-Plugin/releases/tag/1.0.3

下载releases版本

maven(github版本现发布,maven版本一般会比github版本慢一两天)

<dependency>
    <groupId>com.cybermkd</groupId>
    <artifactId>MongodbPlugin</artifactId>
    <version>1.0.3</version>
</dependency>

依赖

本项目依赖于mongo-java-driver和fastjson、SLF4J(MongoDB官方建议使用)。如果使用JFinal或者其它插件的话,请自行加载相应项目的包。具体的依赖见https://github.com/T-baby/MongoDB-Plugin/blob/master/pom.xml

<dependency>
  <groupId>org.mongodb</groupId>
  <artifactId>mongo-java-driver</artifactId>
  <version>3.2.2</version>
</dependency>

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>1.2.7</version>
</dependency>

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.21</version>
</dependency>

初始化

结合JFinal

在configPlugin中加载

MongoJFinalPlugin jFinalPlugin = new MongoJFinalPlugin();
jFinalPlugin.add("127.0.0.1",27017);
jFinalPlugin.setDatabase("test");
me.add(jFinalPlugin);

结合Resty

在configPlugin中加载

MongoRestyPlugin mongoRestyPlugin = new MongoRestyPlugin();
mongoRestyPlugin.add("127.0.0.1",27017);
mongoRestyPlugin.setDatabase("test");
pluginLoader.add(mongoRestyPlugin);

单独使用

MongoPlugin mongoPlugin=new MongoPlugin();
mongoPlugin.add("127.0.0.1",27017);
mongoPlugin.setDatabase("test");
MongoClient client = mongoPlugin.getMongoClient();
MongoKit.init(client, mongoPlugin.getDatabase());
client.close();

高级特性

由于JFinal插件和Resty插件都是继承MongoPlugin,所以下面这些方法使用起来都是一样的。

连接副本集(不会搭建副本?狂戳我获得北大绿卡一本(づ ̄ 3 ̄)づ)

plugin.add(主机地址,端口号);
plugin.add(主机地址,端口号).add(主机地址,端口号).add(主机地址,端口号);

登录数据库

plugin.auth(用户名,密码);

更多认证

plugin.auth(原生驱动的MongoCredential);

SSL连接

plugin.ssl();

连接超时

plugin.connectTimeout(时间);

更多设置

plugin.opition(原生驱动的MongoClientOptions);

读写分离

plugin.readPreference();
//首选从节点,大多情况下读操作在从节点,特殊情况(如单主节点架构)读操作在主节点

更多策略的读写分离

plugin.readPreference(原生驱动的ReadPreference);

安全写入

plugin.writeConcern();
//前几次修改操作仍然被记录在journal中,可以被还原也可以被撤销,避免数据不一致或弄脏的情况,写成功后再执行到真的数据集中。MongoDB2.6后默认开启了此功能。

更多安全写入策略

plugin.writeConcern(原生驱动的WriteConcern);

最严格的安全写入

plugin.writeSafe();
//有些文章或教程推荐这么做,不过官方并不推荐,会影响性能。

最佳实践(获取更多使用建议

plugin.add(主机地址,端口号).add(主机地址,端口号).add(主机地址,端口号).setDatabase("test").auth(用户名,密码).ssl().readPreference().writeConcern();
//非公网连接可以不用SSL

操作

所有操作都基于MongoQuery,如果是查找条件等等默认使用and连接,如果需要使用or,可以直接继承MongoKit和MongoQuery、对应的插件增加相应的方法。

MongoQuery query=new MongoQuery();

下文的query一律指MongoQuery对象。

ps:所有操作都是批量的,所以建议在修改、删除时使用不重复的key或者尽可能详细指定。

query.use("集合名")  //使用来指定集合。

查找会基于fastjson返回一个格式化好的json list,更新、删除、插入都会返回影响的行数。

插入

query.use("集合名").set("key", "value").save()    

多个key和value只要直接在后面增加set即可。

query.use("集合名").set(Object).save()  

支持插入对象,自动转换Bean对象。

query.use("集合名").set("key", "value").set("key2", "value2").save()    

获取插入成功的数据的id

用刚刚用于插入的query对象,query.getID()

批量插入

使用add来增加,然后使用saveList来保存。

 query.use("item").add(new MongoQuery().set("a", "1").set("b", "2")).add(new MongoQuery().set("a", "1").set("b", "3")).saveList();    

根据ID操作

MongoQuery支持通过ID来查找、更新、插入。

为了大家方便,已经自带了一个byId方法。查找、更新、删除都可以接这个方法。如下面根据ID查找:

query.use("item").byId("5710a81ab73a87092e17a02b").find()    

查找

查找所有

query.use("item").findAll()    

根据条件查找

query.use("item").eq("b","2").find()    

(ps:MongoDB区分文本和数字,设定条件时要注意)

反序列化查找结果

query.use("item").eq("b","2").find(xx.class)  

获取结果数量

query.use("item").eq("b","2").count()    

条件

在use后面接着的就是条件,支持以下条件:

  • in() 包含,如果key为_id会自动将文本id转为mongodb所需的ObjectId
  • eq() 等于
  • ne() 不等于
  • gt() 大于
  • lt() 小于
  • gte() 大于等于
  • lte() 小于等于
  • like() 模糊查找,like除了支持含有,还支持以什么开头或以什么结尾的查找。
  • like(int type,String key, String value) 1为以什么开头,除了1以外的数字都是以什么结尾。
  • 如果还需要更多的条件,可以通过 query.filter() 来加载原生条件,如:
    query.filter(Filters.in(key, value)) ,这里的filter是mongodb驱动自带的,想要知道更多条件可以到http://mongodb.github.io/mongo-java-driver/3.2/builders/filters/

所有的条件都是默认以and连接,所以可以接多个条件,更新、查找、删除都是使用这种方式,比如我要查找一个年龄小于18岁名字中含有“陈”这个字的男生。

query.lt("age",18).eq("sex","man").like("name","陈").find()    

排序和数量

find是支持排序和数量的,下面有两个例子。

query.lt("age",18).后接以下方法:   

 .ascending(升序条件1,升序条件2....) 
 .descending(降序条件1,降序条件2...)
 .limit(限定结果数量)     
 .projection(只返回列1,只返回列2...)
 .skip(跳过多少行)

排序条件要求使用原生驱动的写法,详情见http://mongodb.github.io/mongo-java-driver/3.2/builders/sorts/

分页

使用分页很简单,只需要新建一个MongoPaginate对象即可,放入写好查询条件的query对象、每页行数和当前页数即可。

注意不要在被放入的query对象中使用limit和skip条件,以免影响到查询结果。

更新

更新操作的话直接在条件后追加modify即可,更新多个就追加多个。

query.use("item").byId("5710a81ab73a87092e17a02b").modify("b","3").update()    

query.use("item").eq("a","1").modify("b","3").update()    

query.use("item").eq("a","1").modify("a","2").modify("b","3").update()    

更新操作默认是批量的,所以会更新满足条件的所有行,建议至少使用一个唯一字段或者是详细的条件。如果需要用到驱动原生的Updates Model,可以直接add(Updates Model);

为了方便大家的使用,内置了自增:inc(key,value)。


query.use("item").eq("a",1).inc("a",1).update()    

删除

删除更查找基本一致,指定条件后直接加delete()即可。

原文地址:http://it.lindukj.cn/archives/2027

query.use("item").byId("5710a81ab73a87092e17a02b").delete()    

query.use("item").eq("test","2").delete()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值