SpringBoot JPA实现REST

在Spring Boot中,使用Spring Data JPA和Spring Data Rest可以快速开发出一个RESTful应用。

 

添加依赖:

这里的依赖除了数据库相关的依赖外,还有Spring Data JPA的依赖以及SpringData Rest的依赖。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.9</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>

 

application.yml中配置:

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/boot?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: root
    password: 123456
  jpa:
    hibernate:
      ddl-auto: update #自动建表策略 update-每次运行程序,没有表格会新建表格,表内有数据不会清空,只会更新
    #    show-sql: true #是否把运行时的sql语句输出到控制台
    database: mysql
    generate-ddl: true
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect  #使用innodb引擎建表
    properties:
      hibernate:
        format_sql: true #控制台输出格式化的sql
  data:
    rest:
      default-page-size: 2 #每页默认记录数,缺省值为20
      page-param-name: page #分页查询页码参数名,缺省值为page
      limit-param-name: size #分页查询记录数参数名,缺省值为size
      sort-param-name: sort #分页查询排序参数名,缺省值为sort
      base-path: /api #base-path表示给所有请求路径都加上前缀
      return-body-on-create: true #添加成功时是否返回添加内容
      return-body-on-update: true #更新成功时是否返回更新内容

当然,这些XML配置也可以在Java代码中配置,且代码中配置的优先级高于application.yml配置的优先级

@Configuration
public class RestConfig implements RepositoryRestConfigurer {

    @Override
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
        config.setDefaultPageSize(4)
                .setPageParamName("page")
                .setLimitParamName("size")
                .setSortParamName("sort")
                .setBasePath("/api")
                .setReturnBodyOnCreate(true)
                .setReturnBodyOnUpdate(true);
    }

}

  

创建BookRepository:

创建BookRepository类继承JpaRepository,JpaRepository中默认提供了一些基本的操作方法

@CrossOrigin
@RepositoryRestResource(path = "api_book", collectionResourceRel = "books", itemResourceRel = "book"
        // ,exported = false
)
public interface BookDao extends JpaRepository<Book, Integer> {

    @RestResource(exported = false)
    void deleteById(Integer integer);

    List<Book> getBooksByAuthorStartingWith(String author);

    List<Book> getBooksByPriceGreaterThan(Float price);

    @Query(value = "select * from t_book where id=(select max(id) from t_book)", nativeQuery = true)
    Book getMaxIdBook();

    @Query("select b from t_book b where b.id>:id and b.author=:author")
    List<Book> getBookByIdAndAuthor(@Param("author") String author, @Param("id") Integer id);

    @Query("select b from t_book b where b.id<?2 and b.name like %?1%")
    List<Book> getBooksByIdAndName(String name, Integer id);

    @RestResource(path = "author", rel = "author")
    List<Book> findByAuthorContains(@Param("author") String author);

    @RestResource(path = "name", rel = "name")
    Book findByNameEquals(@Param("name") String name);
}

 

自定义请求路径:

默认情况下,请求路径都是实体类名小写加s,如果开发者想对请求路径进行重定义,通过@RepositoryRestResource注解

  • path属性表示请求路径
  • collectionResourceRel属性表示返回的JSON集合的key
  • itemResourceRel表示返回的JSON集合中的单个key

自定义查询方法:

默认的查询方法支持分页查询、排序查询以及按照id查询,如果开发者想要按照某个属性查询,只需在BookRepository中定义相关方法并暴露出去即可

  • 自定义查询只需要在BookRepository中定义相关查询方法即可,方法定义好之后可以不添加@RestResource注解,默认路径就是方法名。
  • 如果想对查询路径进行自定义,只需要添加@RestResource注解即可,path属性即表示最新的路径
  • 用户可以直接访问/api/api_book/search路径查看该实体类暴露出来了哪些查询方法,默认情况下,在查询方法展示时使用的路径是方法名,通过@RestResource注解中的rel属性可以对这里的路径进行重定义

隐藏方法:

默认情况下,凡是继承了Repository接口(或者Repository的子类)的类都会被暴露出来,即开发者可执行基本的增删改查方法。

  • 如果开发者继承了Repository但是又不想暴露相关操作,将@RepositoryRestResource注解中的exported属性置为false
  • 若只是单纯地不想暴露某个方法,则在方法上进行配置@RestResource注解的exported属性为false

配置CORS:

CORS两种不同的配置方式,一种是直接在方法上添加@CrossOrigin注解,另一种是全局配置。全局配置在这里依然适用,但是默认的RESTful工程不需要开发者自己提供Controller,因此添加在Controller的方法上的注解可以直接写在BookRepository上

如果只需要某一个方法支持跨域,那么将@CrossOrigin注解添加到某一个方法上即可。

 

测试:

新增 insert:

PUT http://127.0.0.1:8081/api/api_book/2
Body 类型 : application/json
{
    "name": "三国演义2",
    "author": "罗贯中2"
}

修改 update:

PUT http://127.0.0.1:8081/api/api_book/2
Body 类型 : application/json
{
    "name": "三国演义2",
    "author": "罗贯中2"
}

删除 delete:

DELETE http://127.0.0.1:8081/api/api_book/2

查询 select:

GET http://127.0.0.1:8081/api/api_book?page=0&sort=id,desc
GET http://127.0.0.1:8081/api/api_book/1
GET http://127.0.0.1:8081/api/api_book/search/getBooksByAuthorStartingWith?author=鲁迅
GET http://127.0.0.1:8081/api/api_book/search/author?author=鲁迅

查看该实体类暴露出来了哪些查询方法:

GET http://127.0.0.1:8081/api/api_book/search

 

 

文章来源: Spring Boot+Vue全栈开发实战 - 7.2 JPA实现REST

 

posted @ 2022-06-02 10:12  草木物语  阅读(113)  评论(0编辑  收藏  举报