https://blog.51cto.com/aiilive/1339058

MongoDB提供的Java操作API可以说是对Mongo数据库命令的Java翻译,熟悉Mongo命令,熟悉Java操作数据库的基本思路,很容易掌握基本操作。

  • 数据库连接

    1. package com.im;
    2. public final class SystemConstant {
    3. public static final class Configure {
    4. public static final String HOST = "127.0.0.1";
    5. public static final int PORT = 27017;
    6. public static final String USERNAME = "";
    7. public static final String PASSWORD = "";
    8. public static final String DATABASE = "im";
    9. }
    10. }
     
    1. package com.im;
    2. import java.net.UnknownHostException;
    3. import com.mongodb.Mongo;
    4. import com.mongodb.MongoException;
    5. public class MongoFactory {
    6. private static MongoFactory mongoFactory;
    7. private MongoFactory() {
    8. }
    9. public static MongoFactory getInstance() {
    10. if (mongoFactory == null) {
    11. mongoFactory = new MongoFactory();
    12. }
    13. return mongoFactory;
    14. }
    15. public Mongo getMongo() {
    16. Mongo mongo = null;
    17. try {
    18. mongo = new Mongo(SystemConstant.Configure.HOST,
    19. SystemConstant.Configure.PORT);
    20. } catch (UnknownHostException e) {
    21. e.printStackTrace();
    22. } catch (MongoException e) {
    23. e.printStackTrace();
    24. }
    25. return mongo;
    26. }
    27. }
     

      数据库链接少不了的主机名,端口号,数据库名称。上面代码中的Mongo对象就相当与Connection对象。

  • 数据库的操作

    下面的每个方法代表一个方面的测试

    测试类初始化方法:

    1. private static BaseDao dao;
    2. @BeforeClass
    3. public static void start() {
    4. dao = new BaseDao("users","uf");
    5. }
     

    关于BaseDao是对Mongo操作数据库的基本常用的方法做了封装的一个DAO对象,代码会在本文末尾附上。

插入:

  1. // 添加一条记录
  2. public void test1() {
  3. BasicDBObject jo = new BasicDBObject();
  4. jo.put("_id", "00001");
  5. jo.put("name", "Tomcat");
  6. jo.put("age", 22);
  7. jo.put("interest", new String[] { "swimming", "Taiji", "football" });
  8. int actual = dao.insert(jo);
  9. System.out.println(actual);
  10. Assert.assertEquals(1, actual);
  11. }
 
  1. // 添加多条记录
  2. public void test2() {
  3. int actual = 0;
  4. int size = 0;
  5. for (int i = 2; i < 11; i++) {
  6. BasicDBObject jo = new BasicDBObject();
  7. jo.put("_id", "0000" + i);
  8. jo.put("name", "Tomcat_" + i);
  9. jo.put("age", i * 2);
  10. jo.put("interest", new String[] { "swimming", "Taiji" });
  11. actual += dao.insert(jo);
  12. size++;
  13. }
  14. Assert.assertEquals(size, actual);
  15. }

BasicDBObject对象是Mongo的BSONObject的基本实现类,而BSONObject对象正是Key-Value的形式的Map保存到数据库中。

基本的查询(主键查询,查询集合,条件查询)

  1. // 查询指定编号的记录
  2. public void test3() {
  3. BasicDBObject query = new BasicDBObject();
  4. query.put("_id", "00001");
  5. List<DBObject> dboList = dao.query(query);
  6. System.out.println(dboList.get(0).toString());
  7. Assert.assertEquals(1, dboList.size());
  8. }
  9. // 模糊查询,统计记录结果数量
  10. public void test4() {
  11. BasicDBObject query = new BasicDBObject();
  12. query.put("interest", new String[] { "swimming", "Taiji" });
  13. long count = dao.getCount(query);
  14. Assert.assertEquals(9, count);
  15. }
  16. // 模块查询,查询结果集合
  17. public void test5() {
  18. BasicDBObject query = new BasicDBObject();
  19. query.put("interest", new String[] { "swimming", "Taiji" });
  20. List<DBObject> dboList = dao.query(query);
  21. for (DBObject jo : dboList) {
  22. System.out.println(jo.toString());
  23. }
  24. Assert.assertEquals(9, dboList.size());
  25. }
 

下面是插入数据后的数据库的数据情况,图中数据是各种测试后的数据,不完全对于每个方法的操作后数据库情况。

更新操作

Mongo更新操作要准备两个BasicDBObject对象,一个是要更新的对象,另一个是更新后的对象。

  1. // 更新指定记录的信息
  2. public void test6() {
  3. BasicDBObject query = new BasicDBObject();
  4. query.put("_id", "00001");
  5. BasicDBObject jo = new BasicDBObject();
  6. jo.put("_id", "00001");
  7. jo.put("name", "Jackson");
  8. jo.put("interest", new String[] { "Song", "Taiji", "Running" });
  9. jo.put("firends",
  10. new BasicDBObject[] {
  11. (BasicDBObject) dao.query(
  12. new BasicDBObject("_id", "00002")).get(0),
  13. (BasicDBObject) dao.query(
  14. new BasicDBObject("_id", "00002")).get(0) });
  15. int actual = dao.update(query, jo);
  16. Assert.assertEquals(1, actual);
  17. }
 
 
删除操作
  1. // 删除指定记录
  2. public void test7() {
  3. BasicDBObject query = new BasicDBObject();
  4. query.put("_id", "000010");
  5. dao.delete(query);
  6. List<DBObject> dboList = dao.query(query);
  7. Assert.assertEquals(0, dboList.size());
  8. }

Mongo删除比较容易,指定一个BasicDBObject作为匹配条件,将删除匹配的所有记录(文档对象)。

多条件查询

在数据库的CRUD操作中查询操作更加多样化和频繁,Mongo的Java驱动程序中对Mongo数据自身的各种条件查询做了封装,提供一个QueryBuilder的类,将Mongo中的查询操作对象化,用此类来创建出要查询的条件,然后在进行基本查询。

  1. // 指定多条件的查询
  2. public void test8() {
  3. BasicDBObject query = new BasicDBObject();
  4. BasicDBObject condition = new BasicDBObject();
  5. condition.put(QueryOperators.GTE, 10);
  6. query.put("age", condition);
  7. List<DBObject> dboList = dao.query(query);
  8. for (DBObject jo : dboList) {
  9. System.out.println(jo.toString());
  10. }
  11. Assert.assertEquals(5, dboList.size());
  12. }
  13. public void test9() {
  14. BasicDBObject query = new BasicDBObject();
  15. BasicDBObject condition = new BasicDBObject();
  16. condition.put(QueryOperators.GTE, 10);
  17. condition.put(QueryOperators.LTE, 16);
  18. query.put("age", condition);
  19. List<DBObject> dboList = dao.query(query);
  20. for (DBObject jo : dboList) {
  21. System.out.println(jo.toString());
  22. }
  23. Assert.assertEquals(4, dboList.size());
  24. }
  25. public void test10() {
  26. QueryBuilder qb = new QueryBuilder();
  27. BasicDBObject query = (BasicDBObject) qb.and("age")
  28. .greaterThanEquals(10).lessThanEquals(14).and("interest")
  29. .in(new String[] { "swimming", "Taiji","football" }).get();
  30. List<DBObject> dboList = dao.query(query);
  31. for (DBObject jo : dboList) {
  32. System.out.println(jo.toString());
  33. }
  34. }
 

在test8方法中的查询条件是通过创建BasicDBObject来实现,如果条件更多这样操作会写很多代码而且不易将各个条件关联起来,后面的test9和test10方法则使用QueryBuilder来实现。


上述对Mongo数据的操作侧重于准备查询条件,插入对象,删除条件,更新条件等,主要原因是Mongo数据库操作再不是我们以前SQL那样具有高度标准化的操作,相反更多的注意力集中到如何在程序语言中翻译Mongo命令操作,原因很简单没有统一的标准实现。

至于数据库的基本操作Mongo的Java驱动自然要提供最基本的操作功能。

附上BaseDao代码:

  1. package com.im.dao;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. import com.im.MongoFactory;
  8. import com.im.SystemConstant;
  9. import com.mongodb.BasicDBObject;
  10. import com.mongodb.DB;
  11. import com.mongodb.DBCollection;
  12. import com.mongodb.DBCursor;
  13. import com.mongodb.DBObject;
  14. import com.mongodb.WriteResult;
  15. import com.mongodb.gridfs.GridFS;
  16. import com.mongodb.gridfs.GridFSDBFile;
  17. import com.mongodb.gridfs.GridFSInputFile;
  18. public class BaseDao {
  19. /**
  20. * 数据库对象
  21. */
  22. private DB db;
  23. /**
  24. * 数据库文档对象(相当于RDBMS中的表)
  25. */
  26. private DBCollection dbCollection;
  27. /**
  28. * 数据库文件存在集合
  29. */
  30. private GridFS fs;
  31. public BaseDao(String docBucket, String fileBucket) {
  32. db = MongoFactory.getInstance().getMongo()
  33. .getDB(SystemConstant.Configure.DATABASE);
  34. this.dbCollection = db.getCollection(docBucket);
  35. if (fileBucket.endsWith("") || fileBucket == null) {
  36. fileBucket = "fs";
  37. }
  38. this.setFs(new GridFS(db, fileBucket));
  39. }
  40. /**
  41. * 插入文档
  42. *
  43. * @param jo
  44. * @return
  45. */
  46. public int insert(DBObject jo) {
  47. WriteResult wr = dbCollection.save(jo);
  48. return wr.getN();
  49. }
  50. /**
  51. * 删除文档
  52. *
  53. * @param jo
  54. * 删除的匹配文档
  55. */
  56. public void delete(DBObject jo) {
  57. dbCollection.remove(jo);
  58. }
  59. /**
  60. * 更新文档
  61. *
  62. * @param query
  63. * 指定更新的文档
  64. * @param jo
  65. * 更新后的文档
  66. * @return
  67. */
  68. public int update(DBObject query, DBObject jo) {
  69. WriteResult wr = dbCollection.update(query, jo);
  70. return wr.getN();
  71. }
  72. /**
  73. * 查询文档
  74. *
  75. * @param query
  76. * 查询的匹配文档
  77. * @return
  78. */
  79. public List<DBObject> query(DBObject query) {
  80. DBCursor dbc = dbCollection.find(query);
  81. List<DBObject> joList = new ArrayList<DBObject>();
  82. while (dbc.hasNext()) {
  83. DBObject jo = dbc.next();
  84. joList.add(jo);
  85. }
  86. return joList;
  87. }
  88. /**
  89. * 存储文件
  90. *
  91. * @param file
  92. */
  93. public void saveFile(File file) {
  94. try {
  95. GridFSInputFile gif = fs.createFile(file);
  96. gif.save();
  97. } catch (IOException e) {
  98. e.printStackTrace();
  99. }
  100. }
  101. /**
  102. * 存储输入流,并指定的一些描述信息
  103. *
  104. * @param in
  105. * @param id
  106. * @param filename
  107. * 文件名
  108. * @param contentType
  109. * 文件内容类型
  110. */
  111. public void saveFile(InputStream in, Object id, String filename,
  112. Object contentType) {
  113. DBObject query = (DBObject) new BasicDBObject("_id", id);
  114. GridFSDBFile gff = fs.findOne(query);
  115. if (gff == null) {
  116. GridFSInputFile gif = fs.createFile(in);
  117. gif.setFilename(filename);
  118. gif.put("_id", id);
  119. gif.put("contentType", contentType);
  120. gif.save();
  121. }
  122. }
  123. /**
  124. * 查询指定ID的文件
  125. *
  126. * @param id
  127. * @return
  128. */
  129. public GridFSDBFile queryFile(Object id) {
  130. DBObject query = (DBObject) new BasicDBObject("_id", id);
  131. return fs.findOne(query);
  132. }
  133. /**
  134. * 查询指定文件名的文件
  135. *
  136. * @param filename
  137. * @return
  138. */
  139. public GridFSDBFile queryFile(String filename) {
  140. DBObject query = (DBObject) new BasicDBObject("filename", filename);
  141. return fs.findOne(query);
  142. }
  143. /**
  144. * 查询文件
  145. *
  146. * @param query
  147. * 查询的匹配文件
  148. * @return
  149. */
  150. public List<GridFSDBFile> queryFile(DBObject query) {
  151. return fs.find(query);
  152. }
  153. /**
  154. * 统计查询结果数
  155. *
  156. * @param query
  157. * 查询匹配的文档
  158. * @return
  159. */
  160. public long getCount(DBObject query) {
  161. return dbCollection.getCount(query);
  162. }
  163. public GridFS getFs() {
  164. return fs;
  165. }
  166. public void setFs(GridFS fs) {
  167. this.fs = fs;
  168. }
  169. public DBCollection getDbCollection() {
  170. return dbCollection;
  171. }
  172. public void setDbCollection(DBCollection dbCollection) {
  173. this.dbCollection = dbCollection;
  174. }
  175. }

Java对MongoDB的CRUD的更多相关文章

  1. Mongodb系列- java客户端简单使用(CRUD)

    Mongodb提供了很多的客户端: shell,python, java, node.js...等等. 以 java 为例实现简单的增删改查 pom文件: <dependencies> & ...

  2. 【MongoDB for Java】Java操作MongoDB

    上一篇文章: http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html介绍到了在MongoDB的控制台完成MongoDB的数据操作,通过 ...

  3. [转]MongoDB for Java】Java操作MongoDB

    原文地址: MongoDB for Java]Java操作MongoDB 开发环境: System:Windows IDE:eclipse.MyEclipse 8 Database:mongoDB 开 ...

  4. Java操作MongoDB

    上一篇文章: http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html 介绍到了在MongoDB的控制台完成MongoDB的数据操作,通 ...

  5. Java实现mongodb原生增删改查语句

    Java实现mongodb原生增删改查语句 2018-03-16 自动化测试时,需校验数据库数据,为了快速自动化,在代码中用原生增删改查语句操作mongodb 结构 代码 0 pom.xml < ...

  6. java 对mongodb的操作

    java 对mongodb的操作 1.1连单台mongodb Mongo mg = newMongo();//默认连本机127.0.0.1  端口为27017 Mongo mg = newMongo( ...

  7. springboot连接mongodb进行CRUD

    springboot连接mongodb进行CRUD的过程: 在执行以下操作前已安装了mongodb并创建了用户和数据库,使用Robo 3T可成功连接. 1.创建springboot项目,加入以下mav ...

  8. MongoDB的CRUD操作

    1. 前言 在上一篇文章中,我们介绍了MongoDB.现在,我们来看下如何在MongoDB中进行常规的CRUD操作.毕竟,作为一个存储系统,它的基本功能就是对数据进行增删改查操作. MongoDB中的 ...

  9. JAVA操作MongoDB数据库

    1. 首先,下载MongoDB对Java支持的驱动包 驱动包下载地址:https://github.com/mongodb/mongo-java-driver/downloads 2.Java操作Mo ...

随机推荐

  1. [工具推荐]005.Axure RP Pro 7.0模拟C#TAB控件

    有一次,主管安排我写一个项目的原型,但是项目中涉及到了Tab控件,在Axure中的控件中找了一番,没有找着Tab控件.那么我们只能换种法子来实现它了,我们用到了Dynamic Panel来模拟. 1. ...

  2. DataFrame的apply用法

    DataFrame的apply方法: def cal_value_percent(row,total_value): row['new_column']=row[estimated_value_col ...

  3. winxp无法访问win10教育版共享资源的问题处理

    一.问题来源: dell5460笔记本上一个winxp系统虚拟机,访问一台lenovoT470笔记本win10教育版系统上的共享资源(使用命令行方式:net use s: \\172.18.45.10 ...

  4. Chisel3 - util - Lookup

    https://mp.weixin.qq.com/s/g85Si6n37D9PYfR5hEoRQQ     实现一个查找逻辑.   参考链接: https://github.com/freechips ...

  5. Chisel3 - Tutorial - VendingMachineSwitch

    https://mp.weixin.qq.com/s/5lcMkenM2zTy-pYOXfRjyA   演示如何使用switch/is来实现状态机.   参考链接: https://github.co ...

  6. Java四种权限修饰符

    四种权限修饰符

  7. Java获取当前时间到凌晨12点剩余秒数

    有个获取登陆用户是否每天第一次登陆系统需求,考虑不需要入库操作,就用redis设置key每天凌晨0点删除 /** * 获取当前时间到凌晨12点的秒数 * @return */ public Long ...

  8. Java实现 LeetCode 722 删除注释(暴力筛选)

    722. 删除注释 给一个 C++ 程序,删除程序中的注释.这个程序source是一个数组,其中source[i]表示第i行源码. 这表示每行源码由\n分隔. 在 C++ 中有两种注释风格,行内注释和 ...

  9. Java实现 蓝桥杯VIP 算法提高 分苹果

    算法提高 分苹果 时间限制:1.0s 内存限制:256.0MB 问题描述 小朋友排成一排,老师给他们分苹果. 小朋友从左到右标号1-N.有M个老师,每次第i个老师会给第Li个到第Ri个,一共Ri-Li ...

  10. 性能测试中TPS上不去的原因

    TPS(Transaction Per Second):每秒事务数,指服务器在单位时间内(秒)可以处理的事务数量,一般以request/second为单位. 压测中为什么TPS上不去的原因: .网络带 ...