iT邦幫忙

2023 iThome 鐵人賽

DAY 4
0
SideProject30

Java Spring + Vue 甘苦學習路 前後端分離之 Blog 實戰系列 第 4

Day4 Java Spring API 之資料系統建構 — 發文功能

  • 分享至 

  • xImage
  •  

概述

此次 API 的建立將以不同的功能去做切分,各別開發不同用途的 API,首先將會實作 Blog 中「發文」的這個功能,所以以下有關建置的部分皆是為了 Post 這個功能所設計。在建立 API 前,需確認資料庫的狀況、專案建置的架構規劃等,所以本篇將會先著重在架構、資料庫的建立,之後會大致簡述 API 的一些基本建立資訊。

系統運資料架構

下圖為 Client 端與 DB(Database) 之間的溝通流程,需要透過 Controller 的處理前端的請求,Service 建立邏輯處理,之後由 DAO (Data Access Objects) 這個邏輯物件跟 DB 進行直接的資料處理。

https://ithelp.ithome.com.tw/upload/images/20230910/20126089xHjz59hmDD.png

檔案結構

在 Intellij IDEA 中 Import 上一篇 Generate 出來的 project 後,就可以按照上述所說的架構中,建立相對應的 package 來存放,如此也方便未來的維護性,下圖為檔案結構:

https://ithelp.ithome.com.tw/upload/images/20230910/20126089e3GeVIlmuD.png

DB 資料建立

  1. 需要先設定與 DB 間的連結資訊,所以要在 application.properties 檔案中輸入以下: (根據本身 DB 狀況要進行微調)
spring.datasource.url = jdbc:mysql://localhost:3306/your-db-name
spring.datasource.username=your-username
spring.datasource.password = your-password
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
spring.jpa.hibernate.ddl-auto=update
  1. 透過在 entity package 中建立一個名為 Post.class 的檔案, 以此來建立 DB 中的 Schema
    輸入以下的 Code 在 Post.class 中,並按下 main class 的執行後,就可以直接也在 DB 中建立根據程式敘述的相對應 table, column 等。
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data // Equiv to @Getter @Setter...
@AllArgsConstructor
@NoArgsConstructor

@Entity
@Table(
    name = "posts",uniqueConstraints={@UniqueConstraint(columnNames={"title"})}
)
public class Post {
    // 建立 primary key
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private long id;
    @Column(name="title",nullable = false)
    private String title;
    @Column(name="description",nullable = false)
    private String description;
    @Column(name="content",nullable = false)
    private String content;
    // add Getter / Setter Constructors toString and hashcode method

}

JPA repository

  1. 在 repository 中新增 Java class > Interface,可以名為 PostRepository
  2. 在 class 中 extend JpaRepository
  3. import 相對應的模組,例如: import com.spring.blog.entity.Post; 主要是表示上一個步驟建立完的 Post entity 這個路徑
import com.spring.blog.entity.Post;
import org.springframework.data.jpa.repository.JpaRepository;
public interface PostRepository extends JpaRepository<Post,Long>{
// will get all CRUD methods by extending JPA repository and also
    // don't have to use annotation because of the same reason

}

每一個實體 entity 都會各別建立一個 repository

Exception

為了要處理 API 的錯誤訊息,以下為 Exception 的設置:

  1. 在 repository 這個 package 中新增 ResourceNotFoundException 的 java class
  2. extends RuntimeException
  3. 定義要處理的這個資料的名稱、值等: String resourceName, String fieldName, String filedValue
  4. 使用 @ResponseStatus
  5. 建立 Constructor 以及 Getter Setter ,建立的方式也可以按下右鍵選擇 Generate 並選擇想要使用的欄位
  6. 在 ResourceNotFoundException() 這個 function 中可以透過 super 內帶入不同的語句而有不同的呈現
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

@ResponseStatus(value= HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException{
    private String resourceName;
    private String fieldName;
    private String filedValue;
    // Create Constructor

    public ResourceNotFoundException(String resourceName, String fieldName, String filedValue) {
        super(String.format("%s Can't find %s: '%%",resourceName,fieldName,filedValue));
        this.resourceName = resourceName;
        this.fieldName = fieldName;
        this.filedValue = filedValue;
    }
    // 建立 Getter and Setter

    public String getResourceName() {
        return resourceName;
    }

    public String getFieldName() {
        return fieldName;
    }

    public String getFiledValue() {
        return filedValue;
    }
}

DTO (Data Transfer Object)

與資料庫傳輸用的物件。

  1. 在 payloads 這個 package 中建立 PostDto.class
  2. 使用 PostDto 物件作為在 client 跟 server 之間的 payload
  3. 複製所有剛剛在 entity 中建立的 column 資料
package com.spring.blog.payloads;

import jakarta.persistence.Column;
import lombok.Data;

@Data
public class PostDto {
    private long id;
    private String title;
    private String description;
    private String content;
}

建立 Post 的 REST API

下圖是 Post 要使用 REST API 進行資料存取等動作時的內容架構:

https://ithelp.ithome.com.tw/upload/images/20230910/201260890Zfts6LTup.png

在程式碼中,會使用 @RequestMapping 等去做 URL 的設計 。

而如何做出上圖的 URL 架構,以及其相對應的動作等內容將會在後續揭曉~ 有興趣的記得來看喔~

若文中有錯誤之處還請多包涵與指正,歡迎在文章下方留言討論!

明天見~/images/emoticon/emoticon08.gif


上一篇
Day3 API 建立之環境建置
下一篇
Day 5 Java Spring API 建立 — 發文功能
系列文
Java Spring + Vue 甘苦學習路 前後端分離之 Blog 實戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言