spring-data-rest的详细讲解
一、基本配置和环境
1. 所用的环境:
- idea
- jdk 1.8
- mysql 5.7
- maven 3.3.9
- postman
- …
2. 创建springboot工程:(idea直接创建)
2.1. pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cn.huntcat</groupId>
<artifactId>zzh-jpa-rest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>zzh-jpa-rest</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
! !!如果有数据库相关的异常,请做如下处理:
- 将数据库依赖里面的 runtime 改成 compile
- 将springboot的版本降低
2.2. application.yml相关配置
datasource:
type: com.alibaba.druid.pool.DruidDataSource
username: root
password: 123456
url: jdbc:mysql:///jpa?serverTimezone=UTC&useUnicode=true&useSSL=true
jpa:
hibernate:
ddl-auto: update
database: mysql
show-sql: true
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL57Dialect
data:
rest:
# 每页默认记录数,默认值为 20
default-page-size: 5
# 分页查询页码参数名,默认值为page
page-param-name: page
# 分页查询记录数参数名,默认值为size
limit-param-name: size
# 分页查询排序参数名,默认值为sort
sort-param-name: sort
# 给所有请求路径都加上前缀
base-path: /api
# 添加成功时是否返回添加内容
return-body-on-create: true
# 更新成功时是否返回添加内容
return-body-on-update: true
3. 开始写代码了…
3.1. 项目的基本结构:
可以先按照我的项目结构先建好目录
3.2. 创建两个实体类:
User.java
package cn.huntcat.model;
import lombok.Data;
import javax.persistence.*;
import java.util.Set;
/**
* @Data:这是lombok插件
* 其他是jpa相关的知识
*
*/
@Data
@Entity
@Table(name = "zzh_user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private Long userId;
@Column(name = "last_name")
private String lastName;
@Column(name = "first_name")
private String firstName;
@Column(name = "email")
private String email;
/**
* 讲讲这个:
* mappedBy:user是在 ManyToOne 里面的属性,这样做的目的是将主键交由一方维护
* cascade:可以进行级联操作,自己可以点进去看源码,这里代表所有操作
*/
@OneToMany(mappedBy = "user",cascade = CascadeType.ALL)
private Set<Address> addresses;
}
Address.java
import lombok.Data;
import javax.persistence.*;
/**
* Address.java
*/
@Data
@Entity
@Table(name = "zzh_address")
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "addr_id")
private Long addrId;
@Column(name = "addr_name")
private String addrName;
/**
* @JoinColumn():加入外键的意思
* name:生成表之后会产生的字段名
* referencedColumnName :参考的字段为 一 中的 主键
*/
@ManyToOne
@JoinColumn(name = "user_addr_id", referencedColumnName = "user_id")
private User user;
}
3.3. 创建两个接口:
UserRepository.java
package cn.huntcat.repository;
import cn.huntcat.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RestResource;
import java.util.List;
/**
* 继承jpa也可以其他
*/
@RepositoryRestResource(path = "mayun", collectionResourceRel = "crr", itemResourceRel = "irr")
public interface UserRepository extends JpaRepository<User, Long> {
/**
* @RestResource:将自己定义的方法暴露出去
* path:是需要访问的路劲,不加默认就是方法名
*/
@RestResource(path = "findByLastName", rel = "lastName")
List<User> findByLastName(@Param("lastName") String lastName);
}
AddressRepository.java
package cn.huntcat.repository;
import cn.huntcat.model.Address;
import cn.huntcat.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
public interface AddressRepository extends JpaRepository<Address, Long> {
}
创建好这两个接口后就有了其基本的方法了,可以去爽一把level 3 级别的restful
- 这是通过 get 获取到的信息,api是我自己设置的根路径,配置文件里面有
- users:是默认的请求路劲(之后会说怎么自定义)
- 其他方式 就是该下请求方式
- 比如 删除某个用户 :
- DELETE:http://localhost:8080/api/users/1
3.4. 自定义路径和投影的用法:
UserProjection.java
package cn.huntcat.model.projections;
import cn.huntcat.model.User;
import org.springframework.data.rest.core.config.Projection;
/**
* @author wuchengxing
* @version 1.0
* @date 2019/11/29 20:23
*/
/**
* User相关操作,进行投影 路径为 /base
* 下面三个方法对应的就是可以获取其信息
* types: 是指你要获取那个类的信息
* base: 是你这个投影的名字
*/
@Projection(types = {User.class}, name = "base")
public interface UserProjection {
String getFirstName();
String getLastName();
String getEmail();
}
4. 总结:
快乐…刚看官方文档学的,见谅见谅