本帖最后由 破晓 于 2016-8-30 13:49 编辑
来源:http://www.cybermkd.com/mongodb-plugin-2/
简介 因为自己工作中会需要用到MongoDB,为了在JAVA上用MongoDB用得更舒服,所以开发了这个工具。 相较于之前的版本,几乎重写所有代码。 要求java8及以上,MongoDB由于3.0后改变较大,最好是3.2或以上。 具有以下特性:
- 与MongoDB版本同步,完美支持最新的3.2.6版本.
- 使用方式更像是自然语言,用起来更舒适。
- 简化mongodb java driver 的操作,降低学习成本。
- 支持MongoDB的授权机制(可以使用用户名和密码登录)、支持连接MongoDB副本集、读写分离、安全写入、SSL连接等特性。
- 内置JFinal和Resty插件。(基于最新版的JFinal和Resty)
1.0.7 增加索引相关支持 增加Exist校验器,Query增加exist方法、or和nor方法 增加日期校验支持 增加聚合运算支持 增加join查找等新特性 修复bug和优化代码 重写了所有测试类 加载 普通 下载releases版本 maven(github版本现发布,maven版本一般会比github版本慢一两天) - <dependency>
- <groupId>com.cybermkd</groupId>
- <artifactId>MongodbPlugin</artifactId>
- <version>1.0.7</version>
- </dependency>
复制代码
依赖 - <dependency>
- <groupId>org.mongodb</groupId>
- <artifactId>mongo-java-driver</artifactId>
- <version>3.3.0</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);
复制代码
结合ICEREST 在configPlugin中加载 - MongoIceRestPlugin mongoIcePlugin = new MongoIceRestPlugin();
- mongoIcePlugin.add("127.0.0.1",27017);
- mongoIcePlugin.setDatabase("test");
- pluginLoader.add(mongoIcePlugin);
复制代码
单独使用 - 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,所以下面这些方法使用起来都是一样的。 - plugin.add(主机地址,端口号);
- plugin.add(主机地址,端口号).add(主机地址,端口号).add(主机地址,端口号);
复制代码
登录数据库
更多认证 - plugin.auth(原生驱动的MongoCredential);
复制代码
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()
复制代码
如果想要用or连接或者nor的话可以这么做: - query.or(new MongoQuery().eq("age",18)).find();
- //将条件写在or里面
复制代码
在1.0.7版本中增加join特性,如果在插入时用join(本集合的字段名, 要关联的集合名, 要关联的ObjectId)插入的话,就可以在查找时利用join查找出来,直接join("本集合的字段名"),注意join只支持关联单个ObjectId,如需更实现类似 mysql的join的话可以参考聚合运算 排序和数量 find是支持排序和数量的,下面有两个例子。 - query.lt("age",18).后接以下方法:
- .ascending(升序条件1,升序条件2....)
- .descending(降序条件1,降序条件2...)
- .limit(限定结果数量)
- .projection(只返回列1,只返回列2...)
- .skip(跳过多少行)
复制代码
当然如果你只要一个结果可以用findOne,而不是find。比如根据id查找;如果是想知道某个结果是否存在可以将find()替换成exist()。 - query.byId("id").findOne();
复制代码
其它常见查找: max(字段名)查找最大的一个、min(字段名)查找最小的一个,exist(字段名)只查找这个字段名存在的。 分页 使用分页很简单,只需要新建一个MongoPaginate对象即可,放入写好查询条件的query对象、每页行数和当前页数即可。 - MongoPaginate page=new MongoPaginate(new MongoQuery().use("student").descending("age").join("teacher"),每页行数,当前页数);
- page.findAll(Student.class); //无视条件查找所有
- page.find();//根据条件查找
复制代码
注意不要在被放入的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()
复制代码
1.0.5版本支持以对象的方式更新,如果value为空或者没有内容则不会更新这个值,适合将bean对象直接放入。 - query.use("item").eq("a","1").modify(object).update()
复制代码
更新操作默认是批量的,所以会更新满足条件的所有行,建议至少使用一个唯一字段或者是详细的条件。如果需要用到驱动原生的Updates Model,可以直接add(Updates Model); 为了方便大家的使用,内置了自增:inc(key,value)。 - query.use("item").eq("a",1).inc("a",1).update()
复制代码
如果只想要更新一条,那么可以用updateOne()。 删除 删除更查找基本一致,指定条件后直接加delete()即可。 - query.use("item").byId("5710a81ab73a87092e17a02b").delete()
- query.use("item").eq("test","2").delete()
复制代码
如果只想要删除一条,那么可以用deleteOne() 校验 聚合运算 索引操作
|