java连接MongoDB

                            java连接MongoDB

5.1查询文档

5.1.1查询全部记录

(1)创建maven工程mongoDBDemo ,引入依赖。

  <dependencies>

    <dependency>

        <groupId>org.mongodb</groupId>

        <artifactId>mongodb-driver</artifactId>

        <version>3.4.1</version>

    </dependency>

  </dependencies>

(2)编写代码,遍历student集合所有数据:

MongoClient client=new MongoClient();//创建连接对象

MongoDatabase database = client.getDatabase("itcastdb");//获取数据库      

MongoCollection<Document> collection = database.getCollection("student");//获取集合

        

FindIterable<Document> list = collection.find();//获取文档集合

for( Document doc: list){//遍历集合中的文档输出数据

    System.out.println("name:"+ doc.getString("name") );

    System.out.println("sex:"+ doc.getString("sex") );

    System.out.println("age:"+ doc.getDouble("age") );//默认为浮点型

    System.out.println("address:"+ doc.getString("address") );

    System.out.println("--------------------------");

}

MongoDB的数字类型默认使用64位浮点型数值。{“x”3.14}{“x”3}。对于整型值,可以使用NumberInt4字节符号整数),{“x”:NumberInt(“3”)}  NumberLong8字节符号整数){“x”:NumberLong(“3”)}

5.1.2匹配查询

MongoDB使用BasicDBObject类型封装查询条件,构造方法的参数为key 和value .

 

示例:查询student集合中name为猪八戒的文档

 

//构建查询条件

BasicDBObject bson=new BasicDBObject("name", "猪八戒");      

FindIterable<Document> list = collection.find(bson);//获取文档集合

//....遍历集合

5.1.3模糊查询

构建模糊查询条件是通过正则表达式的方式来实现的

(1)完全匹配Pattern pattern = Pattern.compile("^name$");

(2)右匹配Pattern pattern = Pattern.compile("^.*name$");

(3)左匹配Pattern pattern = Pattern.compile("^name.*$");

(4)模糊匹配Pattern pattern = Pattern.compile("^.*name.*$");

示例:模糊查询student集合中address 中含有洞的文档记录

//模糊查询:like %洞%

Pattern queryPattern = Pattern.compile("^.*洞.*$");

BasicDBObject bson=new BasicDBObject("address", queryPattern);   

FindIterable<Document> list = collection.find(bson);//获取文档集合

//....遍历集合

5.1.4大于小于

在MongoDB提示符下条件json字符串为{ age: { $lt :20 } } ,对应的java代码也是BasicDBObject 的嵌套。

示例:查询student集合中age小于20的文档记录

//查询年龄小于20的       

BasicDBObject bson=new BasicDBObject("age", new BasicDBObject("$lt",20));

FindIterable<Document> list = collection.find(bson);//获取文档集

//....遍历集合

5.1.5条件连接--并且

示例:查询年龄大于等于20并且小于30的文档记录

//查询年龄大于等于20的        

BasicDBObject bson1=new BasicDBObject("age", new BasicDBObject("$gte",20));

//查询年龄小于30的

BasicDBObject bson2=new BasicDBObject("age", new BasicDBObject("$lt",30));

//构建查询条件and

BasicDBObject bson=new  BasicDBObject("$and", Arrays.asList(bson1,bson2)  );

 

5.1.6条件连接--或者

示例:查询年龄小于等于20或者性别为女的文档记录

BasicDBObject bson1=new BasicDBObject("age", new BasicDBObject("$lte",20));       

BasicDBObject bson2=new BasicDBObject("sex", "女");

//构建查询条件or

BasicDBObject bson=new BasicDBObject("$or", Arrays.asList( bson1, bson2 )  );

 

5.2增加文档

我们使用insertOne方法来插入文档。

示例:添加文档记录--名称:铁扇公主  性别:女 年龄:28   地址:芭蕉洞

//获取连接

MongoClient client=new MongoClient();

//得到数据库

MongoDatabase database = client.getDatabase("itcastdb");

//得到集合封装对象

MongoCollection<Document> collection = database.getCollection("student");

Map<String, Object> map=new HashMap();

map.put("name", "铁扇公主");

map.put("sex", "女");

map.put("age", 35.0);

map.put("address", "芭蕉洞");     

Document doc=new Document(map);       

collection.insertOne(doc);//插入一条记录

//collection.insertMany(documents);//一次性插入多条文档

5.3删除文档

示例:将名称为铁扇公主的文档删除

//获取连接

MongoClient client=new MongoClient();

//得到数据库

MongoDatabase database = client.getDatabase("itcastdb");

//得到集合封装对象

MongoCollection<Document> collection = database.getCollection("student");

BasicDBObject bson=new BasicDBObject("name", "铁扇公主");

collection.deleteOne(bson);//删除记录(符合条件的第一条记录)

//collection.deleteMany(bson);//删除符合条件的全部记录

5.4修改文档

示例:将红孩儿的地址修改为“南海”

//获取连接

MongoClient client=new MongoClient();

//得到数据库

MongoDatabase database = client.getDatabase("itcastdb");

//得到集合封装对象

MongoCollection<Document> collection = database.getCollection("student");

 

//修改的条件

BasicDBObject bson= new BasicDBObject("name", "红孩儿");

//修改后的值

BasicDBObject bson2 = new BasicDBObject("$set",new BasicDBObject("address", "南海"));

//参数1:修改条件  参数2:修改后的值

collection.updateOne(bson, bson2);

//collection.updateMany(filter, update);//修改符合条件的所有记录

updateMany方法用于修改符合条件的所有记录

updateOne方法用于修改符合条件的第一条记录

6.MongoDB连接池

6.1代码实现

MongoClient 被设计为线程安全的类,也就是我们在使用该类时不需要考虑并发的情况,这样我们可以考虑把MongoClient 做成一个静态变量,为所有线程公用,不必每次都销毁。这样可以极大提高执行效率。实际上,这是MongoDB提供的内置的连接池来实现的。   

    首先我们先创建一个“管理类”,相当于我们原来的BaseDao

import com.mongodb.MongoClient;

import com.mongodb.MongoClientOptions;

import com.mongodb.MongoClientOptions.Builder;

import com.mongodb.WriteConcern;

import com.mongodb.client.MongoDatabase;

 

public class MongoManager {

 

    private static MongoClient mongoClient=null;

   

    //对mongoClient初始化

    private static void init(){       

         mongoClient=new MongoClient();

    }

   

    public static MongoDatabase getDatabase(){

         if(mongoClient==null){

             init();

         }       

         return mongoClient.getDatabase("itcastdb");

    }

}

    然后我们创建一个StudentDao

import org.bson.Document;

import com.mongodb.client.MongoCollection;

import com.mongodb.client.MongoDatabase;

/**

 * 学员数据访问层

 * @author Administrator

 *

 */

public class StudentDao {

 

    public void save(String name,String sex,double age,String address){

         MongoDatabase database = MongoManager.getDatabase();

         MongoCollection<Document> collection = database.getCollection("student2");

         Document docment=new Document();

         docment.put("name", name);

         docment.put("sex", sex);      

         docment.put("age", age);

         docment.put("address", address);

         collection.insertOne(docment);

    }  

}

我们现在做个测试,循环插入2万条数据,看看执行时间是多长时间

import java.util.Date;

public class TestPool {

 

    public static void main(String[] args) {

         long startTime = new Date().getTime();//开始时间

        

         StudentDao studentDao=new StudentDao();

         for(int i=0;i<20000;i++){

             studentDao.save("测试"+i, "男", 25.0, "测试地址"+i);

         }

         long endTime = new Date().getTime();//完成时间

         System.out.println("完成时间:"+(endTime-startTime)+"毫秒");

    }

}

经过测试:所用毫秒数为3589

6.2参数设置

我们在刚才的代码基础上进行连接池参数的设置

修改MongoManager的init方法

//对mongoClient初始化

private static void init(){

         //连接池选项

         Builder builder = new MongoClientOptions.Builder();//选项构建者  

         builder.connectTimeout(5000);//设置连接超时时间

         builder.socketTimeout(5000);//读取数据的超时时间

         builder.connectionsPerHost(30);//每个地址最大请求数      

         builder.writeConcern(WriteConcern.NORMAL);//写入策略,仅抛出网络异常

         MongoClientOptions options = builder.build();

         mongoClient=new MongoClient("127.0.0.1",options);   

}

 

再次进行测试:所用的毫秒1544

 

下面是写入策略。

WriteConcern.NONE:没有异常抛出

WriteConcern.NORMAL:仅抛出网络错误异常,没有服务器错误异常

WriteConcern.SAFE:抛出网络错误异常、服务器错误异常;并等待服务器完成写操作。

WriteConcern.MAJORITY: 抛出网络错误异常、服务器错误异常;并等待一个主服务器完成写操作。

WriteConcern.FSYNC_SAFE: 抛出网络错误异常、服务器错误异常;写操作等待服务器将数据刷新到磁盘。

WriteConcern.JOURNAL_SAFE:抛出网络错误异常、服务器错误异常;写操作等待服务器提交到磁盘的日志文件。

WriteConcern.REPLICAS_SAFE:抛出网络错误异常、服务器错误异常;等待至少2台服务器完成写操作

发布了62 篇原创文章 · 获赞 49 · 访问量 12万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览