Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringBoot使用Spring Data REST快速构建restful应用

SpringBoot使用Spring Data REST快速构建restful应用

作者头像
烂猪皮
发布于 2023-09-04 03:11:32
发布于 2023-09-04 03:11:32
49900
代码可运行
举报
文章被收录于专栏:JAVA烂猪皮JAVA烂猪皮
运行总次数:0
代码可运行

本篇要点

  • Spring Data REST的基本介绍。
  • SpringBoot快速构建restful风格接口。

Spring Data REST概述

REST Web服务已经成为Web上应用程序集成的第一大手段。 REST的核心是定义一个包含与客户端进行交互资源的系统。 这些资源以超媒体驱动的方式实现。

Spring MVC和Spring WebFlux各自提供了构建REST服务的坚实基础。 但是,即使为multi-domain对象系统实现最简单的REST Web服务原则也可能很繁琐,并且会导致大量样板代码。

Spring Data REST旨在解决这个问题,它建立在Spring Data存储库之上,并自动将其导出为REST资源,客户端可以轻松查询并调用存储库本身暴露出来的接口。

SpringBoot快速构建restful风格接口

SpringBoot构建Spring Data REST是相当方便的,因为自动化配置的存在,spring-boot-starter-data-rest可以让你不需要写多少代码,就能轻松构建一套完整的rest应用。

除此之外,你需要引入数据存储的依赖,它支持SpringData JPA、Spring Data MongoDB等,这里就使用JPA啦。正好我们在上一篇介绍过JPA的简单使用:SpringBoot整合Spring Data JPA

创建项目,导入依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        <!--jpa-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <!--restful-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

yml配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
server:
  port: 8081
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/restful?serverTimezone=GMT%2B8
    username: root
    password: 123456
    hikari:
      maximum-pool-size: 20
      minimum-idle: 5
  jpa:
    database: mysql
    #在建表的时候,将默认的存储引擎切换为 InnoDB
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    # 配置在日志中打印出执行的 SQL 语句信息。
    show-sql: true
    # 配置指明在程序启动的时候要删除并且创建实体类对应的表。
    hibernate:
      ddl-auto: update

定义实体类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Entity(name = "t_user")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;
    private String password;

    @Column(length = 20)
    private Integer age;
}

定义Repository接口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface UserDao extends JpaRepository<User, Long> {
}

到这里为止,其实可以发现,和JPA文章没啥差异,除了多引入了一个rest依赖。ok,启动项目,先把表生成了再说。

启动项目,我们就会发现JPA已经为我们将表结构创建完成,并且,一个基于Restful风格的增删改查应用也已诞生,我们可以使用接口测试工具,进行测试。

测试Restful接口

默认的请求路径是 类名首字母小写+后缀s,这里就是users。

测试添加功能

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST: http://localhost:8081/users
{
    "username": "summerday",
    "password": "123456",
    "age": 18
}

添加成功之后,返回信息如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "username": "summerday",
  "password": "123456",
  "age": 18,
  "_links": {
    "self": {
      "href": "http://localhost:8081/users/1"
    },
    "user": {
      "href": "http://localhost:8081/users/1"
    }
  }
}

测试删除功能

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DELETE : http://localhost:8081/users/1
// 删除成功之后返回删除的 id = 1

测试修改功能

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PUT : http://localhost:8081/users/2
{
    "username": "summerday111",
    "password": "123456111",
    "age": 181
}

同样的,修改成功,将对应id为2的信息改为传入信息,并返回更新后的信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "username": "summerday111",
  "password": "123456111",
  "age": 181,
  "_links": {
    "self": {
      "href": "http://localhost:8081/users/2"
    },
    "user": {
      "href": "http://localhost:8081/users/2"
    }
  }
}

测试根据id查询

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET : http://localhost:8081/users/3

测试分页查询

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET : http://localhost:8081/users

分页查询结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "_embedded": {
    "users": [
      {
        "username": "summerday111",
        "password": "123456111",
        "age": 181,
        "_links": {
          "self": {
            "href": "http://localhost:8081/users/2"
          },
          "user": {
            "href": "http://localhost:8081/users/2"
          }
        }
      },
      {
        "username": "summerday",
        "password": "123456",
        "age": 18,
        "_links": {
          "self": {
            "href": "http://localhost:8081/users/3"
          },
          "user": {
            "href": "http://localhost:8081/users/3"
          }
        }
      }
    ]
  },
  "_links": {
    "self": {
      "href": "http://localhost:8081/users"
    },
    "profile": {
      "href": "http://localhost:8081/profile/users"
    }
  },
  "page": {
    "size": 20,
    "totalElements": 2,
    "totalPages": 1,
    "number": 0
  }
}

测试分页+排序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET : http://localhost:8081/users?page=0&size=1&sort=age,desc

第一页,每页size为1的记录,按age逆序。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "_embedded": {
    "users": [
      {
        "username": "summerday111",
        "password": "123456111",
        "age": 181,
        "_links": {
          "self": {
            "href": "http://localhost:8081/users/2"
          },
          "user": {
            "href": "http://localhost:8081/users/2"
          }
        }
      }
    ]
  },
  "_links": {
    "first": {
      "href": "http://localhost:8081/users?page=0&size=1&sort=age,desc"
    },
    "self": {
      "href": "http://localhost:8081/users?page=0&size=1&sort=age,desc"
    },
    "next": {
      "href": "http://localhost:8081/users?page=1&size=1&sort=age,desc"
    },
    "last": {
      "href": "http://localhost:8081/users?page=1&size=1&sort=age,desc"
    },
    "profile": {
      "href": "http://localhost:8081/profile/users"
    }
  },
  "page": {
    "size": 1,
    "totalElements": 2,
    "totalPages": 2,
    "number": 0
  }
}

定制查询

自定义查询接口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface UserDao extends JpaRepository<User, Long> {

    List<User> findUsersByUsernameContaining(@Param("username")String username);
}

访问:http://localhost:8081/users/search,查询自定义接口。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "_links": {
    "findUsersByUsernameContaining": {
      "href": "http://localhost:8081/users/search/findUsersByUsernameContaining{?username}",
      "templated": true
    },
    "self": {
      "href": "http://localhost:8081/users/search"
    }
  }
}

测试一下这个方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET : http://localhost:8081/users/search/findUsersByUsernameContaining?username=111

{
  "_embedded": {
    "users": [
      {
        "username": "summerday111",
        "password": "123456111",
        "age": 181,
        "_links": {
          "self": {
            "href": "http://localhost:8081/users/2"
          },
          "user": {
            "href": "http://localhost:8081/users/2"
          }
        }
      }
    ]
  },
  "_links": {
    "self": {
      "href": "http://localhost:8081/users/search/findUsersByUsernameContaining?username=111"
    }
  }
}

自定义接口名

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface UserDao extends JpaRepository<User, Long> {
    //rel 表示接口查询中,这个方法的 key 
    //path 表示请求路径
    @RestResource(rel = "auth", path = "auth")
    User findByUsernameAndPassword(@Param("name") String username, @Param("pswd") String password);
}

继续查询自定义的接口:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    "auth": {
      "href": "http://localhost:8081/users/search/auth{?name,pswd}",
      "templated": true
    }

测试一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET : http://localhost:8081/users/search/auth?name=summerday&pswd=123456

设置接口对前端隐藏

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    @Override
    @RestResource(exported = false)
    void deleteById(Long aLong);

定义生成JSON字符串的相关信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RepositoryRestResource(collectionResourceRel = "userList",itemResourceRel = "u",path = "user")
public interface UserDao extends JpaRepository<User, Long> {
}

此时路径名为/user

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET : http://localhost:8081/user/2

{
  "username": "summerday111",
  "password": "123456111",
  "age": 181,
  "_links": {
    "self": {
      "href": "http://localhost:8081/user/2"
    },
    "u": {
      "href": "http://localhost:8081/user/2"
    }
  }
}

其他配置属性

Spring Data REST其他可配置的属性,通过spring.data.rest.basePath=/v1的形式指定。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
the root URI
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-06-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JAVA烂猪皮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用 spring data rest 快速构建 restful api,再也不用加班了
REST是一种设计风格(与具体的语言无关),它的URL主体是资源,是个名词。而且也仅支持HTTP协议,规定了使用HTTP Method表达本次要做的动作,类型一般也不超过那四五种。这些动作表达了对资源仅有的几种转化方式。
双鬼带单
2018/08/01
5.2K0
使用 spring data rest 快速构建 restful api,再也不用加班了
Spring Data Rest!五分钟帮我们实现Rest服务
一直认为,Spring Data是与第三方组件进行数据交换的全家桶的整合,比如Spring Data Jpa是数据库使用,Spring Data LDAP是LDAP的使用,Spring Data Redis是Redis的使用,Spring Data Elasticsearch是Elasticsearch的使用。
品茗IT
2020/05/28
3.4K0
让 Restful API 更加 Simpler:Spring Data Rest
Spring Data REST 作为 Spring Data 项目的子集,开发者只需使用注解 @RepositoryRestResource 标记,就可以把整个 Repository 转换为 HAL 风格的 REST 资源,目前已支持 Spring Data JPA、Spring Data MongoDB、Spring Data Neo4j等等。
happyJared
2019/04/18
1.7K0
让 Restful API 更加 Simpler:Spring Data Rest
Spring Boot与Kotlin使用Spring Data Rest创建HAL风格Restful接口
REST web服务已成为在web上应用程序集成的首选方式。在其核心中,REST定义了系统由客户端交互的资源组成。这些资源以超媒体驱动的方式实现。Spring MVC为构建这些服务提供了坚实的基础。但是,对于多域对象系统,即使实施REST web服务的最简单原则也可能相当乏味,并且导致大量样板代码。
全科
2018/08/15
8940
是时候解放一下广大程序员的双手了
作为靠双手吃饭的广大程序猿媛们,大家基本都是从数据库的增删改查一步一步过来的,每天都有写不完的代码,好不容易写完了,又会因为改了需求,为了能完工不得不加班写这些简单并且耗时的代码。
小柒2012
2020/05/14
6050
Spring Boot2 系列教程(三十一)Spring Boot 构建 RESTful 风格应用
RESTful ,到现在相信已经没人不知道这个东西了吧!关于 RESTful 的概念,我这里就不做过多介绍了,传统的 Struts 对 RESTful 支持不够友好 ,但是 SpringMVC 对于 RESTful 提供了很好的支持,常见的相关注解有:
江南一点雨
2019/11/27
1.1K0
Spring Boot2 系列教程(三十一)Spring Boot 构建 RESTful 风格应用
Spring Boot 中 10 行代码构建 RESTful 风格应用
RESTful ,到现在相信已经没人不知道这个东西了吧!关于 RESTful 的概念,我这里就不做过多介绍了,传统的 Struts 对 RESTful 支持不够友好 ,但是 SpringMVC 对于 RESTful 提供了很好的支持,常见的相关注解有:
江南一点雨
2019/06/13
1.4K0
springboot+jpa+spring-data-rest 快速实现rest应用
本例使用springboot,并使用了 spring-data-rest 和 spring-data-jpa
吟风者
2020/02/10
8160
SpringBoot使用Swagger2实现Restful API
很多时候,我们需要创建一个接口项目用来数据调转,其中不包含任何业务逻辑,比如我们公司。这时我们就需要实现一个具有Restful API的接口项目。 本文介绍springboot使用swagger2实现
dalaoyang
2018/04/28
1.1K0
SpringBoot使用Swagger2实现Restful API
spring jpa restful请求示例
postman请求,可以进行GET POST PUT PATCH DELETE请求 http://localhost:8080/ http://localhost:8080/score/1
oktokeep
2024/10/09
1060
spring jpa restful请求示例
springboot (九) Swagger2实现Restful API
springboot使用swagger2实现Restful API。 本项目使用mysql+jpa+swagger2。 首先pom中加入swagger2,代码如下: <?xml version="1.
IT架构圈
2018/06/01
9470
Spring Data REST 与 Spring RestTemplate 实战详解
这篇分为两部分内容进行介绍(Spring Data REST 和 Spring RestTemplate)。我之前有一篇文章完整的介绍了 HTTP 协议的内容,而这两个工具中一个帮我们完成 Client 的实现,另一个帮我们完成 Server端的实现。 希望大家对 Spring 和 HTTP 之间有个完整的认识,并能够优雅地使用。 RestTemplate 认识 RestTemplate org.springframework.web.client.RestTemplate 位于 spring-web 的核
CSDN技术头条
2018/03/26
5.7K0
Spring Data REST 与 Spring RestTemplate 实战详解
使用Spring Boot构建RESTful API:从理论到实践
RESTful API是Web服务开发中常用的一种架构风格,通过HTTP协议提供与资源交互的方式。Spring Boot作为一个流行的Java框架,通过简化配置和快速开发,成为构建RESTful API的理想选择。本文将深入探讨如何使用Spring Boot构建RESTful API,包括基础知识、核心功能、最佳实践和实际应用,并提供具体的代码示例和应用案例。
E绵绵
2024/06/23
1.6K0
【SpringBoot系列04】SpringBoot之使用JPA完成简单的rest api
【SpringBoot2.0系列02】SpringBoot之使用Thymeleaf视图模板
yukong
2018/08/14
1.8K0
Spring与SpringBoot整合Spring Data JPA及使用
Spring Data JPA是Spring Data项目下的一个模块。提供了一套基于JPA标准操作数据库的简化方案,底层默认是依赖Hibernate JPA来实现的。
害恶细君
2022/11/22
4.7K0
Spring与SpringBoot整合Spring Data JPA及使用
重学SpringBoot3-Spring Data JPA
在现代 Java 应用开发中,数据持久化层是非常重要的组成部分。Spring Boot 3 和 Spring Data JPA 的结合为我们提供了一个简洁、高效的解决方案,可以快速实现数据访问层逻辑,减少冗余代码。本文将详细介绍如何在 Spring Boot 3 中集成 Spring Data JPA,并展示一些常见的用法和最佳实践。
CoderJia
2024/10/18
5540
重学SpringBoot3-Spring Data JPA
SpringBoot 构建 REST 服务
启动项目后浏览器打开http://localhost:8080/,可以看到如下信息:
Johnson木木
2019/11/21
6250
使用Spring Boot 2.X构建RESTful服务
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的创建、运行、调试、部署等。它大大减少了基于Spring开发的生产级应用程序的工作量。因此,开发人员能够真正专注于以业务为中心的功能。
java干货
2021/02/19
1.5K0
使用Spring Boot 2.X构建RESTful服务
Spring-Data-JPA尝鲜:快速搭建CRUD+分页后台实例
JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据。他的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate,TopLink,JDO等ORM框架各自为营的局面。值得注意的是,JPA是在充分吸收了现有Hibernate,TopLink,JDO等ORM框架的基础上发展而来的,具有易于使用,伸缩性强等优点。从目前的开发社区的反应上看,JPA受到了极大的支持和赞扬,其中就包括了Spring与EJB3.0的开发团队。
我没有三颗心脏
2019/02/14
1.7K0
Spring-Data-JPA尝鲜:快速搭建CRUD+分页后台实例
快速学习-SpringBoot整合Spring Data JPA
5.3 SpringBoot整合Spring Data JPA 5.3.1 添加Spring Data JPA的起步依赖 <!-- springBoot JPA的起步依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> 5.3.2 添加数据库驱动依赖 <!-- MySQL连接驱动 --
cwl_java
2020/04/01
3560
快速学习-SpringBoot整合Spring Data JPA
推荐阅读
相关推荐
使用 spring data rest 快速构建 restful api,再也不用加班了
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验