Spring-Data-Jpa
JPA(Java Persistence API)是一個規(guī)范塘幅,定義了一系列對象持久化的標(biāo)準(zhǔn)奈偏,目前實現(xiàn)這一規(guī)范的有Hibernate / TopLink 等
RESTful API
請求類型 | 請求路徑 | 功能 |
---|---|---|
GET | /books | 獲取書籍列表 |
POST | /books | 創(chuàng)建書籍列表 |
GET | /books/id | 通過 id 查詢某本書 |
PUT | /books/id | 通過 id 更新某本書 |
DELETE | /books/id | 通過 id 刪除某本書 |
步驟
1. 首先在pom.xml 中添加相關(guān)組件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependecy>
2. 在 application.yml 中配置數(shù)據(jù)庫相關(guān)的信息
如果寫在application.yml 中讼溺,那么無論是 application-dev.yml / application-prod.yml 都可以使用饿序。
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.01:3306/zzjack_study
username: root
password: 123456
jpa:
hibernate:
# 自動創(chuàng)建表狂丝,
ddl-auto: create
show-sql: true
- ddl-auto: create, drop table if exists book_entity
- ddl-auto: update, 如果表不存在會創(chuàng)建泵琳,但是已存在會保留表和表中的數(shù)據(jù)
- ddl-auto: create-drop, 服務(wù)停止的時候會刪除表結(jié)構(gòu)
- ddl-auto: none, 什么都不做
- ddl-auto: validate, 驗證表結(jié)構(gòu)是否和類結(jié)構(gòu)一致,不一致報錯
3. 創(chuàng)建類BookEntity, 映射表結(jié)構(gòu)
@Entity
public class BookEntity{
@Id
@GeneratedValue
private Integer id;
private String bookName;
prvate Integer bookNum;
alt+insert, 插入get/set方法
}
4. 創(chuàng)建接口 BookRepository
查詢時調(diào)用接口舔涎。這樣做的好處是笼踩,通過接口來調(diào)用,解耦了表結(jié)構(gòu) BookEntity 和 控制層 Controller 的關(guān)系.
// Integer 為 id 的類型
public interface BookRepository extends JpaRepository<Book, Integer>{
}
5. 控制層創(chuàng)建接口
創(chuàng)建類亡嫌,BookController, BookEntity 相關(guān)的操作可以放到這里
- 創(chuàng)建 /books 獲取書籍列表的接口
@RestController
public class BookController{
@AutoWired
private BookRepository bookRepository;
//查詢書籍列表
//RequestMapping("/books", method = RequestMethod.GET)
@GetMapping("/books")
public List<BookEntity> bookEntityList(){
return bookRepository.findAll();
}
}
通過 http://localhost:8080/books 可驗證嚎于,成功情況下返回一個 json
- 創(chuàng)建 /books 新增書籍接口
@PostMapping(value = "/books")
public BookEntity BookAdd(@RequestParam("bookName") String bookName,
@RequestParam("bookNum") Integer bookNum){
BookEntity book = new BookEntity();
book.setBookName(bookName);
book.setBookNum(bookNum);
return bookRepository.save(book);
}
經(jīng)測試發(fā)現(xiàn),這個方法支持 form-data/x-www-form-urlencoded 兩種方法挟冠,但是不支持 json 格式
- 通過 id 查詢書籍信息
@GetMapping(value = "/books/{id}")
public BookEntity BookEntityFindOne(@PathVariable("id") Integer id){
return bookRepository.findOne(id);
}
- 通過 id 更新某本書
- 為什么更新這個接口只支持 x-www-form-urlencoded, 不支持 fomr-data
- 這個接口設(shè)計的不合理于购,沒辦法只更新一個字段
@UpdateMapping(value = "/books/{id}")
public BookEntity BookEntityUpdateOne(@PathVariable("id") Integer id, @RequestParam("bookName")String bookName,
@RequestParam("bookNum") Integer bookNum){
BookEntity bookEntity = new BookEntity();
bookEntity.setId(id);
bookEntity.setBookName(bookName);
bookEntity
}
- 通過 id 刪除某本書
@DeleteMapping(value = "/books/{id}")
public void BookEntityDeleteOne(@PathVariable("id") Integer id){
return bookRepository.delete(id);
}
接口可以擴展!知染!如 通過書名來查詢
- 首先需要擴展接口, 在 BookResipotory 中寫接口肋僧。擴展接口的名字要按照一定格式,否則不能使用
public interface BookRepository extends JpaREpository<BookEntity, Integer>{
public List<BookEntity> findByBookName(String bookName);
}
- 在 BookController 中定義接口控淡。
@GetMapping("/books/bookName/{bookName}")
public List<BookEntity> BookEntityFindOneByBookName(@PathVariable("bookName") String bookName){
return bookRepository.findByBookName(bookName);
}