Spring Boot实现第一次启动时自动初始化数据库流程详解

一、背景

当我们使用Spring Boot创建Web应用时,通常需要一个数据库来存储应用程序的数据。这个时候,我们需要先手动创建一个数据库并初始化一些数据,这样才能保证应用程序数据的准确性和完整性。然而,对于大型系统和复杂的业务场景而言,手动维护数据库可能会非常繁琐,而且容易出错。因此,实现第一次启动时自动初始化数据库将会成为非常必要的一项功能。

二、实现步骤

  1. 创建一个初始化数据库的SQL脚本

首先,我们需要创建一个SQL脚本,用来初始化数据库表。在这个脚本中,我们可以定义表结构和插入默认数据。例如:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `email` varchar(100) DEFAULT NULL,
  `password` varchar(50) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `UK_EMAIL` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `user` (`name`, `email`, `password`) VALUES
('admin', 'admin@qq.com', '123456');
  1. 在resources目录下创建application.properties文件

在这个文件中,我们需要定义以下内容:

# 数据库连接相关属性
spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useSSL=false&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# 自动初始化数据库相关属性
spring.datasource.initialize=true
spring.datasource.schema=classpath:schema.sql

其中,spring.datasource.initialize=true表示开启自动初始化数据库的功能,spring.datasource.schema指定了用来初始化数据库的SQL脚本文件路径。这个路径可以是类路径(classpath:)下的相对路径或者绝对路径。

  1. 创建启动类

创建Spring Boot启动类,并在类上加上@EnableAutoConfiguration注解,这样就能够开启Spring Boot自动化配置功能。接着,在启动类中添加以下代码:

@SpringBootApplication
public class Application implements CommandLineRunner {

    @Autowired
    private DataSource dataSource;

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

    @Override
    public void run(String... args) throws Exception {
        System.out.println("======== 自动初始化数据库开始 ========");
        Resource initData = new ClassPathResource("data.sql");
        Connection connection = null;
        try {
            connection = dataSource.getConnection();
            ScriptUtils.executeSqlScript(connection, initData);
        } finally {
            if (connection != null) {
                connection.close();
            }
        }
        System.out.println("======== 自动初始化数据库结束 ========");
    }
}

在这个启动类中,我们实现了CommandLineRunner接口,这样就能够在应用程序启动时执行自定义代码。在run方法中,我们首先获取数据源dataSource,然后使用Spring JDBC提供的ScriptUtils.executeSqlScript方法执行SQL脚本。

  1. 运行程序

最后,我们可以启动应用程序,并查看日志输出,看看自动初始化数据库是否成功。如果一切顺利,我们就能够看到“自动初始化数据库开始”和“自动初始化数据库结束”的日志输出,并且在数据库中可以看到初始化后的数据。

三、示例说明

接下来,我将介绍两个示例,分别是使用H2数据库和使用MySQL数据库。

  1. 使用H2数据库进行自动初始化

H2是一种嵌入式数据库,非常适合用于快速开发和测试。下面我将介绍如何使用H2数据库实现自动初始化功能。

首先,我们需要在pom.xml中添加H2数据库的依赖:

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

接着,在application.properties文件中添加以下内容:

# 数据库连接相关属性
spring.datasource.url=jdbc:h2:mem:test
spring.datasource.username=sa
spring.datasource.password=

# 自动初始化数据库相关属性
spring.datasource.initialize=true
spring.datasource.schema=classpath:schema.sql

这个配置文件中,我们指定了使用H2嵌入式数据库,并开启了自动初始化功能。

接着,我们可以创建一个Java类来测试自动初始化功能是否可行:

@SpringBootTest
@RunWith(SpringRunner.class)
public class ApplicationTests {

    @Autowired
    private DataSource dataSource;

    @Test
    public void test() throws Exception {
        Connection connection = dataSource.getConnection();
        PreparedStatement statement = connection.prepareStatement("select * from user");
        ResultSet resultSet = statement.executeQuery();
        while (resultSet.next()) {
            System.out.println(resultSet.getLong("id") + "\t" + resultSet.getString("name") + "\t" + resultSet.getString("email") + "\t" + resultSet.getString("password"));
        }
    }
}

在这个测试类中,我们注入了数据源dataSource,然后查询user表中的所有记录,并输出结果。

如果自动初始化功能生效,我们就能够在控制台看到查询到的记录信息,否则程序将会抛出异常。

  1. 使用MySQL数据库进行自动初始化

跟在H2数据库中实现自动初始化类似,使用MySQL数据库也是非常简单的。我们只需要在application.properties文件中指定正确的数据库连接参数,然后修改SQL脚本中的表和数据定义即可。

例如,我们可以在application.properties文件中添加以下配置内容:

# 数据库连接相关属性
spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useSSL=false&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# 自动初始化数据库相关属性
spring.datasource.initialize=true
spring.datasource.schema=classpath:schema.sql

然后,在SQL脚本中定义如下内容:

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `email` varchar(100) DEFAULT NULL,
  `password` varchar(50) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `UK_EMAIL` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `user` (`name`, `email`, `password`) VALUES
('admin', 'admin@qq.com', '123456');

最后,我们可以运行项目,并查询user表中的所有记录。如果能够正常查询到数据,那么就说明自动初始化功能生效了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot实现第一次启动时自动初始化数据库流程详解 - Python技术站

(0)
上一篇 2023年6月20日
下一篇 2023年6月20日

相关文章

  • 解析C语言与C++的编译模型

    解析C语言与C++的编译模型 在解析C语言与C++的编译模型之前,我们需要了解一下什么是编译和链接。 编译:编译器将源代码转换为目标代码,以便计算机可以理解和执行它。 链接:链接器将目标代码和库链接在一起,以便生成可执行文件。 C语言的编译模型 C语言的编译模型分为四个步骤:预处理、编译、汇编和链接。 预处理:首先,编译器将代码中以”#”开头的头文件引入并替…

    other 2023年6月26日
    00
  • window下用taskkill杀死进程

    window下用taskkill杀死进程 在Windows系统下,有时候我们需要杀死某个进程来解决问题。Windows系统自带了用于杀死进程的命令行工具taskkill。本文将介绍如何使用taskkill命令杀死进程。 taskkill命令介绍 taskkill是Windows系统自带的命令行工具,用于杀死进程。taskkill命令的语法如下: taskki…

    其他 2023年3月28日
    00
  • 最新mysql 5.7.23安装配置图文教程

    最新MySQL 5.7.23安装配置图文教程 准备工作 在安装MySQL 5.7.23之前,我们需要进行一些准备工作。 确认操作系统版本,MySQL 5.7.23适用于Linux、Windows、Mac OS X等操作系统。 确认系统的硬件配置,MySQL 5.7.23需要一定的硬盘空间、内存和处理器资源。 下载MySQL 5.7.23,选择相应的操作系统和…

    other 2023年6月27日
    00
  • C 语言指针概念的详解

    C语言指针概念的详解 什么是指针? 在 C 语言中,指针是一个变量,其值为另一个变量的地址。声明指针时需要加“*”符号,例如: int *p; // 声明一个 int 类型的指针变量 在使用指针时,我们可以通过“*”符号来访问指针所指向的变量的值,例如: int x = 10; int *p = &x; // 指向 x 的指针 printf(&quo…

    other 2023年6月27日
    00
  • vue父组件异步传递props值,子组件接收不到解决方案

    对于”vue父组件异步传递props值,子组件接收不到”这种情况,解决方案主要有以下两种: 方法一:在子组件中使用$nextTick 如果父组件异步修改了props值导致子组件接收不到,可以在子组件中使用Vue的nextTick函数: // 父组件 <template> <child :propA="data"> …

    other 2023年6月26日
    00
  • C++ 虚函数及虚函数表详解

    C++虚函数详解 虚函数概念 虚函数是一个特殊的类成员函数,它可以在派生类中进行重写,并且在运行时动态决定调用哪个版本。虚函数可以实现运行时的多态性,是面向对象编程的重要特性。 在C++中,我们通常使用关键字 virtual 来声明一个虚函数,如下所示: class Shape { public: virtual void draw() { std::cou…

    other 2023年6月26日
    00
  • 制作动态链接库给opencv程序使用(使用QtCreator)

    下面是“制作动态链接库给opencv程序使用(使用QtCreator)”的完整攻略,包括创建Qt项目、编写代码、生成动态链接库和使用动态链接库等方面。 创建Qt项目 首先,需要创建一个Qt项目,用于编写动态链接库的代码。可以使用以下步骤创建Qt项目: 打开Qt Creator; 选择“新建项目”; 选择“库”; 选择“动态库”; 输入项目名称和路径; 点击“…

    other 2023年5月6日
    00
  • gvim文本编辑器配置及相关插件安装图文教程

    下面我将详细讲解“gvim文本编辑器配置及相关插件安装图文教程”的完整攻略。 1. 安装gvim文本编辑器 首先,需要下载并安装gvim文本编辑器。可以通过以下步骤来完成: 在官网或者软件下载网站上下载gvim安装文件(根据你的电脑操作系统选择对应的版本),如 gvim82.exe。 双击安装文件,按照提示逐步进行安装。默认安装即可。 安装完成后,双击 gv…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部