springBoot startup:数据库操作(三)

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 相关的操作可以放到这里

  1. 创建 /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

  1. 创建 /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 格式

  1. 通过 id 查询书籍信息
@GetMapping(value = "/books/{id}")
public BookEntity BookEntityFindOne(@PathVariable("id") Integer id){
  return bookRepository.findOne(id);
}
  1. 通过 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    
}
  1. 通过 id 删除某本书
@DeleteMapping(value = "/books/{id}")
public void BookEntityDeleteOne(@PathVariable("id") Integer id){
      return bookRepository.delete(id);
}

接口可以扩展!!如 通过书名来查询

  1. 首先需要扩展接口, 在 BookResipotory 中写接口。扩展接口的名字要按照一定格式,否则不能使用
public interface BookRepository extends JpaREpository<BookEntity, Integer>{
   public List<BookEntity> findByBookName(String bookName);
}
  1. 在 BookController 中定义接口。
@GetMapping("/books/bookName/{bookName}")
public List<BookEntity> BookEntityFindOneByBookName(@PathVariable("bookName") String bookName){
    return bookRepository.findByBookName(bookName);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容