springcloud 集成mongoDb的基本操作

本篇博客只列举出基本操作,

一 . 依赖引入

想要在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

注意 : 下面的示例代码里,前面定义的变量, 后面举例的时候可能不会重新定义, 而是直接拿来使用!!~

2.1获取连接

通过如下示例可以获得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;
        }
    }

2.2 数据插入

插入数据主要是调用**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);

2.3 数据删除

第一种方式, 直接使用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"));

2.4 数据更新

比较常用的一种方式是使用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)

2.5 数据查询

对于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的简单总结
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值