【初学者】使用Spring Boot创建新项目的基本步骤(MySQL / JDBC)

首先

作成新项目时,可以按照以下步骤使用Spring Boot与MySQL。为了让初学者能够理解MVC(模型-视图-控制器)的数据流动方式,我会尽量详细记录下来。

目前(2021年7月),本文所述内容仅适用于特定环境和设置如下。

項目内容インストール方法などIDESpring Tool Suite4STSのインストール方法OSWindows 10
データベースMySQLMySQLインストール方法DB接続のAPIJDBC API
ビルドツールGradleMavenの場合も併記)JDKAdoptOpenJDKAdoptOpenJDK導入方法STSでAdoptOpenJDK使用

JDK 在使用 AdoptOpenJDK,但当然也可以使用 OpenJDK。

<目录>
1. 创建Spring Boot项目
2. 确认新创建的项目
3. 创建MySQL数据库
4. 配置应用程序属性
5. 创建文件并且放置在目录中
6. 创建SQL文件
7. 创建控制器
8. 创建视图
9. 启动应用程序

在创建此篇文章时,我参考了以下网站。

以下为参考文章:

– 使用SpringBoot + Spring JPA连接数据库
– 使用Spring Boot + Spring JDBC配置连接MySQL
– 在Spring Boot中使用Spring JDBC
– 使用JPA访问MySQL数据
– 关于Spring Boot中的数据库访问方法(JDBC、JPA、MyBatis)
– 【超级入门Java】尝试使用Spring Boot进行页面显示

创建Spring Boot项目

2021-04-10 182754.png

新的春季入门项目

2021-04-11 212553.png

在这里,我们将Name(可以随意设置,因为它是项目名称,任何名字都可以)设为Gradle(又称为“格雷德尔”)作为Type(构建工具)。Java版本设置为11。另外,Artifact将与Name自动关联并自动重写。

每个项目的内容大致如下。

項目内容Service URL(サービスURL)Spring Bootプロジェクトの雛形を生成する「SPRING INITIALIZR」のURLName(名前)プロジェクト名Type(型)ビルドツールの選択Java Version(Java バージョン)Javaのバージョンを選択Packaging(パッケージング)Jar又はWarから選択Language(言語)プログラミング言語を選択Group(グループ)プロジェクトを一意に識別する名前Artifact(成果物)プロジェクトの成果物の名前Version(バージョン)プロジェクトのバージョンDescription(説明)説明文Package(パッケージ)パッケージ名

新的 Spring Starter 项目依赖

2021-04-11 220837.png

在本次样本制作中,我们将指定以下五个库。

区分ライブラリ備考Developer ToolsSpring Boot DevToolsサーバを再起動しなくてもコードの修正が反映されるSQLJDBC APIJavaからデータベースを操作するインターフェイスSQLMySQL DriverMySQLへの接続ドライバTemplate EnginesThymeleafビューを作成するためのテンプレートエンジンWebSpring WebWEBアプリを構築するためのスターター
2021-04-11 220946.png

选择后,点击完成。
由于项目的创建需要一些时间,所以请耐心等待。

以下是参考文章:
– 让我们开始使用Spring Boot吧
– 使用Spring Boot创建基本的Web项目
– 尝试使用Spring Boot开发Web应用程序 Vol.2
– STS(Spring Tool Suite)3.9.0中的”Spring Starter Project”有了一些进步。

2. 确认新建立的项目。

2021-04-11 230835.png

主方法(自动生成)

首先,尝试双击TestAppApplication.java打开,代码将会自动生成如下:
这是用于启动WEB应用的主方法。

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class TestAppApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestAppApplication.class, args);
    }

}

本次的类名为“项目名+Application”。
这次不幸地变成了TestAppApplication,出现了重复的App(这个失败了)。
虽然有点尴尬,但对功能没有任何影响,所以就保持现状吧。

大致上看代码,可以感觉到是在SpringApplication类的run方法中启动应用程序。

build.gradle(自动生成的)

在build.gradle中,自动生成了以下这样的构建脚本(双击打开)。你可能会隐约感觉到选择的内容在Spring Starter项目中得到了反映。

plugins {
    id 'org.springframework.boot' version '2.4.4'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-jdbc'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'mysql:mysql-connector-java'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
    useJUnitPlatform()
}

不言而喻,在创建时检查的库与build.gradle文件的对应关系如下。

選択したライブラリdependenciesに反映された内容Spring Boot DevToolsspring-boot-devtoolsJDBC APIspring-boot-starter-jdbcMySQL Drivermysql-connector-javaThymeleafspring-boot-starter-thymeleafSpring Webspring-boot-starter-web

(选择1)修改构建脚本(build.gradle)的方法

我会修改构建脚本(build.gradle),并提供添加库的方法(也许还有更简单的方法)。
例如,如果要添加与验证相关的库,您可以在dependencies的花括号内添加以下一行。

    implementation 'org.springframework.boot:spring-boot-starter-validation'

当您进行追加操作后,请保存文件。

2021-04-11 225129.png

(选项2)如果使用Maven

如果使用Maven构建工具,将自动生成类似以下的pom.xml文件。虽然看起来可能很复杂且行数较多,但实际上与Gradle的内容几乎相同(忽略标签,以白色文字为主进行阅读,更容易理解)。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>TestApp</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>TestApp</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>11</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

3. 使用MySQL创建数据库

在这里,我们将创建一个用于项目的数据库。
由于我们将使用MySQL作为数据库管理系统,所以请在命令提示符中启动MySQL,并创建用于WEB应用程序的”数据库”和”用户”。
关于MySQL操作的详细信息,我这里不会写,建议参考”如何使用MySQL”之类的网站。

创建数据库

创建一个名为 spring_test 的数据库,并在 application.properties 文件中记录下该数据库的名称。

mysql> create database spring_test;
Query OK, 1 row affected (0.33 sec)

创建用户

在CREATE USER文中,我们将创建一个用于访问的用户。这里,我们将用户名设为yama3,密码设为123456。用户名和密码将在后面的application.properties文件中进行记录。

mysql> create user 'yama3'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.32 sec)

以下的代码将设置权限:
这将授予spring_test数据库的全部权限。

mysql> grant all on spring_test.* to 'yama3'@'localhost';
Query OK, 0 rows affected (0.23 sec)

4. 设置应用程序属性

刚才稍微提到过,已经生成了一个名为 application.properties 的文件,现在我们在这里写下与数据库相关的配置(该文件位于 src/main/resources 文件夹中)。

另外,由於Spring Boot的版本不同,因此我将分别介绍2.4.4、2.5.0和2.5.1的写法。
如果在其他版本中出现警告,您可以通过悬停显示的javadoc解决问题(参考文章)。

如果使用Spring Boot 2.4.4的情况

双击打开文件,然后按照以下方式写入数据库的属性。

spring.datasource.url=jdbc:mysql://localhost:3306/spring_test
spring.datasource.username=yama3
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.initialization-mode=always
spring.datasource.schema=classpath:schema.sql
spring.datasource.data=classpath:data.sql
spring.datasource.sql-script-encoding=utf-8

每个项目的意思如下:

項目記載内容備考spring.datasource.urljdbc:mysql://localhost:3306/[データベース名]MySQLへのコネクション(3306はポート番号)spring.datasource.username[ユーザー名]MySQLで作成したユーザー名spring.datasource.password[パスワード]MySQLで設定したパスワードspring.datasource.driver-class-namecom.mysql.cj.jdbc.DriverJDBCドライバを指定spring.datasource.initialization-modealways(実行する)/embedded(埋め込みDBのときに実行)/never(実行しない)DBの初期化の要否を設定spring.datasource.schemaclasspath:[スキーマSQL文を記載したファイル名]データベースの初期スキーマを記述したファイル(及びディレクトリ)を指定spring.datasource.dataclasspath:[初期データSQL文を記載したファイル名]データベースの初期データを記述したファイル(及びディレクトリ)を指定spring.datasource.sql-script-encodingutf-8 など文字コードを指定(何の?)

基本上需要按照固定的格式填写,并且只需要指定数据库名、用户名和密码即可。
虽然是固定的格式,但以下这两个项目最好要理解其含义。

初始化模式

spring.datasource.initialization-mode参数用于指定在启动服务器时是否执行schema.sql和data.sql文件中的SQL语句。可选的配置值有三个:
1. always:始终执行SQL语句。
2. embedded:仅在嵌入式数据库(如H2)时执行SQL语句。
3. never:从不执行SQL语句。

設定値内容always常にSQL文が実行されます。既に同名のテーブルがあるのにCREATE TABLE文を実行するとエラーが出るので注意が必要です(後述)embedded埋め込みDB(H2 Databaseなど)のときにのみSQL文を実行しますneverSQL文を実行しません(既にMySQLに必要なテーブルとデータが準備されていればneverの設定でよい)

spring.datasource.schema 和 spring.datasource.data

在这个项目中,你需要指定一个文件名来执行在服务器启动时执行的SQL语句。文件名前面必须加上”classpath:”。

2021-04-13 221359.png
2021-04-13 220627.png

这里只写了数据库的设置,但是在application.properties中,还可以写入各种其他设置。
详情请参考应用程序属性设置列表等。

4-2. 如果使用的是Spring Boot 2.5.0的版本

点击这里查看关于Spring Boot 2.5.0的内容。对于Spring Boot 2.5.0,可以按照以下方式进行设置。

application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/spring_test
spring.datasource.username=yama3
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.sql.init.enabled=true
spring.sql.init.schema-locations=classpath:schema.sql
spring.sql.init.data-locations=classpath:data.sql
spring.sql.init.encoding=utf-8

与2.4.4不同的项目如下所示。

项目
备注

spring.sql.init.enabled
设置是否初始化数据库(true=执行,false=不执行)

spring.sql.init.schema-locations
指定描述数据库初始模式的文件

spring.sql.init.data-locations
指定描述数据库初始数据的文件

spring.sql.init.encoding
指定字符编码

可以通过设置spring.sql.init.enabled为true(执行初始化)或false(不执行初始化)来进行指定。默认值为true,因此如果不进行任何设置,则将采用true的配置。

4-3. 如果使用 Spring Boot 2.5.1 版本的话

点击这里了解Spring Boot 2.5.1的详情由于Spring Boot版本2.5.1中的spring.sql.init.enabled被视为过时的,如果选择此版本,则应按以下方式进行编写。

/SpringSecuritySample/src/main/resources/application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/spring_security_test
spring.datasource.username=yama3
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.sql.init.mode=always
spring.sql.init.schema-locations=classpath:schema.sql
spring.sql.init.data-locations=classpath:data.sql
spring.sql.init.encoding=utf-8

项目
详细说明

spring.sql.init.mode
设置数据库初始化的要求(always:始终执行,embedded:嵌入式数据库执行,never:不执行)

5. 创建文件并将其放置在适当的目录中。

在本次样本项目中,我们将添加以下四个文件。

ファイル名内容TestController.javaコントローラの内容を記載index.htmlビューの内容を記載schema.sqlサーバ起動時に実行するSQL文を記載(テーブル定義など)data.sqlサーバ起動時に実行するSQL文を記載(初期データなど)
2021-04-16 011546.png

我会一一创建下列文件。

6. 创建SQL文件

在SQL文件中,记录了在项目启动时要执行的SQL语句。

如果数据库中已经存在所需的表和数据,即使不创建这两个文件,应用程序也可以启动(在这种情况下,application.properties 的配置会稍有改变)。

创建schema.sql

2021-04-15 224128.png
2021-04-15 224740.png
2021-04-15 224916.png
2021-04-17 140844.png

在 schema.sql 文件中,我们会记录诸如 CREATE TABLE 之类的语句,如下所示。

DROP TABLE IF EXISTS test_table;

CREATE TABLE test_table
(
   id INT NOT NULL AUTO_INCREMENT,
   name VARCHAR(100),
   old INT,
   PRIMARY KEY(id)
);

只需要CREATE TABLE语句是不够的,因为如果表未被删除,当再次启动服务器时将会出现“无法创建同名表”的错误。因此,我首先放置了DROP TABLE语句(使用IF EXISTS指定“如果表存在则删除”)。

<参考文章>
SpringBoot的数据库初始化方法

创建data.sql

文件的添加方法与 schema.sql 相同,文件名为 “data.sql”。
在 data.sql 中,我们将写入 INSERT INTO 语句(用于添加数据的 SQL 语句),以添加初始数据。

INSERT INTO test_table(name, old)
VALUES('Taro', 30), ('Jiro', 25), ('Saburo', 22);

7. 制造控制器

2021-04-16 010932.png

文件可以通过双击打开。
在控制器中编写的源代码如下所示。

package com.example.demo;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping()
public class TestController {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @GetMapping("/index")
    public String index(Model model) {
        String sql = "SELECT * FROM test_table";
        List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
        model.addAttribute("testList", list);
        return "index";
    }
}

尽管import语句很多,看起来有点冗长,但通过Ctrl+Shift+O可以自动补全,所以请不要太在意。
为了保持简洁的结构,没有创建像Service或Repository这样的类。

以下是一个简单的说明,但所写的内容只是对书籍《Spring徹底入門》的自由解释和概括,因此无法保证准确性。
只是希望能够以大概的形象传达出来,请以这种心情写下。

@控制器

首先,我们将从开头的部分开始审视。

@Controller
// (略)
public class TestController {
// (略)
}

在代码的开头添加 @Controller 注解。
注解是指备注的意思,在Spring中,通过编写 @Controller,将该类识别为控制器的规范。
确切的说法是“通过组件扫描将其注册到DI容器中”,但暂时可以理解为“表示控制器角色的描述”,这样就可以了。

@RequestMapping 和 @GetMapping

接下来,我们来讨论一下@RequestMapping 和 @GetMapping 的描述。
通过这些描述,我们可以指定WEB应用程序的请求路径。

@RequestMapping()
public class TestController {
    // (略)
    @GetMapping("/index")
    public String index(Model model) {
    // (略)
    }
}

在类级别通过@RequestMapping()指定的是基本路径(也可以写成@RequestMapping(“/”))。
在本地主机上,http://localhost:8080/的路径适用。

在方法级别指定的 @GetMapping(“/index”) 表示相对于基本路径的路径。
如果将其应用到本地主机上,则路径将变为 http://localhost:8080/index。
访问该路径时,会将处理传递给位于底下的 index 方法。
此外,@GetMapping 还表示它是 HTTP 通信的 GET 方法。

为了确保,我会再给一个例子。如果是以下这样的组合,通过 @PostMapping(“/index”) 发起的请求路径将是http://localhost:8080/home/index。

@RequestMapping("/home")
    // (略)
    @PostMapping("/index")
}

毋庸置疑,@PostMapping表示它是一个HTTP通信的POST方法。

@Autowired以及JdbcTemplate

这次是关于下面的描述。

    @Autowired
    private JdbcTemplate jdbcTemplate;

@Autowired 是一個說明的方式,用於自動將依賴注入到 DI 容器中,以「根據類型解決(By Type)」的方式(對於初學者來說,可能會有點不理解)。
JdbcTemplate 是一個用於簡化訪問數據庫的類。我覺得這在任何語言中都有類似的庫,你可以想像一下它的作用。

如果只写上述的两行,就可以使用初始化完成的 JdbcTemplate 类,而无需进行繁琐的设置。如果我们把在 application.properties 文件中设置的连接信息等自动添加进来,我觉得可以大致了解它的作用(可能有些不同)。

模型

好的,接下来是 Model。
这是所谓的 MVC(模型-视图-控制器)中的第一个出现的 Model 部分。
它突然出现在 index 方法的参数中。

    public String index(Model model) {
    // (略)
    }

在像Ruby on Rails等框架中,有一个叫做Model的文件(类),所以很容易理解,但Spring MVC的Model是从哪里来的,感觉很神秘。

根据解释,Spring MVC 的 Model 是一种默认支持的类型,用于保存和返回与目标页面相关的协作数据(根据《Spring深入入门》适当意译)。简单来说,Model对象只需在方法参数中设置即可获取,并在控制器和视图之间负责数据交流。

首先,只需按照上述方式設定參數,即可使用Model。

索引方法 (suǒ

最后,我们将逐行查看index方法的内容。

创建SQL语句

    String sql = "SELECT * FROM test_table";

方法内第一行是一个用于获取test_table中所有记录的SQL语句。

执行SQL语句

    List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);

在这个句子中,通过SQL查询语句将获取的数据赋值给变量list。

左边的List<Map<String, Object>>表示了一个包含Map(类似关联数组)作为元素的List类型。
每个Map<String, Object>中存储了一个记录,例如{ id=1, name=”Taro”, old=30 },并将其转化为List以获取所有记录的类型(请参考本文)。

使用 JdbcTemplate 的 queryForList 方法来执行 SQL 语句,返回类型为 List<Map<String, Object>>。
当只获取一条记录的 SQL 语句时,使用 queryForMap 方法。此时返回类型为 Map<String, Object>。

将对象添加到Model中。

    model.addAttribute("testList", list);

在这个句子中,使用Model对象的addAttribute方法,将一个list对象添加到Model中。
在此过程中,将list对象命名为”testList”。
添加到Model的内容将在随后的视图(HTML文件)中使用。

④ 指定视图文件

    return "index";

在最后的return语句中返回了字符串”index”。
这个返回值会指定要使用的View文件名(index.html)。

如果是示例代码的情况下,存放index.html的位置是在src/main/resources/templates的直接下级,所以写成return “index”。但是,如果比如创建了一个名为home的文件夹,并将index.html存放在其中,那么写法将包括文件夹名称,变为return “home/index”。

8. 创建视图

2021-04-17 112655.png
2021-04-16 010418.png
2021-04-16 010532.png

使用thymeleaf(模板引擎)将变量等嵌入生成的index.html文件中,通过双击打开后进行编辑。

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
</head>
<body>
    <table>
        <tr>
            <th>id</th>
            <th>name</th>
            <th>old</th>
        </tr>
        <tr th:each="test : ${testList}">
            <td th:text="${test.id}"></td>
            <td th:text="${test.name}"></td>
            <td th:text="${test.old}"></td>
        </tr>
    </table>
</body>
</html>

为了帮您理解以下内容,请提供简单的解释。

声明Thymeleaf的命名空间。

<html xmlns:th="http://www.thymeleaf.org">

通过上述的xmlns声明,我们定义了Thymeleaf(http://www.thymeleaf.org)的命名空间(th)。通过这个声明,我们可以使用Thymeleaf。

然而,即使没有这个声明,Thymeleaf 也可以正常使用(可能在背后进行了各种配置)。
值得注意的是,如果没有这个声明,STS(IDE)会发出警告,所以最好老实地进行定义。

<參考網站>
– 模板引擎(Thymeleaf)

文本内容

th:text标记用于输出标签内的文本。
举个简单的例子,如下所示。

<h1 th:text="Hello World!">hoge</h1>

在上面的HTML文中,会显示出”Hello World!”这段文字(hoge会被替换)。

只需要一个选项,以中文进行转述:而且,通过在变量中指定要显示的文本,您可以动态地嵌入标签内的文本。

<h1 th:text="${title}"></h1>

变量需要以 ${变量名称} 的形式来指定。
这个变量将从 Model 中获取。

th:each 在这里的意思是用于迭代一个集合或数组中的元素,并在HTML页面中生成相应的内容。

使用th:each可以实现循环处理,如下所示。

<tr th:each="test : ${testList}">
    <td th:text="${test.id}"></td>
    <td th:text="${test.name}"></td>
    <td th:text="${test.old}"></td>
</tr>

光是看到这段代码,就可以大致理解它是采用了 for each 的形式。
也就是说,它逐个将 testList 列表的元素赋值给变量 test,然后从 test 中取出 test.id、test.name 和 test.old 这些值。

此testList是在之前提及的“将对象添加到模型”部分中,由控制器创建并添加到模型中的列表(如下所示的一句话)。

    model.addAttribute("testList", list);

有关Thymeleaf的详细信息,可以参考以下文章。

以下是本篇参考文章:
・Spring Boot中使用Thymeleaf的方法备忘录
・Thymeleaf速查表

9. 打开应用程序

2021-04-17 133412.png
2021-04-17 133921.png
2021-04-17 134142.png

最后

无论什么事情,一开始都不会完全理解。虽然我也刚开始学习Spring Boot,但为了帮助那些将要开始学习的人们,我把这篇文章作为一种引导留下。我尽量留下了一些可供参考的网站链接,希望对你有所帮助。