Spring-Data-Jpa
JPA(Java Persistence API)是一个规范,定义了一系列对象持久化的标准,目前实现这一规范的有Hibernate / TopLink 等
RESTful API
| 请求类型 | 请求路径 | 功能 |
|---|---|---|
| GET | /books | 获取书籍列表 |
| POST | /books | 创建书籍列表 |
| GET | /books/id | 通过 id 查询某本书 |
| PUT | /books/id | 通过 id 更新某本书 |
| DELETE | /books/id | 通过 id 删除某本书 |
步骤
1. 首先在pom.xml 中添加相关组件
<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 中配置数据库相关的信息
如果写在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:
# 自动创建表,
ddl-auto: create
show-sql: true
- ddl-auto: create, drop table if exists book_entity
- ddl-auto: update, 如果表不存在会创建,但是已存在会保留表和表中的数据
- ddl-auto: create-drop, 服务停止的时候会删除表结构
- ddl-auto: none, 什么都不做
- ddl-auto: validate, 验证表结构是否和类结构一致,不一致报错
3. 创建类BookEntity, 映射表结构
@Entity
public class BookEntity{
@Id
@GeneratedValue
private Integer id;
private String bookName;
prvate Integer bookNum;
alt+insert, 插入get/set方法
}
4. 创建接口 BookRepository
查询时调用接口。这样做的好处是,通过接口来调用,解耦了表结构 BookEntity 和 控制层 Controller 的关系.
// Integer 为 id 的类型
public interface BookRepository extends JpaRepository<Book, Integer>{
}
5. 控制层创建接口
创建类,BookController, BookEntity 相关的操作可以放到这里
- 创建 /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
- 创建 /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);
}
经测试发现,这个方法支持 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
- 这个接口设计的不合理,没办法只更新一个字段
@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);
}