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配置的优先级
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | @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中默认提供了一些基本的操作方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | @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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2019-06-02 spring 通过XML配置装配Bean
2019-06-02 spring 依赖注入的3种方式
2019-06-02 spring IoC的概念
2018-06-02 ecplise 正则替换技巧
2018-06-02 redis 指令文档
2017-06-02 jQuery preventDefault() ,stopPropagation(),stopImmediatePropagation()