创建连接到MySQL数据库的Spring应用程序的过程_应用程序

本指南将引导您完成创建连接到MySQL数据库的Spring应用程序的过程(而不是大多数其他指南和许多示例应用程序使用的内存中嵌入式数据库)。它使用 Spring Data JPA 来访问数据库,但这只是许多可能选择之一(例如,您可以使用普通的 Spring JDBC)。

您将构建什么

您将创建一个MySQL数据库,构建一个Spring应用程序,并将其连接到新创建的数据库。

MySQL是用GPL授权的,所以你用它分发的任何程序二进制文件也必须使用GPL。请参阅的GNU 通用公共许可证.

你需要什么

  • MySQL​版本 5.6 或更高版本。如果您安装了 Docker,则以容器.
  • 约15分钟
  • 最喜欢的文本编辑器或 IDE
  • JDK 1.8或以后
  • 格拉德尔 4+​或梅文 3.2+
  • 您也可以将代码直接导入到 IDE 中:
  • 弹簧工具套件 (STS)
  • 智能理念
  • VSCode

如何完成本指南

像大多数春天一样入门指南,您可以从头开始并完成每个步骤,也可以绕过您已经熟悉的基本设置步骤。无论哪种方式,您最终都会得到工作代码。

要从头开始,请继续从 Spring 初始化开始.

要跳过基础知识,请执行以下操作:

  • 下载​并解压缩本指南的源存储库,或使用吉特:git clone https://github.com/spring-guides/gs-accessing-data-mysql.git
  • 光盘成gs-accessing-data-mysql/initial
  • 跳转到创建数据库.

完成后,您可以根据 中的代码检查结果。​​gs-accessing-data-mysql/complete​

从 Spring 初始化开始

你可以使用这个预初始化项目,然后单击生成以下载 ZIP 文件。此项目配置为适合本教程中的示例。

手动初始化项目:

  1. 导航到https://start.spring.io.此服务拉入应用程序所需的所有依赖项,并为您完成大部分设置。
  2. 选择 Gradle 或 Maven 以及您要使用的语言。本指南假定您选择了 Java。
  3. 单击依赖关系,然后选择Spring WebSpring Data JPAMySQL驱动程序
  4. 单击生成
  5. 下载生成的 ZIP 文件,该文件是配置了您选择的 Web 应用程序的存档。

如果您的 IDE 集成了 Spring Initializr,则可以从 IDE 完成此过程。

您也可以从 Github 分叉项目,然后在 IDE 或其他编辑器中打开它。

创建数据库

打开终端(Microsoft Windows中的命令提示符)并以可以创建新用户的用户身份打开MySQL客户端。

例如,在 Linux 系统上,使用以下命令;

$ sudo mysql --password

这将连接到MySQL并允许从所有主机访问用户。对于生产服务器,这不是推荐的方法。​​root​

若要创建新数据库,请在提示符下运行以下命令:​​mysql​

mysql> create database db_example; -- Creates the new database
mysql> create user 'springuser'@'%' identified by 'ThePassword'; -- Creates the user
mysql> grant all on db_example.* to 'springuser'@'%'; -- Gives all privileges to the new user on the newly created database

创建文件​​application.properties​

Spring Boot 为您提供了所有内容的默认值。例如,默认数据库为 。因此,如果要使用任何其他数据库,必须在文件中定义连接属性。​​H2​​​​application.properties​

创建一个名为 的资源文件,如以下清单所示:​​src/main/resources/application.properties​

spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:3306/db_example
spring.datasource.username=springuser
spring.datasource.password=ThePassword
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#spring.jpa.show-sql: true

此处,可以是 、、 或 。请参阅的​​spring.jpa.hibernate.ddl-auto​​​​none​​​​update​​​​create​​​​create-drop​​休眠文档了解详情。

  • ​none​​:默认值。不会对数据库结构进行任何更改。MySQL
  • ​update​​:Hibernate根据给定的实体结构更改数据库。
  • ​create​​:每次都创建数据库,但不在关闭时将其删除。
  • ​create-drop​​:创建数据库并在关闭时将其删除。SessionFactory

必须以 或 开头,因为您还没有数据库结构。第一次运行后,可以根据程序要求将其切换到 或。在要对数据库结构进行一些更改时使用。​​create​​​​update​​​​update​​​​none​​​​update​

的缺省值为 和其他嵌入式数据库。对于其他数据库,例如 ,缺省值为 。​​H2​​​​create-drop​​​​MySQL​​​​none​

在数据库处于生产状态后,将其设置为 ,撤销连接到 Spring 应用程序的 MySQL 用户的所有权限,并仅向 MySQL 用户授予 、、 和 。您可以在本指南末尾阅读有关此内容的更多信息。​​none​​​​SELECT​​​​UPDATE​​​​INSERT​​​​DELETE​

创建模型​​@Entity​

You need to create the entity model, as the following listing (in ) shows:​​src/main/java/com/example/accessingdatamysql/User.java​

package com.example.accessingdatamysql;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;

@Entity // This tells Hibernate to make a table out of this class
public class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;

private String name;

private String email;

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}
}

Hibernate会自动将实体转换为表。

创建存储库

您需要创建保存用户记录的存储库,如以下清单 (in ) 所示:​​src/main/java/com/example/accessingdatamysql/UserRepository.java​

package com.example.accessingdatamysql;

import org.springframework.data.repository.CrudRepository;

import com.example.accessingdatamysql.User;

// This will be AUTO IMPLEMENTED by Spring into a Bean called userRepository
// CRUD refers Create, Read, Update, Delete

public interface UserRepository extends CrudRepository<User, Integer> {

}

Spring 会自动在具有相同名称的 Bean 中实现此存储库接口(大小写有所变化 — 称为 )。​​userRepository​

创建控制器

您需要创建一个控制器来处理对应用程序的 HTTP 请求,如以下清单 (in ) 所示:​​src/main/java/com/example/accessingdatamysql/MainController.java​

package com.example.accessingdatamysql;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller // This means that this class is a Controller
@RequestMapping(path="/demo") // This means URL's start with /demo (after Application path)
public class MainController {
@Autowired // This means to get the bean called userRepository
// Which is auto-generated by Spring, we will use it to handle the data
private UserRepository userRepository;

@PostMapping(path="/add") // Map ONLY POST Requests
public @ResponseBody String addNewUser (@RequestParam String name
, @RequestParam String email) {
// @ResponseBody means the returned String is the response, not a view name
// @RequestParam means it is a parameter from the GET or POST request

User n = new User();
n.setName(name);
n.setEmail(email);
userRepository.save(n);
return "Saved";
}

@GetMapping(path="/all")
public @ResponseBody Iterable<User> getAllUsers() {
// This returns a JSON or XML with the users
return userRepository.findAll();
}
}


前面的示例显式指定了两个终结点的 and。默认情况下,映射所有 HTTP 操作。​​POST​​​​GET​​​​@RequestMapping​

创建应用程序类

Spring Initializr 为应用程序创建了一个简单的类。下面的清单显示了 Initializr 为此示例创建的类(在 中):​​src/main/java/com/example/accessingdatamysql/AccessingDataMysqlApplication.java​

package com.example.accessingdatamysql;

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

@SpringBootApplication
public class AccessingDataMysqlApplication {

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

}

对于此示例,无需修改类。​​AccessingDataMysqlApplication​

​@SpringBootApplication​​是一个方便的注释,它添加了以下所有内容:

  • ​@Configuration​​:将类标记为应用程序上下文的 Bean 定义源。
  • ​@EnableAutoConfiguration​​:告诉 Spring 引导根据类路径设置、其他 bean 和各种属性设置开始添加 bean。例如,如果 在类路径上,则此注释会将应用程序标记为 Web 应用程序并激活关键行为,例如设置 .spring-webmvcDispatcherServlet
  • ​@ComponentScan​​:告诉 Spring 在包中查找其他组件、配置和服务,让它找到控制器。com/example

该方法使用 Spring Boot 的方法启动应用程序。您是否注意到没有一行 XML?也没有文件。此 Web 应用程序是 100% 纯 Java,您无需处理配置任何管道或基础结构。​​main()​​​​SpringApplication.run()​​​​web.xml​

构建可执行的 JAR

您可以使用 Gradle 或 Maven 从命令行运行应用程序。您还可以构建一个包含所有必需依赖项、类和资源的可执行 JAR 文件并运行该文件。通过构建可执行 jar,可以轻松地在整个开发生命周期中跨不同环境等将服务作为应用程序进行交付、版本控制和部署。

如果使用 Gradle,则可以使用 .或者,您可以使用 JAR 文件生成 JAR 文件,然后运行该文件,如下所示:​​./gradlew bootRun​​​​./gradlew build​

java -jar build/libs/gs-accessing-data-mysql-0.1.0.jar

如果使用 Maven,则可以使用 运行应用程序。或者,您可以使用 JAR 文件生成 JAR 文件,然后运行该文件,如下所示:​​./mvnw spring-boot:run​​​​./mvnw clean package​

java -jar target/gs-accessing-data-mysql-0.1.0.jar

此处描述的步骤将创建一个可运行的 JAR。你也可以构建经典 WAR 文件.

运行应用程序时,将显示日志记录输出。该服务应在几秒钟内启动并运行。

测试应用程序

现在应用程序正在运行,您可以使用或一些类似的工具对其进行测试。您可以测试两个 HTTP 终结点:​​curl​

​GET localhost:8080/demo/all​​:获取所有数据。:向数据添加一个用户。​​POST localhost:8080/demo/add​

以下 curl 命令添加用户:

$ curl localhost:8080/demo/add -d name=First -d email=someemail@someemailprovider.com

答复应如下:

Saved

以下命令显示所有用户:

$ curl 'localhost:8080/demo/all'

答复应如下:

[{"id":1,"name":"First","email":"someemail@someemailprovider.com"}]

进行一些安全更改

在生产环境中时,可能会受到 SQL 注入。黑客可能会注入或任何其他破坏性的 SQL 命令。因此,作为安全实践,在向用户公开应用程序之前,应对数据库进行一些更改。​​DROP TABLE​

以下命令撤销与 Spring 应用程序关联的用户的所有权限:

mysql> revoke all on db_example.* from 'springuser'@'%';

现在,Spring 应用程序无法在数据库中执行任何操作。

应用程序必须具有一些权限,因此请使用以下命令授予应用程序所需的最低权限:

mysql> grant select, insert, delete, update on db_example.* to 'springuser'@'%';

删除所有权限并授予某些权限会为您的 Spring 应用程序提供仅更改数据库数据而不更改结构(模式)所需的权限。

当您要对数据库进行更改时:

  1. 重新授予权限。
  2. 将 更改为 。spring.jpa.hibernate.ddl-autoupdate
  3. 重新运行应用程序。

然后重复此处显示的两个命令,使应用程序可以安全地再次用于生产。更好的是,使用专用的迁移工具,例如Flyway或Liquibase。

总结

祝贺!您刚刚开发了一个绑定到 MySQL 数据库并准备投入生产的 Spring 应用程序!