【初学者】使用Spring Boot创建新项目的基本步骤(MySQL / JDBC)
首先
作成新项目时,可以按照以下步骤使用Spring Boot与MySQL。为了让初学者能够理解MVC(模型-视图-控制器)的数据流动方式,我会尽量详细记录下来。
目前(2021年7月),本文所述内容仅适用于特定环境和设置如下。
データベースMySQLMySQLインストール方法DB接続のAPIJDBC API
ビルドツールGradle(Mavenの場合も併記)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项目
新的春季入门项目
在这里,我们将Name(可以随意设置,因为它是项目名称,任何名字都可以)设为Gradle(又称为“格雷德尔”)作为Type(构建工具)。Java版本设置为11。另外,Artifact将与Name自动关联并自动重写。
每个项目的内容大致如下。
新的 Spring Starter 项目依赖
在本次样本制作中,我们将指定以下五个库。
选择后,点击完成。
由于项目的创建需要一些时间,所以请耐心等待。
以下是参考文章:
– 让我们开始使用Spring Boot吧
– 使用Spring Boot创建基本的Web项目
– 尝试使用Spring Boot开发Web应用程序 Vol.2
– STS(Spring Tool Suite)3.9.0中的”Spring Starter Project”有了一些进步。
2. 确认新建立的项目。
主方法(自动生成)
首先,尝试双击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文件的对应关系如下。
(选择1)修改构建脚本(build.gradle)的方法
我会修改构建脚本(build.gradle),并提供添加库的方法(也许还有更简单的方法)。
例如,如果要添加与验证相关的库,您可以在dependencies的花括号内添加以下一行。
implementation 'org.springframework.boot:spring-boot-starter-validation'
当您进行追加操作后,请保存文件。
(选项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.initialization-mode参数用于指定在启动服务器时是否执行schema.sql和data.sql文件中的SQL语句。可选的配置值有三个:
1. always:始终执行SQL语句。
2. embedded:仅在嵌入式数据库(如H2)时执行SQL语句。
3. never:从不执行SQL语句。
never
の設定でよい)spring.datasource.schema 和 spring.datasource.data
在这个项目中,你需要指定一个文件名来执行在服务器启动时执行的SQL语句。文件名前面必须加上”classpath:”。
这里只写了数据库的设置,但是在application.properties中,还可以写入各种其他设置。
详情请参考应用程序属性设置列表等。
4-2. 如果使用的是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 版本的话
/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. 创建文件并将其放置在适当的目录中。
在本次样本项目中,我们将添加以下四个文件。
我会一一创建下列文件。
6. 创建SQL文件
在SQL文件中,记录了在项目启动时要执行的SQL语句。
如果数据库中已经存在所需的表和数据,即使不创建这两个文件,应用程序也可以启动(在这种情况下,application.properties 的配置会稍有改变)。
创建schema.sql
在 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. 制造控制器
文件可以通过双击打开。
在控制器中编写的源代码如下所示。
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. 创建视图
使用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. 打开应用程序
最后
无论什么事情,一开始都不会完全理解。虽然我也刚开始学习Spring Boot,但为了帮助那些将要开始学习的人们,我把这篇文章作为一种引导留下。我尽量留下了一些可供参考的网站链接,希望对你有所帮助。