SpringBoot2.x使用MongoDB的Rest端点访问数据

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 在之前项目中我们想要读取`MongoDB`内的内容需要使用`MongoDBTemplate`来完成数据的`CRUD`,那如果我们想要通过`RestController`的形式获取`MongoDB`内的数据就更麻烦了,还需要自行去创建对应的控制器,然后使用`MongoDBTemplate`从`MongoDB`内读取出数据后返回给前端。

在之前项目中我们想要读取MongoDB内的内容需要使用MongoDBTemplate来完成数据的CRUD,那如果我们想要通过RestController的形式获取MongoDB内的数据就更麻烦了,还需要自行去创建对应的控制器,然后使用MongoDBTemplateMongoDB内读取出数据后返回给前端。

在上一章节第五十一章:基于SpringBoot2 & MongoDB完成自动化集成我们讲到了SpringBoot2MongoDB集成后怎么简单的操作数据,当然Spring Data Xxx家族方式的设计与Spring Data JPA一样,Sring Data MongoDB提供了一个MongoRepository<T,PK>接口来为继承该接口的子接口自动提供代理类完成数据操作实现。


本章目标

使用Spring Data Rest自动映射读取MongoDB内的数据,省去一系列繁琐的操作步骤。

构建项目

使用Idea开发工具创建一个SpringBoot的项目,添加相应的依赖,pom.xml配置文件依赖内容如下所示:

<dependencies>
    <!--mongodb依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
    <!--data rest依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-rest</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <!--Lombok依赖-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>

我们本章节的依赖比上一章多了一个spring-boot-starter-data-rest,通过这个依赖我们可以自动完成RestController的依赖配置,不需要再手动去创建控制器,因为我们通过一些简单的注解配置以及固定格式名称规则的方法就可以完成控制器的实现。

因为本章的内容需要在上一章的基础上编写,所以我们直接把之前章节的相关的配置以及类都复制到本项目内,复制的内容有: application.ymlCustomerCustomerRepository。(源码位置: 第五十一章源码)

改造CustomerRepository

spring-boot-starter-data-rest会自动扫描添加@RepositoryRestResource注解的接口,自动将该接口映射为一系列可通过rest访问的请求路径,这里说到一系列,我们在测试的时候会讲到为什么说是一系列!!!
既然需要添加注解,那么我们就打开CustomerRepository接口,对应为它添加上如下注解内容:

@RepositoryRestResource(collectionResourceRel = "customer", path = "customer")
public interface CustomerRepository extends MongoRepository<Customer, String> {
//....省略
}

注解内需要提供两个参数,
collectionResourceRel :该参数配置映射MongoDB内的Collection名称。
path :该参数配置映射完成rest后访问的路径前缀。


运行测试

我们先来简单的运行测试下是否可以通过我们配置的path路径实现访问内容,启动项目时我们可以看到控制台的输出内容:

Mapped "{[/{repository}/search],methods=[GET]
Mapped "{[/{repository}/search/{search}],methods=[GET]
Mapped "{[/{repository}/{id}/{property}],methods=[GET]
Mapped "{[/{repository}],methods=[GET]
....

我们配置一个@RepositoryRestResource注解的接口就会根据rest内置的一系列的条件生成对应的请求,这也是我们在之前说到的一系列请求路径的地方,我们先来访问下映射/{repository}的路径。


测试 /{repository} 映射路径

你如果使用 Windows系统直接打开浏览器输出地址就可以看到返回的内容,如果你使用 Linux或者 OS X系统可以在 Terminal使用 curl命令查看返回内容。

我们访问:http://localhost:8080/customer,路径查看返回的内容:

➜  ~ curl http://localhost:8080/customer
{
  "_embedded" : {
    "customer" : [ {
      "firstName" : "恒宇",
      "lastName" : "少年",
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/customer/5adbec9ceb89f105acd90cec"
        },
        "customer" : {
          "href" : "http://localhost:8080/customer/5adbec9ceb89f105acd90cec"
        }
      }
    } ]
  },
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/customer{?page,size,sort}",
      "templated" : true
    },
    "profile" : {
      "href" : "http://localhost:8080/profile/customer"
    }
  },
  "page" : {
    "size" : 20,
    "totalElements" : 1,
    "totalPages" : 1,
    "number" : 0
  }
}

通过这个地址我们可以读取出@RepositoryRestResource注解配置的collectionResourceRel对应的 MongoDB.collection集合内的数据,我们发现不仅读取出来了数据而且还为我们提供了分页的信息,这可是很贴心的地方啊,默认读取第1页每页20条数据。


测试 /{repository}/{id} 映射路径

我们访问http://localhost:8080/customer/5adbec9ceb89f105acd90cec(注意:这里的id是你本地生成的,这个id是我本地生成,直接访问会出现404)如下所示:

➜  ~ curl http://localhost:8080/customer/5adbec9ceb89f105acd90cec
{
  "firstName" : "恒宇",
  "lastName" : "少年",
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/customer/5adbec9ceb89f105acd90cec"
    },
    "customer" : {
      "href" : "http://localhost:8080/customer/5adbec9ceb89f105acd90cec"
    }
  }
}

根据返回的内容看到是能够访问根据id查询的数据内容的。


测试 /{repository}/search/{search} 映射路径

这个映射的配置是专门为我们自定义方法准备的,自定义方法的规则与SpringDataJPA的方法名称规则一样,当我们在接口创建findByXxx方法时Idea会自动为我们提示相应的内容,下面我们就创建两个不同的查询方法,如下所示:

    /**
     * 更加名字查询数据
     *
     * @param firstName 名字
     * @return
     */
    List<Customer> findByFirstName(@Param("firstName") String firstName);

    /**
     * 根据姓氏查询出最靠前的一条数据
     *
     * @param lastName 姓氏
     * @return
     */
    Customer findTopByLastName(@Param("lastName") String lastName);

下面我们重启下项目访问路径http://localhost:8080/customer/search/findByFirstName?firstName=恒宇可以看到返回内容:

➜  ~ curl http://localhost:8080/customer/search/findByFirstName\?firstName\=%E6%81%92%E5%AE%87
{
  "_embedded" : {
    "customer" : [ {
      "firstName" : "恒宇",
      "lastName" : "少年",
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/customer/5adbec9ceb89f105acd90cec"
        },
        "customer" : {
          "href" : "http://localhost:8080/customer/5adbec9ceb89f105acd90cec"
        }
      }
    } ]
  },
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/customer/search/findByFirstName?firstName=%E6%81%92%E5%AE%87"
    }
  }
}

自动的根据我们的配置的方法查询出了对应的数据,自动过滤了对应的数据,不过这个是没有分页的。
同样另外一个自定义方法的请求http://localhost:8080/customer/search/findTopByLastName?lastName=少年,也是一样的可以对应的获取过滤后的数据。

注意:@Param注解内的参数名称要与 Customer内的属性对应。

如果你想查看配置的全部自定义的方法,访问:http://localhost:8080/customer/search,如下所示:

➜  ~ curl http://localhost:8080/customer/search                                               
{
  "_links" : {
    "findByFirstName" : {
      "href" : "http://localhost:8080/customer/search/findByFirstName{?firstName}",
      "templated" : true
    },
    "findTopByLastName" : {
      "href" : "http://localhost:8080/customer/search/findTopByLastName{?lastName}",
      "templated" : true
    },
    "self" : {
      "href" : "http://localhost:8080/customer/search"
    }
  }
}

总结

本章内容主要是围绕着spring-boot-starter-data-rest这个依赖进行的,这个依赖帮助我们完成了日常编码中一些重复的工作,而且很智能的提供了一些映射,更方便我们进行查询数据。

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
2月前
|
存储 NoSQL MongoDB
数据的存储--MongoDB文档存储(二)
数据的存储--MongoDB文档存储(二)
69 2
|
2月前
|
NoSQL Java MongoDB
Springboot WebFlux项目结合mongodb进行crud
这篇文章介绍了如何使用Spring Boot WebFlux框架结合MongoDB进行基本的CRUD(创建、读取、更新、删除)操作,包括项目设置、实体类和Repository的创建、控制器的实现以及配置文件的编写。
55 0
Springboot WebFlux项目结合mongodb进行crud
|
4月前
|
NoSQL Java MongoDB
SpringBoot中MongoDB的那些高级用法
本文探讨了在Spring Boot项目中使用MongoDB的多种方式及其高级用法。MongoDB作为一种NoSQL数据库,在某些场景下相较于SQL数据库有着独特的优势。文中详细介绍了在Spring Boot中使用MongoDB的三种主要方式:直接使用官方SDK、使用Spring JPA以及使用MongoTemplate,并对比分析了它们之间的差异。此外,文章深入讲解了Spring Data MongoDB提供的各种注解(如@Id, @Document, @Field等)以简化操作流程,并探讨了MongoTemplate监听器的应用,如设置主键值、记录日志等。
205 2
|
22天前
|
安全 Java 测试技术
如何在 Spring Boot 中禁用 Actuator 端点安全?
如何在 Spring Boot 中禁用 Actuator 端点安全?
60 1
|
2月前
|
JSON Java 网络架构
elasticsearch学习四:使用springboot整合 rest 进行搭建elasticsearch服务
这篇文章介绍了如何使用Spring Boot整合REST方式来搭建和操作Elasticsearch服务。
141 4
elasticsearch学习四:使用springboot整合 rest 进行搭建elasticsearch服务
|
2月前
|
SQL NoSQL Java
springboot操作nosql的mongodb,或者是如何在mongodb官网创建服务器并进行操作
本文介绍了如何在Spring Boot中操作NoSQL数据库MongoDB,包括在MongoDB官网创建服务器、配置Spring Boot项目、创建实体类、仓库类、服务类和控制器类,以及如何进行测试。
23 1
springboot操作nosql的mongodb,或者是如何在mongodb官网创建服务器并进行操作
|
1月前
|
存储 NoSQL 网络协议
【赵渝强老师】MongoDB的安装与访问
本文介绍了在Linux系统上安装和部署MongoDB的详细步骤,包括安装依赖包、解压安装包、配置环境变量、创建数据目录及启动服务等。文中还提供了相关命令示例和注意事项,帮助用户顺利完成MongoDB的安装与配置。
|
2月前
|
NoSQL MongoDB 数据库
使用NimoShake将数据从AWS DynamoDB迁移至阿里云MongoDB
使用NimoShake将数据从AWS DynamoDB迁移至阿里云MongoDB
|
2月前
|
Web App开发 JavaScript Java
elasticsearch学习五:springboot整合 rest 操作elasticsearch的 实际案例操作,编写搜索的前后端,爬取京东数据到elasticsearch中。
这篇文章是关于如何使用Spring Boot整合Elasticsearch,并通过REST客户端操作Elasticsearch,实现一个简单的搜索前后端,以及如何爬取京东数据到Elasticsearch的案例教程。
221 0
elasticsearch学习五:springboot整合 rest 操作elasticsearch的 实际案例操作,编写搜索的前后端,爬取京东数据到elasticsearch中。
|
2月前
|
存储 NoSQL 关系型数据库
数据的存储--MongoDB文档存储(一)
数据的存储--MongoDB文档存储(一)
90 3