[教學] Spring Boot 專案建立與使用指南

Spring Framework 是開發 JAVA 網頁程式非常方便的框架,雖然能夠達到開發快速的優點,不過其缺點是在一開始建立專案時,需要做許多的XML設定檔以及環境設定,而後來有了 Spring Boot 這個框架,其優點是將這些繁瑣的設定又封裝了起來,並且整合了 tomcat 在裡面,使得開發者能夠快速的建立專案後就開始開發,節省了不少的時間,本篇將教學如何建立與使用 Spring Boot 專案。

示範環境:

  • Java 版本:OpenJDK 11
  • 資料庫:MySQL 5.7
  • 構建工具:Gradle
  • 需求:開發 Web API

建立專案

首先開啟 Spring Initializr 網站上建立專案:https://start.spring.io/

接著選擇專案要的配置,左邊部分這邊選擇了以下的配置

  • Project:Gradle
  • Language:Java
  • Spring Boot:2.3.1
  • Packaging:War
  • Project Metadata:依照自己的需求填寫

而右邊的部分要選擇需要使用到的套件,點右上的 [ADD DEPENDENCIES…] 按鈕可以選擇要使用的套件

這邊選擇了以下幾個套件:

  • Spring Web (使用 Spring MVC 框架開發)
  • Spring Data JPA (資料庫 JPA 部分)
  • MySQL Driver (連線 MySQL 資料庫的 JDBC)

點畫面下方的 EXPLORE 可以檢視產生的裝案配置

如果沒有問題就可以接的點下面的 [DOWNLOAD] 按鈕下載專案

解壓縮後能取得初始專案

建立 .gitignore

假如是使用 git 來進行版本控制,可以加入一些設定進 .gitignore 裡面

(如果沒有使用 git 可以跳過此步驟)

從 gitignore.io 下載複製內容並貼進 .gitignore 檔案: https://www.toptal.com/developers/gitignore/api/intellij,eclipse,gradle

其中包含了三個配置,如果有需要新增可以自己增加:

  • intellij
  • eclipse
  • gradle

使用指令安裝或更新套件

如果沒有使用 IDE 來進行開發,可以輸入以下指令安裝需要的 jar 套件

gradlew build --refresh-dependencies

開啟專案 (IntelliJ IDEA Community 版本)

這邊示範使用 IntelliJ IDEA Community 開啟專案,可以使用自己擅長使用 IDE 或者是編輯器來進行開發 (例如:Eclipse、VS Code…等)

點 [Import Project],選擇剛剛下載解壓的專案資料夾

選擇 [Import project from external model],接著選 Gradle 開啟

等待安裝專案相關環境

設定資料庫連線

在執行專案前需要先設定資料庫連線,開啟專案的的設定檔 src/main/resources/application.properties

加入以下的吃資料庫設定({host}{database-name}{database-username}{database-password} 改成自己的資料庫的網域IP、名稱、帳號與密碼):

# DataSource 配置
spring.datasource.url=jdbc:mysql://{host}:3306/{database-name}?useUnicode=yes&characterEncoding=UTF-8
spring.datasource.username={database-username}
spring.datasource.password={database-password}
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

建立 Controller

要建立一個 package 叫 controller,並且建立一個 class 叫 HelloController,程式碼如下:

import org.springframework.web.bind.annotation.*;

@RestController
public class HelloController {
    @GetMapping("/")
    public String index() {
        return "Greetings from Spring Boot!";
    }

    @GetMapping("/hello")
    public String hello() {
        return "Hello";
    }
}

此 controller 是會在 //hello 的網址顯示訊息

執行專案

使用指令啟動

可以輸入以下指令啟動網站

./gradlew bootRun

開啟瀏覽器網址分別為 http://localhost:8080/ 以及 http://localhost:8080/hello

使用 IntelliJ IDEA 啟動

找到 Application 的 main

點 main 旁邊的執行按鈕可以執行

開啟瀏覽器網址分別為 http://localhost:8080/ 以及 http://localhost:8080/hello

使用 JPA 操作資料庫

接著示範如何使用 JPA,這邊使用一個 table 用來存學生基本資料來示範

建立資料庫 table 與資料

先用以下的 SQL schema 建立 table

CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) NOT NULL,
  `age` tinyint(4) NOT NULL,
  `birthday` date NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

並且建立 table 資料

INSERT INTO `student` (`id`, `name`, `age`, `birthday`) VALUES (1,'小明',20,'2020-01-01');

建立 table 對應的 repositorie 與 model

建立一個 package model 並且在裡面新增一個 class 叫做 Student,程式碼為:

import javax.persistence.*;
import java.util.Date;

@Entity
@Table(name="Student")
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name="name")
    private String name;

    @Column(name="age")
    private Integer age;

    @Column(name="birthday")
    private Date birthday;

    public Student() {
    }

    //... 省略 getter setter
}

接著建立一個 package repository,並且新增一個 interface StudentRepository

有了 Repository 就能使用一些常用的基本功能 findByIddeleteById … 等之類的功能

而如果有另外需求可以自行定義,例如:自訂的一個函數功能 findByName 是使用名字查詢學生資料

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;

public interface StudentRepository extends JpaRepository<Student, Long>{
    @Query("SELECT s FROM Student s WHERE s.name LIKE :name%")
    List<Student> findByName(@Param("name") String name);
}

使用 controller 做對應的 API

有了 model 與 repository 就可以方便的查詢資料了

要使用 repository,只需要在想使用的地方使用 @Autowired 將其掛到 class 內,就能夠直接使用,不需要實作實際的 class

※ 比較好的方法是再切一層 Service 來進行操作資料,而非在 Controller 直接使用 Repository,不過這邊為了方便 Demo 所以直接在 Controller 示範

這邊建立一個 StudentController 來當作範例

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Optional;

@RestController
public class StudentController {
    @Autowired
    StudentRepository studentRepository;

    @GetMapping("/students/{id}")
    public Optional<Student> student(@PathVariable("id") int studentId) {
        Optional<Student> student = studentRepository.findById((long) studentId);
        return student;
    }

    @GetMapping("/students")
    public List<Student> student(@RequestParam("keyword") String keyword) {
        List<Student> students = studentRepository.findByName(keyword);
        return students;
    }
}

這樣就能在 http://localhost:8080/students/1http://localhost:8080/students?keyword=小明 看 Repository 回應的結果

使用 Service

一些常用的商業邏輯往往都會抽出一個邏輯層,並且在其他要使用的地方使用 @Autowired 將其掛進去

可以新增一個 package service 並且加一個 service class HelloService,而要將其變為 service 非常簡單只需要在 class 寫上 @Service 便可

import org.springframework.stereotype.Service;

@Service
public class HelloService {
    HelloService() {
    }

    public String sayHello(String name) {
        return "hello, " + name;
    }
}

這樣就能在要使用的地方掛進來使用

@RestController
public class HelloController {
    @Autowired
    HelloService helloService;

    //... 省略
}

產生 WAR 檔

輸入以下指令可以產生 WAR 檔

./gradlew build

WAR 檔會產生在 ./build/libs/ 裡面