Spring Boot 3 搭配 JPA ,其中常用到的兩個類別 Entity 與 Repository 。
Entity : 對應到資料庫中的 table。
Repository : 對 table 進行,新修刪查。
Spring Boot 3 增加 Dao 的 package
前一篇文章,已經建立的 MyBook.java 的 Entity。
此篇增加 Repository : MyBookDao.java。
建立 package : com.example.myjpa.dao

建立 Java 的 interface: MyBookDao.java
package com.example.myjpa.dao;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.example.myjpa.entity.MyBook;
@Repository
public interface MyBookDao extends JpaRepository<MyBook, Long>{
}
Dao 中的基本功能
新增一個 RestController 進行測試。
建立 package : com.example.myjpa.action

建立 MyBookAction.java
Dao 中 insert 資料
package com.example.myjpa.action;
import java.time.LocalDate;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.example.myjpa.dao.MyBookDao;
import com.example.myjpa.entity.MyBook;
@RestController
@RequestMapping("MyBook")
public class MyBookAction {
@Autowired
MyBookDao myBookDao;
@GetMapping("insert")
public Map insert() {
Map rs = new HashMap();
MyBook book = new MyBook();
book.setName("第一本書");
book.setPrice(100);
book.setPublishingHouse("低一出版社");
book.setPublicationDate(LocalDate.parse("2021-01-01"));
book = myBookDao.save(book);
rs.put("success", true);
rs.put("id", book.getId());
return rs;
}
}
於瀏覽器上執行: http://localhost:8080/MyBook/insert

資料庫中查詢

Dao 中 查詢資料
以 PK 進行查詢,在 MyBookAction.java 增加 method
@GetMapping("queryOne")
public Map queryOne() {
Map rs = new HashMap();
MyBook book = myBookDao.getReferenceById(1L);
rs.put("success", true);
rs.put("book", book);
return rs;
}
在瀏覽器上執行: http://localhost:8080/MyBook/queryOne
結果,發生錯誤囉!!
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer

原因是因為 JPA 中的 @Entity 無法序列化成 Json ,因此需要 vo 來轉載資料到前端,輸出 Json。
新增 package : com.example.myjpa.vo

增加 MyBookVo.java
package com.example.myjpa.vo;
import java.time.LocalDate;
public class MyBookVo {
private Long id;
private String name;
private int price;
private LocalDate publicationDate;
private String publishingHouse;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public LocalDate getPublicationDate() {
return publicationDate;
}
public void setPublicationDate(LocalDate publicationDate) {
this.publicationDate = publicationDate;
}
public String getPublishingHouse() {
return publishingHouse;
}
public void setPublishingHouse(String publishingHouse) {
this.publishingHouse = publishingHouse;
}
}
修改 MyBookAction.java
@GetMapping("queryOne")
public Map queryOne() {
Map rs = new HashMap();
MyBook book = myBookDao.getReferenceById(1L);
MyBookVo vo = new MyBookVo();
BeanUtils.copyProperties(book, vo);//複製資料
rs.put("success", true);
rs.put("book", vo);
return rs;
}
在瀏覽器上執行: http://localhost:8080/MyBook/queryOne

Dao 中 update 資料
在 MyBookAction.java 增加 method ,將價格改為 200。
@GetMapping("update")
public Map update() {
Map rs = new HashMap();
MyBook book = new MyBook();
book.setId(1L);
book.setName("第一本書");
book.setPrice(200);
book.setPublishingHouse("低一出版社");
book.setPublicationDate(LocalDate.parse("2021-01-01"));
book = myBookDao.save(book);
rs.put("success", true);
rs.put("id", book.getId());
return rs;
}
在瀏覽器上執行: http://localhost:8080/MyBook/update

查看資料庫中內容

Dao 中 delete 資料
在 MyBookAction.java 增加 method 。
@GetMapping("delete")
public Map delete() {
Map rs = new HashMap();
myBookDao.deleteById(1L);
rs.put("success", true);
return rs;
}
在瀏覽器上執行: http://localhost:8080/MyBook/delete

查看資料庫中內容

確實資料已經被刪除了!