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. 總結:
快樂…剛看官方文檔學的,見諒見諒