本篇博客只列举出基本操作,
一 . 依赖引入
想要在SpringBoot里面很好的使用MongoDB api,需要引入如下依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
<relativePath />
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<!-- 使用一个Json的jar包来解析MongoDB文档,推荐使用阿里的fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.37</version>
</dependency>
</dependencies>
二.使用SpringBoot操作MongoDB
注意 : 下面的示例代码里,前面定义的变量, 后面举例的时候可能不会重新定义, 而是直接拿来使用!!~
通过如下示例可以获得MongoDB的连接:
String uri = "mongodb://username:password@ip:port/admin";
String database = "databaseName";
// 注意 : 上面的uri,database,建议配置在springbooot里的yml文件或者properties文件里面,这里为了方便直接使用了硬编码的方式,实际上是很不规范的操作
mongoConnection();
/**
* 获取Mongodb数据库连接
* @return MongoTemplate对象
*/
private MongoTemplate mongoConnection() {
MongoTemplate mongoTemplate = null;
try {
MongoClientURI clientURI = new MongoClientURI(uri);
MongoClient client = new MongoClient(clientURI);
mongoTemplate = new MongoTemplate(client, database);
return mongoTemplate;
} catch (Exception e) {
// 注意: 实际开发中不推荐采用这种形式打印日志,请使用标准的日志api,这里是为了方便
System.out.println("获取数据库连接失败! " + e.getMessage());
return mongoTemplate;
}
}
插入数据主要是调用**MongoTemplate**对象的**doSave**方法,
传入参数 <T objectToSave>, <String collectionName>
举例如下 : 假设我们想要往数据库里面插入一个学生的信息(包括姓名和年龄)
// 常规插入方式
String collectionName = "student"
String studentInfo = "{\n \"NAME\": \"xmr\",\n \"AGE\": \"23\",\n }"
mongoTemplate.save(studentInfo, collectionName)
实际开发中还有一种很常见的方式,就是借助于实体类 :
Student实体类如下:
// 上述实体类使用了lombok, 避免手写get,set方法,使代码简洁
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class Student {
@JSONField(name="NAME")
private String NAME;
@JSONField(name="AGE")
private String AGE;
// 使用实体类方式插入
String collectionName = "student";
Student student = new Student();
student.setNAME("xmr");
student.setAGE("23");
mongoTemplate.save(student, collectionName);
使用上述的方法插入到数据库的数据,会发现数据比预期的多了一列,
即多出了该实体类所在的包信息,可以在代码里面使用如下转换来避免
String studentStr = JSONObject.toJSONString(student);
mongoTemplate.save(studentStr, collectionName);
第一种方式, 直接使用MongoTemplate的remove方法
传入参数 <Query query>, <Class<?> entityClass>, <String collectionName>
// 假设我们要删除student表里面,所有姓名为xmr的数据,可以使用如下代码:
Query query = new Query();
Criteria.where("NAME").is("xmr");
mongoTemplate.remove(query, Student.class, collectionName);
当然,也可以不借助实体类,直接删除掉满足查询条件的数据
传入参数 <Query query>, <String collectionName>,如下:
mongoTemplate.remove(query, collectionName);
上述方法的局限性在于, 如果只是想删除一条数据,而不是全部,就办不到
这种情形可以使用下面的api:
// 首先通过MongoTemplate获取一个MongoCollection<Document> 对象
MongoCollection<Document> mongoCollection = mongoTemplate.getCollection(collectionName);
// 调用deleteOne方法删除一条数据 : 传入参数 : <Bson filter>
mongoCollection.deleteOne(Filters.eq("NAME", "xmr"));
// 当然也可以使用deleteMany方法,删除掉满足条件的所有数据 :
mongoCollection.deleteMany(Filters.eq("NAME", "xmr"));
比较常用的一种方式是使用MongoTemplate的upsert方法
传入参数 :
<Query query>, <Update update>, <Class<?> entityClass>, <String collectionName>
举例: 现在我想要把student集合里面,姓名为xmr的更改为jack,示例代码如下:
Query query = new Query();
Criteria.where("NAME").is("xmr");
Update update = new Update();
update.set("NAME", "jack");
mongoTemplate.upsert(query, update, Student.class, collectionName);
注意 : 上述场景中,如果根据查询条件匹配不到相应的数据,会把更新的数据插入到数据库中
如果能够匹配到相应的数据,只更新第一条记录
如果不希望查询不到的时候进行插入,需要使用下面的api
updateFirst 不借助实体类**
参数列表 : <final Query query>, <final Update update>, <final String collectionName>
mongoTemplate.updateFirst(query, update, collectionName)
updateFirst 借助实体类**
参数列表 : <final Query query>, <final Update update>,<Class<?> entityClass>, <final String collectionName>
-
如果我希望更新所有查询到的数据,就需要使用下面的api:
updateMulti
参数列表和updateFirst完全相同
mongoTemplate.updateMulti(query, update, collectionName)
mongoTemplate.updateMulti(query, update, Student.class, collectionName)
对于MongoDB,我们对它的使用很大程度上都是利用它优秀的查询能力
比较常用的查询方法 :
查询满足条件的一条记录 : findOne
查询满足条件的全部记录 : find
参数列表如下:
<Query query>, <Class<T> entityClass>, <String collectionName>
Query query = new Query();
Criteria.where("NAME").is("xmr");
// 查询student集合里面姓名为xmr的一条记录
mongoTemplate.findOne(query, Student.class, collectionName);
// 查询student集合里面姓名为xmr的全部记录
mongoTemplate.find(query, Student.class, collectionName);
查询该表里面的全部记录 : findAll
参数列表 :<Class<T> entityClass>, <String collectionName>
// 查询student表格里面的全部记录
mongoTemplate.findAll(Student.class, collectionName);
那么,如果我只对结果集中指定的字段感兴趣,该怎么来控制返回那些字段呢?
可以使用如下方式:
// 本示例 根据 年龄 = 23 这个条件 去student表里面查询, 结果集只返回姓名字段
Document resultFields = new Document();
resultFields.put("NAME", true); //结果集中返回姓名字段
resultFields.put("_id", false); // 主键是Mongo查询默认返回的,如果不需要该字段,需要设置为false
Document queryDocument = new Document();
queryDocument.put("AGE" , 23);
Object query = new BasicQuery(queryDocument, resultFields);
// 根据查询条件,返回一条查询结果
String str = (String) mongoTemplate.findOne((Query) query, String.class, collectionName);
// 将返回的字符串转换成Json
JSONObject result = JSONObject.parseObject(str);
// 接下来就可以通过fastJson api来对返回的结果进行解析了
// 要先进行非空判断,因为查询不到会返回空值
if (result != null) {
String name = result.getString("NAME");
}
关于Mongo的查询, 必不可少的就是Query类,
这个类几乎提供了我们需要用到的所有的查询方式
下面,简单的介绍下我们平时比较常用的一写api
// 跳过指定记录数 skip 参数列表 <int skip>
query.skip(10); // 跳过10条记录数
// 限制查询条数 int 参数列表 <int limit>
query.limit(10); // 只返回10条记录数
// 当然 Query类最常用的一个方法还是addCriteria 参数列表 : <CriteriaDefinition criteriaDefinition>
// 这是一个非常强大的方法,大部分查询功能都借助该方法实现
举例 :
query.addCriteria(Criteria.where("NAME").exists(false)); // 查询返回不包含NAME字段的数据
query.addCriteria(Criteria.where("NAME").is("xmr")); // 查询返回NAME值为xmr的数据
query.addCriteria(Criteria.where("AGE").gt(23)); // 查询返回AGE 大于23的数据, gte 大于等于, lt 小于 , lte 小于等于
关于查询操作的具体细节,这里不过多介绍,后面可能会写一些博客,对某部分内容展开介绍~
以上,就是使用SpringBoot操作MongoDB的简单总结