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