package com.mongo.text;
import java.util.ArrayList;
import java.util.List;
import org.bson.Document;
import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
public class MongoDBJDBC {
private static final String host = "127.0.0.1";
private static final int port = 27017;
private static final String userName = "账号";
private static final String password = "密码";
private static final String dataBaseName = "数据库名称";
private static final String tableName = "集合名称";
public static void main(String[] args){
MongoClient mongoClient=null;
try {
// 连接到MongoDB服务 如果是远程连接可以替换“localhost”为服务器所在IP地址
// ServerAddress()两个参数分别为 服务器地址 和 端口
ServerAddress serverAddress = new ServerAddress(host,port);
List<ServerAddress> addrs = new ArrayList<ServerAddress>();
addrs.add(serverAddress);
//MongoCredential.createScramSha1Credential()三个参数分别为 用户名 数据库名称 密码
MongoCredential credential = MongoCredential.createScramSha1Credential(userName, dataBaseName, password.toCharArray());
List<MongoCredential> credentials = new ArrayList<MongoCredential>();
credentials.add(credential);
// 通过连接认证获取MongoDB连接
// 第一种方式:MongoClientURI 参数解析:"mongodb://用户名:密码@地址:端口/?authSource=数据库名称"
// MongoClientURI uri = new MongoClientURI("mongodb://luhailong:luhailong@10.4.66.195:27017/?authSource=demoDB");
// mongoClient = new MongoClient(uri);
// 第二种方式:MongoClient 参数解析:第一个参数里是地址跟端口的集合,第二个参数是安全验证集合
mongoClient = new MongoClient(addrs,credentials);
// 连接到数据库
MongoDatabase mongoDatabase = mongoClient.getDatabase(dataBaseName);
System.out.println("Connect to database successfully");
// 获取集合 参数为“集合名称”
MongoCollection<Document> mongoCollection = mongoDatabase.getCollection(tableName);
System.out.println("Collection mycol selected successfully");
// 添加
//addMongoDBList(mongoCollection);
// 删除
//dropMongoDB(mongoCollection);
// 查询
queryMongoDBList(mongoCollection);
} catch (Exception e) {
System.out.println("MongoDBJDBC.java:出错了出错了出错了");
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
}finally{
mongoClient.close(); //关闭MongoDB的连接
}
}
/**
* 查询
* mongoCollection 根据集合名称获取的集合
* */
public static MongoCursor<Document> queryMongoDBList(MongoCollection<Document> mongoCollection){
// 没有查询条件的方式
FindIterable<Document> findIterable = mongoCollection.find();
MongoCursor<Document> mongoCursor = findIterable.iterator();
System.out.println("以下结果为没有查询条件(查询全部)");
while(mongoCursor.hasNext()){
System.out.println(mongoCursor.next());
}
// 如果只有一个条件可以用这样的形式
FindIterable<Document> findIterable1 = mongoCollection.find(Filters.eq("age", "18"));
MongoCursor<Document> mongoCursor1 = findIterable1.iterator();
System.out.println("以下结果为一个查询条件");
while(mongoCursor1.hasNext()){
Document d=mongoCursor1.next();
System.out.println("age的值为"+d.get("age"));
//System.out.println(mongoCursor1.next());
}
// 多个查询条件
BasicDBObject cond=null;
BasicDBList condList =null;
cond = new BasicDBObject();
condList=new BasicDBList();//BasicDBList和"$in"作为BasicDBObject参数使用,有点类似or
condList.add((new BasicDBObject("age", new BasicDBObject("$gt", "18"))));
condList.add((new BasicDBObject("age", new BasicDBObject("$lt", "20"))));
cond.put("$or", condList);//多个条件or的实现方法,此处测试MongoDB3.4.2驱动也为3.4.2其中$gt与$gte和$lt与$lte效果一样,可能是bug
cond.put("name","李四");//put多个不同规则相当于and操作
FindIterable<Document> findIterable2 = mongoCollection.find(cond);
MongoCursor<Document> mongoCursor2 = findIterable2.iterator();
System.out.println("以下结果测试and条件查询");
while(mongoCursor2.hasNext()){
System.out.println(mongoCursor2.next());
}
return mongoCursor;
}
/**
* 添加
* mongoCollection 根据集合名称获取的集合
* */
public static void addMongoDBList(MongoCollection<Document> mongoCollection){
/**
* 1. 创建文档 org.bson.Document 参数为key-value的格式
* 2. 创建文档集合List<Document>
* 3. 将文档集合插入数据库集合中 mongoCollection.insertMany(List<Document>) 插入单个文档可以用 mongoCollection.insertOne(Document)
* */
Document document = new Document("name", "张三").
append("age", "18").
append("sex", "man");
Document document1 = new Document("name", "李四").
append("age", "20").
append("sex", "girl");
List<Document> documents = new ArrayList<Document>();
documents.add(document);
documents.add(document1);
//增加文档方法
//将含有多个document的List插入到数据库中,可以含有一个或多个,如果只插入一个document也可以用insertOne(document)代替
mongoCollection.insertMany(documents);
}
/**
* 删除
* mongoCollection 根据集合名称获取的集合
* */
public static void dropMongoDB(MongoCollection<Document> mongoCollection){
// 删除符合条件的第一个文档
mongoCollection.deleteOne(Filters.eq("name", "张三"));
// 删除所有符合条件的文档
// mongoCollection.deleteMany (Filters.eq("name", "张三"));
}
}