原文: http://zetcode.com/springboot/mysql/

Spring Boot MySQL 教程展示了如何在 Spring Boot 应用中使用 MySQL 数据库。

Spring 是用于创建企业应用的流行 Java 应用框架。 Spring Boot 是 Spring 框架的演进,可帮助您轻松创建独立的,生产级的基于 Spring 的应用。

MySQL

MySQL 是领先的开源数据库管理系统。 它是一个多用户,多线程的数据库管理系统。 MySQL 在网络上特别流行。 它是非常流行的 LAMP 平台的一部分,该平台包括 Linux,Apache,MySQL 和 PHP。 MySQL 数据库在最重要的 OS 平台上可用。 它可以在 BSD Unix,Linux,Windows 和 Mac 上运行。

MySQL 设置

我们将展示如何在 Debian Linux 系统上安装 MySQL 数据库。

  1. $ sudo apt-get install mysql-server

此命令将安装 MySQL 服务器和相关包。

  1. $ sudo service mysql start
  2. $ sudo service mysql stop

这两个命令用于启动和停止 MySQL。

  1. $ sudo service mysql status

我们使用service mysql status命令检查数据库的状态。

  1. $ mysql -u root -p

现在我们需要重置根密码。 我们启动 mysql 命令行工具。 (服务器必须正在运行。)我们以root用户身份连接。

  1. mysql> SET PASSWORD = PASSWORD('newpassowrd');

我们为root设置了新密码。

  1. $ mysql_secure_installation

我们可以使用mysql_secure_installation来提高 MySQL 服务器的安全性。 我们可以选择改进 MySQL 的root密码,删除匿名用户帐户,禁用 localhost 外部的root登录以及删除测试数据库。

  1. mysql> CREATE DATABASE testdb;

我们创建一个新的testdb数据库。

  1. mysql> CREATE USER user12@localhost IDENTIFIED BY 's$cret';
  2. mysql> GRANT ALL ON testdb.* TO user12@localhost;

我们创建一个新的 MySQL 用户并将其特权授予testdb数据库。

创建 MySQL 表

现在,我们将创建一个名为cities的新 MySQL 表。

cities_mysql.sql

  1. DROP TABLE IF EXISTS cities;
  2. CREATE TABLE cities(id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255),
  3. population INT);
  4. INSERT INTO cities(name, population) VALUES('Bratislava', 432000);
  5. INSERT INTO cities(name, population) VALUES('Budapest', 1759000);
  6. INSERT INTO cities(name, population) VALUES('Prague', 1280000);
  7. INSERT INTO cities(name, population) VALUES('Warsaw', 1748000);
  8. INSERT INTO cities(name, population) VALUES('Los Angeles', 3971000);
  9. INSERT INTO cities(name, population) VALUES('New York', 8550000);
  10. INSERT INTO cities(name, population) VALUES('Edinburgh', 464000);
  11. INSERT INTO cities(name, population) VALUES('Berlin', 3671000);

这是用于创建cities表的 SQL。

  1. mysql> use testdb;
  2. mysql> source cities_mysql.sql

使用source命令,执行 SQL 语句。

Spring Boot MySQL 示例

以下应用是一个简单的 Spring Boot Web 应用,它使用 MySQL 数据库。 我们有一个主页,带有一个链接,用于显示数据库表中的数据。 我们使用 Freemarker 模板系统将数据与 HTML 连接。

  1. pom.xml
  2. src
  3. └── main
  4. ├── java
  5. └── com
  6. └── zetcode
  7. ├── Application.java
  8. ├── model
  9. └── City.java
  10. ├── controller
  11. └── MyController.java
  12. ├── repository
  13. └── CityRepository.java
  14. └── service
  15. ├── CityService.java
  16. └── ICityService.java
  17. └── resources
  18. ├── application.properties
  19. ├── static
  20. └── index.html
  21. └── templates
  22. └── showCities.ftl

这是项目结构。

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  5. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  6. <modelVersion>4.0.0</modelVersion>
  7. <groupId>com.zetcode</groupId>
  8. <artifactId>springbootmysqlex</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10. <packaging>jar</packaging>
  11. <properties>
  12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13. <maven.compiler.source>11</maven.compiler.source>
  14. <maven.compiler.target>11</maven.compiler.target>
  15. </properties>
  16. <parent>
  17. <groupId>org.springframework.boot</groupId>
  18. <artifactId>spring-boot-starter-parent</artifactId>
  19. <version>2.1.1.RELEASE</version>
  20. </parent>
  21. <dependencies>
  22. <dependency>
  23. <groupId>org.springframework.boot</groupId>
  24. <artifactId>spring-boot-starter-web</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>mysql</groupId>
  28. <artifactId>mysql-connector-java</artifactId>
  29. <scope>runtime</scope>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.springframework.boot</groupId>
  33. <artifactId>spring-boot-starter-freemarker</artifactId>
  34. </dependency>
  35. <dependency>
  36. <groupId>org.springframework.boot</groupId>
  37. <artifactId>spring-boot-starter-data-jpa</artifactId>
  38. </dependency>
  39. </dependencies>
  40. <build>
  41. <plugins>
  42. <plugin>
  43. <groupId>org.springframework.boot</groupId>
  44. <artifactId>spring-boot-maven-plugin</artifactId>
  45. </plugin>
  46. </plugins>
  47. </build>
  48. </project>

Spring Boot 启动器是一组方便的依赖项描述符,可以极大地简化 Maven 配置。 spring-boot-starter-parent具有 Spring Boot 应用的一些常用配置。 spring-boot-starter-web是使用 Spring MVC 构建 Web(包括 RESTful)应用的入门工具。 spring-boot-starter-freemarker是使用 Freemarker 视图构建 MVC Web 应用的入门工具。 spring-boot-starter-data-jpa是将 Spring Data JPA 与 Hibernate 结合使用的入门工具。

mysql-connector-java依赖项是针对 MySQL 数据库驱动程序的。

spring-boot-maven-plugin在 Maven 中提供了 Spring Boot 支持,使我们可以打包可执行的 JAR 或 WAR 档案。 它的spring-boot:run目标运行 Spring Boot 应用。

resources/application.properties

  1. spring.main.banner-mode=off
  2. logging.level.org.springframework=ERROR
  3. spring.datasource.url=jdbc:mysql://localhost:3306/testdb?useSSL=false
  4. spring.datasource.username=user12
  5. spring.datasource.password=s$cret

application.properties文件中,我们编写了 Spring Boot 应用的各种配置设置。 使用spring.main.banner-mode属性,我们可以关闭 Spring 横幅。 使用logging.level.org.springframework,我们将 spring 框架的日志记录级别设置为ERROR。 在 spring 数据源属性中,我们设置了 MySQL 数据源。

com/zetcode/model/City.java

  1. package com.zetcode.model;
  2. import java.util.Objects;
  3. import javax.persistence.Entity;
  4. import javax.persistence.GeneratedValue;
  5. import javax.persistence.GenerationType;
  6. import javax.persistence.Id;
  7. import javax.persistence.Table;
  8. @Entity
  9. @Table(name = "cities")
  10. public class City {
  11. @Id
  12. @GeneratedValue(strategy = GenerationType.AUTO)
  13. private Long id;
  14. private String name;
  15. private int population;
  16. public City() {
  17. }
  18. public City(Long id, String name, int population) {
  19. this.id = id;
  20. this.name = name;
  21. this.population = population;
  22. }
  23. public Long getId() {
  24. return id;
  25. }
  26. public void setId(Long id) {
  27. this.id = id;
  28. }
  29. public String getName() {
  30. return name;
  31. }
  32. public void setName(String name) {
  33. this.name = name;
  34. }
  35. public int getPopulation() {
  36. return population;
  37. }
  38. public void setPopulation(int population) {
  39. this.population = population;
  40. }
  41. @Override
  42. public int hashCode() {
  43. int hash = 7;
  44. hash = 79 * hash + Objects.hashCode(this.id);
  45. hash = 79 * hash + Objects.hashCode(this.name);
  46. hash = 79 * hash + this.population;
  47. return hash;
  48. }
  49. @Override
  50. public boolean equals(Object obj) {
  51. if (this == obj) {
  52. return true;
  53. }
  54. if (obj == null) {
  55. return false;
  56. }
  57. if (getClass() != obj.getClass()) {
  58. return false;
  59. }
  60. final City other = (City) obj;
  61. if (this.population != other.population) {
  62. return false;
  63. }
  64. if (!Objects.equals(this.name, other.name)) {
  65. return false;
  66. }
  67. return Objects.equals(this.id, other.id);
  68. }
  69. @Override
  70. public String toString() {
  71. final StringBuilder sb = new StringBuilder("City{");
  72. sb.append("id=").append(id);
  73. sb.append(", name='").append(name).append('\'');
  74. sb.append(", population=").append(population);
  75. sb.append('}');
  76. return sb.toString();
  77. }
  78. }

这是City实体。 每个实体必须至少定义两个注解:@Entity@Id

  1. @Entity
  2. @Table(name = "cities")
  3. public class City {

@Entity注解指定该类是一个实体,并映射到数据库表,而@Table注解指定要用于映射的数据库表的名称。

  1. @Id
  2. @GeneratedValue(strategy = GenerationType.AUTO)
  3. private Long id;

实体的主键由@Id注解指定。 @GeneratedValue提供了一种用于生成主键值的策略。

com/zetcode/CityRepository.java

  1. package com.zetcode.repository;
  2. import com.zetcode.model.City;
  3. import org.springframework.data.repository.CrudRepository;
  4. import org.springframework.stereotype.Repository;
  5. @Repository
  6. public interface CityRepository extends CrudRepository<City, Long> {
  7. }

通过从 Spring CrudRepository扩展,我们将为我们的数据存储库实现一些方法,包括findAll()。 这样,我们节省了大量样板代码。

com/zetcode/service/ICityService.java

  1. package com.zetcode.service;
  2. import com.zetcode.model.City;
  3. import java.util.List;
  4. public interface ICityService {
  5. List<City> findAll();
  6. }

ICityService提供findAll()契约方法声明,以从数据源获取所有城市。

com/zetcode/service/CityService.java

  1. package com.zetcode.service;
  2. import com.zetcode.model.City;
  3. import com.zetcode.repository.CityRepository;
  4. import java.util.List;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Service;
  7. @Service
  8. public class CityService implements ICityService {
  9. @Autowired
  10. private CityRepository repository;
  11. @Override
  12. public List<City> findAll() {
  13. return (List<City>) repository.findAll();
  14. }
  15. }

CityService包含findAll()方法的实现。 我们使用存储库从数据库检索数据。

  1. @Autowired
  2. private CityRepository repository;

注入CityRepository

  1. return (List<City>) repository.findAll();

存储库的findAll()方法返回城市列表。

com/zetcode/MyController.java

  1. package com.zetcode.controller;
  2. import com.zetcode.model.City;
  3. import com.zetcode.service.ICityService;
  4. import java.util.List;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Controller;
  7. import org.springframework.ui.Model;
  8. import org.springframework.web.bind.annotation.GetMapping;
  9. @Controller
  10. public class MyController {
  11. @Autowired
  12. private ICityService cityService;
  13. @GetMapping("/showCities")
  14. public String findCities(Model model) {
  15. var cities = (List<City>) cityService.findAll();
  16. model.addAttribute("cities", cities);
  17. return "showCities";
  18. }
  19. }

MyController类用@Controller注解。

  1. @Autowired
  2. private ICityService cityService;

我们将ICityService注入countryService字段。

  1. @GetMapping("/showCities")
  2. public String findCities(Model model) {
  3. var cities = (List<City>) cityService.findAll();
  4. model.addAttribute("cities", cities);
  5. return "showCities";
  6. }

我们将带有/showCities路径的请求映射到控制器的findCities()方法。 @GetMapping注解将 GET 请求映射到该方法。 该模型将获取城市列表,并将处理过程发送到showCities.ftl Freemarker 模板文件。

resources/templates/showCities.ftl

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Cities</title>
  5. <meta charset="UTF-8">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. </head>
  8. <body>
  9. <h2>List of cities</h2>
  10. <table>
  11. <tr>
  12. <th>Id</th>
  13. <th>Name</th>
  14. <th>Population</th>
  15. </tr>
  16. <#list cities as city>
  17. <tr>
  18. <td>${city.id}</td>
  19. <td>${city.name}</td>
  20. <td>${city.population}</td>
  21. </tr>
  22. </#list>
  23. </table>
  24. </body>
  25. </html>

showCities.ftl模板文件中,我们在 HTML 表中显示数据。

resources/static/index.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Home page</title>
  5. <meta charset="UTF-8"/>
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
  7. </head>
  8. <body>
  9. <a href="showCities">Show cities</a>
  10. </body>
  11. </html>

index.html中有一个链接,显示所有城市。

com/zetcode/Application.java

  1. package com.zetcode;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class Application {
  6. public static void main(String[] args) {
  7. SpringApplication.run(Application.class, args);
  8. }
  9. }

Application设置 Spring Boot 应用。 @SpringBootApplication启用自动配置和组件扫描。

  1. $ mvn spring-boot:run

应用运行后,我们可以导航到localhost:8080

在本教程中,我们展示了如何在 Spring Boot 应用中使用 MySQL 数据库。 您可能也对相关教程感兴趣:

查找所有 Spring Boot 教程