Spring 数据后端服务的使用

Spring 数据后端服务的使用

引言:使用 Spring 的 HATEOAS 可以很方便的为每个资源添加对应的链接, 从而为每个使用Rest服务的应用提供更好的信息。但是也有缺点:每次为数据添加链接都需要自己手动地添加链接, 即使有 Assembler 类装配对应链接也需要手动实现对应的接口。这也有点麻烦, Spring 为我们提供了数据后端的服务, 从而能够自动生成对应的超链接。

  1. 添加对应的Maven依赖项
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-rest</artifactId>
	<version>2.4.1</version>
</dependency>
  1. 生成对应的实体类以及对应的Repository接口。
    UserInfo 实体 类:
package com.example.restdata.Entity;

import lombok.Data;

import javax.persistence.*;
/*
*   定义的基本用户类, 使用lombok的 @Data 注解
*   自动生成对应属性的Getter和Setter方法
 */
@Data
@Entity
@Table(name = "user_info")
public class UserInfo {
    @Id
    @Column(name = "user_id")
    // 用户的 Id 属性
    private Long userId;

    @Basic
    @Column(name = "user_name")
    // 用户名
    private String userName;

    @Basic
    @Column(name = "user_gender")
    // 用户性别
    private String userGender;
}

BookInfo 实体类:

package com.example.restdata.Entity;

import lombok.Data;

import javax.persistence.*;

/**
 * Created by IntelliJ IDEA.
 * User: liuxianghai
 * Date: 2021/1/8
 * Time: 下午10:09
 */

@Data
@Entity
@Table(name = "book_info")
public class BookInfo {
    @Id
    @Column(name = "isbn")
    private String isbn;

    @Basic
    @Column(name = "book_name")
    private String bookName;

    @Basic
    @Column(name = "book_price")
    private Double bookPrice;
}

UserInfoReposiroty 接口:

package com.example.restdata.Repository;

import com.example.restdata.Entity.UserInfo;
import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface UserInfoRepository extends CrudRepository<UserInfo, Long> {
    List<UserInfo> findAll(@Param("page") Pageable page); // 使用Pageable对象实现分页查找

    UserInfo findUserInfoByUserId(@Param("userId") Long userId); // 按照用户ID查找
}

BookInfoRepository 接口:

package com.example.restdata.Repository;

import com.example.restdata.Entity.BookInfo;
import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface BookInfoRepository extends CrudRepository<BookInfo, String> {
    List<BookInfo> findAll(@Param("page")Pageable page); // 使用Pageable对象实现分页查找
}

  1. 现在, 运行程序, 使用默认的配置, 访问 http://127.0.0.1:8080/api, 可以看到实现了Repository接口的数据访问路径。可能类似于以下这样的输出:
    在这里插入图片描述可以看到, 已经创建了对应实体的Repository接口的实体将会创建对应的数据访问的超链接, 而没有创建Repository接口的实体类将不会生成对应的超链接, 具体我们可以验证一下, 将 src/main/java/com/example/restdata/Repository 下的 BookInfoRepository.java 重命名为 BookInfoRepository.c, 再次运行这个程序, 访问 http://127.0.0.1:8080/api, 将看到类似于以下的输出:
    在这里插入图片描述由此可见, 只有创建了对应的Repository接口的实体类 Spring才能创建对于数据的访问超链接。

  2. 实际上, Spring Data Rest 对于默认的实体的复数形式会有错误, 通过对对应的实体类添加对应的@RestResource可以修复这个问题。
    对于UserInfo 实体类对象, 添加@RestResource注解, 对应实体类修改为以下形式:

package com.example.restdata.Entity;

import lombok.Data;

import javax.persistence.*;
import org.springframework.data.rest.core.annotation.RestResource;

/*
*   定义的基本用户类, 使用lombok的 @Data 注解
*   自动生成对应属性的Getter和Setter方法
 */
@Data
@Entity
@RestResource(rel = "userInfos", path = "userInfos")
@Table(name = "user_info")
public class UserInfo {
    @Id
    @Column(name = "user_id")
    // 用户的 Id 属性
    private Long userId;

    @Basic
    @Column(name = "user_name")
    // 用户名
    private String userName;

    @Basic
    @Column(name = "user_gender")
    // 用户性别
    private String userGender;
}

@RestResource 注解的 “rel"属性对应超链接引用名, 即这个生成的超链接对象的名称。“path” 属性则是对应这个实体类数据的访问路径(基于 rest-data 的基础访问路径)。
添加@RestResource注解后, 再次运行此程序, 访问 http://127.0.0.1:8080/api, 得到的输出类似于以下形式:
在这里插入图片描述 可以看到, UserInfo 的数据的超链接对象的名称以及路径已经变为我们在@RestResource中配置的属性。
5. 数据的分页查询, 由于对每个实体类对应的Repository接口已经定义了对应的 Pageable对象的访问方式, 所以我们可以通过直接向对应的URL添加Page参数实现分页的访问。
对于已经定义Pageable的实体类的Repository接口, 有三个参数可以添加到URL中:
  page:访问的页面索引, 以 “0” 为起始页
  sort:排序的列, 应当与数据表的列名对应, 可以额外添加 “DESC”值(不区分大小写)设置为倒序, 通过”,"分割这两个值。
  size:访问页的数据量大小, 即一页访问的数据量。
访问示例:http://127.0.0.1:8080/api/userInfos?page=0&size=2&sort=user_name,DESC
6. rest data 的基础路径配置:
  在 application.yml 中, spring.data.rest.base-path设置对应的rest-data的基础访问路径, 就是之前访问数据时需要访问的 http://127.0.0.1:8080/api
  设置 spring.data.rest.base-path 属性将会将 “api” 访问路径修改为设置的属性值。spring.data.rest.default-page-size属性将会设置rest-data的默认单页最大数据量。
  修改 spring.data.rest.base-path值为 “info”, spring.data.rest.default-page-size值为“2”, 再次运行该程序, 访问 http://127.0.0.1:8080/info, 可以看到类似以下输出。
yu与之前的一致  与之前访问 http://127.0.0.1:8080/api 一致, 但修改spring.data.rest.base-path值为 “info”后,该路径即失效。
  访问用户信息数据的超链接, 由于我们已经设置了spring.data.rest.base-path值为 “info”, 并且uUserInfo实体类添加了@RestResource注解,所以可以访问 http://127.0.0.1/info/userInfos, 可以看到用户信息的数据现在已经默认是每页显示两条:
在这里插入图片描述
示例地址:https://github.com/LiuXianghai-coder/Spring-Study/tree/master/rest-data

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值