首先声明:由于我所使用的mongoDB版本为3.6,只针对3.6版本的java代码书写做以下事例。至于mongoDB低版本的好多方法在高版本中已经做了很大的改变。所以我建议各位小伙伴也尽量使用该版本的。(到我现在写的这篇博客为止,mongoDB最新的版本是4.0)
下载地址: https://www.mongodb.com/download-center#community
以上所示是选择版本和运行平台的类型和包的类型。
对于已经熟悉了在windows下cmd命令行里操作mongoDB的朋友来说,我相信对于java的结合应该来说不是很困难。无非的就是多看看APl文档说明这些!
好了 以上说了这么多。那就直接进入我们今天的主题吧。
要想应用mongoDB和java的结合,第一步就是建了一个java项目.确切来说是一个简单的maven工程。如下:
这里只需要一个类做演示。(实现最基本的 增 删 改 查)
pom.xml 文件配置则更是简单。只需要引入一个jar包即可。如下所示:
当然了,对于不同版本的jar在maven库里请自行下载。
下载地址:https://mvnrepository.com/artifact/org.mongodb/mongo-java-driver
搭建后这个项目之后,就直接开始写代码测试了。首先请确保你的mongoDB安装并且服务是开启的。
测试代码如下:
先贴上导包的信息。因为有一个类(MongoClient)我在测试的时候导错了,废了好大劲。所以为了防止有的朋友搞错我先贴出导包的信息。
import org.bson.Document;
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;
import com.mongodb.client.model.Projections;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoClientOptions.Builder;
下面的代码全是在 main方法里面执行!!!
下面是AppMongoDB.class代码
final static String userName = "root";
final static String password = "root123";
final static String source = "ycong";
public static void main(String[] args) {
//以下是基于MongoDB 3.7版本 官方给的APi 说明创建连接
/**
* 使用builder来设置连接池
*/
Builder builder = new Builder();
//设置每个主机的最大连接数
builder.connectionsPerHost(30);
//设置最小的连接数
builder.minConnectionsPerHost(10);
//设置超时时间 2秒
builder.connectTimeout(2000);
//设置线程等待的最长时间
builder.maxWaitTime(4000);
/**
* 此参数跟connectionsPerHost的乘机为一个线程变为可用的最大阻塞数,
* 超过此乘机数之后的所有线程将及时获取一个异常.eg.connectionsPerHost=10 and
* threadsAllowedToBlockForConnectionMultiplier=5,
* 最多50个线程等级一个链接,推荐配置为5
*/
builder.threadsAllowedToBlockForConnectionMultiplier(5);
//最大空闲时间
builder.maxConnectionIdleTime(7000);
//设置连接池的最大生命周期时间
builder.maxConnectionLifeTime(7000);
//连接超时时间
builder.socketTimeout(8000);
MongoClientOptions myOptions = builder.build();
//连接mongoDB的服务
ServerAddress serverAdderss = new ServerAddress("localhost",27017);
List<ServerAddress> listAdd = new ArrayList<ServerAddress>();
listAdd.add(serverAdderss);
MongoCredential mongoCre = MongoCredential.createCredential(userName, source, password.toCharArray());
MongoClient mongoClient = new MongoClient(listAdd,mongoCre,myOptions);
MongoDatabase mongoDatabase = mongoClient.getDatabase("ycong");//你的数据库名称,据说是没有这个,mongoDB会自己创建
}
上面的设置其实差不多你可以理解为是固定的吧。有的朋友设置有区别其实也是大同小异(由你自己设置)!这个不去过多的纠结。以上的代码其实执行到最后,就是获取的我们要操作的数据库实列。很显然我这个数据库的名字是"ycong". 那么我们接下来应该操作mogoDatabase这个对象了。
现在我们有了“ycong”这个数据库!接下来就给库“建表”和添加数据!
mongoDB数据库不同于传统的关系型数据库(如 mysql,oracle等)。至于他们之间的不同,请大家去网上自行了解,这里不说明。
mongoDB数据库里面建表其实是创建一个集合文档。 所谓的字段和数据的关系其实是 key-value的关系。这一点适合redis思想是相同的。
创建集合文档代码如下:
//创建一个集合文档
mongoDatabase.createCollection("doc4");//doc4是文档名。这个你随便起。
//下面这一步 就是获取你创建的 这个文档集合 接下来就直接操作他
MongoCollection<Document> collection2 = mongoDatabase.getCollection("doc4");
//现在我们的集合文档没有对象,所以你得创建 一个文档对象。
Document document2 = new Document();
document2.append("name", "唐伯虎");
document2.append("age", 23);
document2.append("cpm", "LOVE");
String doc = "别人笑我太疯癫,我笑他人看不穿。不见武林豪杰墓,无花无酒锄作田!";
document2.append("doc", doc);
collection2.insertOne(document2);//然后添加到你所创建的集合文档里面 相当于 sql中 insert语句
上面得代码你很容易就看出文档得添加是append(key,value)的形式添加的。key相当于传统sql表中的字段,value是数据。
执行完上面的代码之后 我们的集合文档里面就有了文档。(表里面就有了数据)
然后我们就来查询一下这个文档对象!
代码如下:
//find方法 返回FindIterable对象 所以用它接收
FindIterable<Document> findAble2 = collection2.find();
//获取集合文档中的第一个文档对象
Document document3 = findAble2.first();
String string3 = document3.toString();
System.out.println("新创建的对象并获得:"+string3);
//我的这个表里面只要一个文档对象。要是多的对象 我们可以使用迭代器进行输出
// FindIterable<Document> find2 = collection2.find();
// MongoCursor<Document> iterator = find2.iterator();
// //迭代器查找对象 输出这个集合文档的所有对象
// while (iterator.hasNext()) {
// System.out.println(iterator.next());
// }
可以看的,传统的sql是对表进行操作,mongoDB的操作对象是集合文档。上面这个写法相当于“select * from table”,当然一般项目重,使用条件查询的很多(where id = ? and name >? 类似于这种)。
下面我们就来重点看一下mongoDB3.6做了哪些新的查询优化:
比如我想查询 name="唐伯虎"的这个条件的所有信息,写法如下:
FindIterable<Document> find2 =collection2.find(Filters.eq("name", "唐伯虎"));
MongoCursor<Document> iterator = find2.iterator();
//迭代器查找对象 输出这个集合文档的所有对象
while (iterator.hasNext()) {
System.out.println("输出结果:"+iterator.next());
}
再比如我想查询一下name="唐伯虎"并且age=23 符合这两条件的信息,写法如下:
FindIterable<Document> find2 =collection2.find(Filters.and(Filters.eq("name", "唐伯虎"),Filters.eq("age",23)));
MongoCursor<Document> iterator = find2.iterator();
//迭代器查找对象 输出这个集合文档的所有对象
while (iterator.hasNext()) {
System.out.println("输出结果:"+iterator.next());
}
至于判断更多的条件查询大家去看看API就清楚了。(比如 > ,<, no null 等这些条件。API写的已经很详细了。)
下面我再补充一点的就是关于过滤查询。
什么是 过滤查询呢?
其实就是 传统的sql查询返回想要的字段数据!
举个例子:比如你要查询一个学生的基本信息,但是这个学生的基本信息有30几个字段。你只想要他的名字和年龄。
那么写sql的时候你只查询他的这连个字段就可以了,其他的不需要!
查询实列:请查询集合文档中age=23的对象的name和cpm这两个值?
在mongoDB中的写法如下:
FindIterable<Document> find2 =collection2.find(Filters.eq("age",23)).projection(Projections.include("name","cpm"));
MongoCursor<Document> iterator = find2.iterator();
//迭代器查找对象 输出这个集合文档的所有对象
while (iterator.hasNext()) {
System.out.println("输出结果:"+iterator.next());
}
Projections.include()这个方法就是包含要返回的key的value
有一点要注意,假如你返回要这个人信息的name,age,doc...有数10个信息。怎么写呢?像这样拼接吗:
(Projections.include("name","age","3","4"....."10"))
这样写当然是可以的,但是代码显得有点乱,而且也不好维护! 当然还有更简单的方法!
查询要求:假如查询条件是age=23,返回他的name,cpm,age,doc这些信息。
代码如下:
List<String> listNames = new ArrayList<String>();
listNames.add("name");
listNames.add("age");
listNames.add("cpm");
listNames.add("doc");
FindIterable<Document> find2 =collection2.find(Filters.eq("age",23)).projection(Projections.include(listNames));
可以看到封装成一个 list集合 在把这个list集合传进去就可以了。
当然还有相反的查询方法。就是Projections.exclude(“name”)这个方法。其实就是返回除key=name的所有key的value.