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日

相关文章

  • [工具推荐]001.flippdf使用教程

    工具推荐:001.flippdf 001.flippdf是一款免费的在线PDF转换工具,可以将PDF文件转换为可翻页的HTML5格式,方便用户在网页上浏览和分享。本文将提供001.flippdf使用教程的完整攻略,包括以下步骤: 访问001.flippdf网站 上传PDF文件 转换PDF文件为HTML5格式 预览和分享HTML5格式文件 同时,本文将提供两个…

    other 2023年5月9日
    00
  • JavaScript类的继承多种实现方法

    JavaScript类的继承多种实现方法,主要包括原型链继承、构造函数继承、组合继承、寄生式继承、寄生组合式继承等方法。下面我将逐一讲解这几种继承方法。 1. 原型链继承 原型链继承是JavaScript中最基本的继承方法。通过将子类的原型指向父类的实例来实现继承。其实现方法如下: function Parent() { this.name = "…

    other 2023年6月27日
    00
  • Eclipse中查看android工程代码出现”android.jar has no source attachment”的解决方案

    在Eclipse中查看Android工程代码时,有时会出现“android.jar has no source attachment”的错误提示,这种情况通常是因为我们没有安装或链接android SDK,需要安装或更新相应版本的SDK并与Eclipse链接才能进行代码查看。 下面详细介绍“Eclipse中查看android工程代码出现”android.ja…

    other 2023年6月27日
    00
  • Python3.9环境搭建RobotFramework的详细过程

    Python3.9环境搭建Robot Framework的详细过程 以下是在Python3.9环境下搭建Robot Framework的详细步骤: 步骤1:安装Python3.9 首先,需要下载并安装Python3.9版本。可以从Python官方网站(https://www.python.org/downloads/)下载适合您操作系统的Python3.9安…

    other 2023年10月18日
    00
  • Oracle 查询表信息获取表字段及字段注释

    获取表字段及字段注释是在进行数据库开发时非常常见的需求,Oracle提供了一些SQL命令可以快速查询到表字段信息及注释。下面将详细讲解如何使用Oracle查询表信息获取表字段及字段注释的完整攻略。 1. 查询表字段信息 简介 查询表字段信息就是查询某个表的所有字段名、数据类型、长度等信息。 SQL命令 DESC table_name; 示例 假设有一个名为u…

    other 2023年6月25日
    00
  • Android开发实现ListView点击展开收起效果示例

    Android开发实现ListView点击展开收起效果示例攻略 在Android开发中,实现ListView点击展开收起效果是一个常见的需求。下面将详细介绍如何实现这一效果,并提供两个示例说明。 步骤一:准备工作 首先,在XML布局文件中定义ListView和需要展开收起的子项布局。例如: <ListView android:id=\"@+i…

    other 2023年8月26日
    00
  • C sharp #001# hello world

    C#是一种面向对象的编程语言,由微软公司开发。本文将详细讲解如何使用C#编写一个Hello World程序,并提供两个示例说明。 Hello World程序 Hello World程序是编程语言中最简单的程序,它的作用是输出“Hello World”这个字符串。下面是使用C#编写Hello World程序的步骤: 步骤1:创建一个新的C#控制台应用程序 在V…

    other 2023年5月5日
    00
  • Flutter有状态组件StatefulWidget生命周期详解

    下面详细讲解Flutter有状态组件StatefulWidget生命周期的完整攻略。 Flutter有状态组件StatefulWidget生命周期详解 什么是Flutter的生命周期 Flutter的生命周期是指Widget从创建到销毁的整个生命周期过程。在这个过程中,Flutter会自动调用相应的生命周期函数,以便开发者可以执行必要的操作。 Statele…

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