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()稍作总结:

  1. 我们定义了一个List,用于暂存待持久化的书籍信息
  2. 构造三个BookInfo对象并添加到List中
  3. 通过调用bookInfoRepository.insert(bookInfos);将list持久化到mongoDB中,这个insert方法就是MongoRepository为我们提供的,我们直接调用即可
  4. 接着我们通过自定义的查询方法对前面持久化的数据进行查询。

启动项目,访问测试接口: http://localhost:10880/mongo,返回如下json串:

{"id":"2_89e9a1e3-6597-4415-9699-b5bfb33632ae","name":"三体_89e9a1e3-6597-4415-9699-b5bfb33632ae","author":"刘慈欣"}

这表明,我们对Mongodb的整合是ok的,并且成功实现了数据的插入和查询等操作。

小结

本文我们主要介绍了在SpringBoot中如何通过整合spring-boot-starter-data-mongodb实现对MongoDB的操作。

当我们对spring-data使用的更加熟练,就会感受到Spring对于开发者的友好,通过各种封装的组件实现了对不同底层数据源的统一封装,接口对开发者保持风格一致,降低了开发者的学习成本。这种封装思想也同样值得我们去学习借鉴。

版权声明:

原创不易,洗文可耻。除非注明,本博文章均为原创,转载请以链接形式标明本文地址。

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章