SpringBoot之整合MongoDB
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下,添加更多的节点,可以保证服务器性能。 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。 – 引用自runnoob
一个MongoDB的BSON数据结构如下:
引入spring-boot-starter-data-mongodb依赖
首先当然需要建立一个SpringBoot项目,接着在项目的pom.xml中引入spring-boot-starter-data-mongodb。坐标如下:
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-mongodb -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
配置mongodb
在项目的application.properties中添加Mongodb连接配置
###################################################################
# MongoDB
###################################################################
# 进行认证的db,一般就是admin
spring.data.mongodb.authentication-database=admin
# 需要进行交互的db,需要实现创建
spring.data.mongodb.database=snowalker
# mongodb所在机器的ip/域名
spring.data.mongodb.host=127.0.0.1
# mongodb对外提供服务的端口,默认为27017
spring.data.mongodb.port=27017
# 用户名及密码,可主动在admin库中添加并授权
spring.data.mongodb.username=root
spring.data.mongodb.password=root
编写实体类
需要编写一个实体类,该实体类就是一个POJO。这里我们以书籍信息为例
public class BookInfo {
private String id;
private String name;
private String author;
// 省略getter setter
编写Mongodb操作持久层
这一步较为核心,我们通过编写一个MongoDB的交互接口,实现对MongoDB的操作。这一切只需要让自定义的接口继承MongoRepository接口即可,整体的风格类似于JPA。
public interface BookInfoRepository extends MongoRepository<BookInfo, String> {
List<BookInfo> findByAuthorContains(String author);
BookInfo findByNameEquals(String bookName);
}
我们的接口一旦继承了MongoRepository就能够使用最基本的CURD等操作,而且我们可以根据自己的需求进行操作的扩展。
扩展:SpringData方法扩展
这里介绍一下如何进行方法扩展。
实际上,在SpringData中,只要方法的定义符合既定规范,则Spring Data就可以分析出开发者的意图,从而避免开发者自定义一些诸如SQL、指令等操作。当然这就仁者见仁智者见智了,笔者认为,对于简单的操作,用这种方法可以很好的提升开发效率,但如果需要针对业务有一些复杂的操作,则自定义SQL、指令应当更加灵活。
常见的命名规则如下:
如果是简单条件查询的场景,如:需要对某一个实体类或者集合进行查询。
按照Spring Data的规范的规定,查询方法应当以 find | read | get开头(如:find、findBy、read、readBy、get、getBy)。
涉及到查询条件时,条件属性需要用条件关键字进行连接。这里需要注意:条件属性首字母应当大写。当框架进行方法名解析时,会先把方法名的多余前缀截取掉,然后对剩下部分进行解析。
对于直接在接口中定义的查询方法,如果符合规范的,则可以不用写实现,目前支持的关键字写法如下:
编写测试接口
到此我们就基本上完成了对MongoDB的整合,接下来就编写一个测试接口对MongoDB进行操作,验证整合是否有效。
@RestController
public class BookInfoController {
@Autowired
BookInfoRepository bookInfoRepository;
@GetMapping(value = "mongo")
public BookInfo testMongo() throws JsonProcessingException {
List<BookInfo> bookInfos = new ArrayList<>();
// 添加数据
for (int i = 0; i < 3; i++) {
String uuid = UUID.randomUUID().toString();
BookInfo bookInfo = new BookInfo();
bookInfo.setId(i + "_" + uuid).setAuthor("刘慈欣").setName("三体_" + uuid);
bookInfos.add(bookInfo);
}
// 入Mongo
bookInfoRepository.insert(bookInfos);
// 查询By author
List<BookInfo> queryList = bookInfoRepository.findByAuthorContains("刘慈欣");
ObjectMapper objectMapper = new ObjectMapper();
String s = objectMapper.writeValueAsString(queryList);
System.out.println(s);
// 查询by Name
BookInfo bookInfo = bookInfoRepository.findByNameEquals("三体_89e9a1e3-6597-4415-9699-b5bfb33632ae");
if (bookInfo == null) {
return new BookInfo();
}
return bookInfo;
}
}
对上述的测试方法testMongo()稍作总结:
- 我们定义了一个List,用于暂存待持久化的书籍信息
- 构造三个BookInfo对象并添加到List中
- 通过调用bookInfoRepository.insert(bookInfos);将list持久化到mongoDB中,这个insert方法就是MongoRepository为我们提供的,我们直接调用即可
- 接着我们通过自定义的查询方法对前面持久化的数据进行查询。
启动项目,访问测试接口: http://localhost:10880/mongo,返回如下json串:
{"id":"2_89e9a1e3-6597-4415-9699-b5bfb33632ae","name":"三体_89e9a1e3-6597-4415-9699-b5bfb33632ae","author":"刘慈欣"}
这表明,我们对Mongodb的整合是ok的,并且成功实现了数据的插入和查询等操作。
补充
生产环节链接的mongodb多为集群方式,集群方式配置方式如下
数据源配置
如果mongodb端口是默认端口且没设置密码,可不配置密码
spring.data.mongodb.uri=mongodb://localhost:27017/springboot-db
如果mongodb设置了密码,则链接这样配置:
spring.data.mongodb.uri=mongodb://name:pass@localhost:27017/dbname
如果是多个ip集群,则如下配置即可:
spring.data.mongodb.uri=mongodb://user:pass@ip1:port1,ip2:port2/database
小结
本文我们主要介绍了在SpringBoot中如何通过整合spring-boot-starter-data-mongodb实现对MongoDB的操作。
当我们对spring-data使用的更加熟练,就会感受到Spring对于开发者的友好,通过各种封装的组件实现了对不同底层数据源的统一封装,接口对开发者保持风格一致,降低了开发者的学习成本。这种封装思想也同样值得我们去学习借鉴。
参考资料
版权声明:
原创不易,洗文可耻。除非注明,本博文章均为原创,转载请以链接形式标明本文地址。