一、背景
当我们使用Spring Boot创建Web应用时,通常需要一个数据库来存储应用程序的数据。这个时候,我们需要先手动创建一个数据库并初始化一些数据,这样才能保证应用程序数据的准确性和完整性。然而,对于大型系统和复杂的业务场景而言,手动维护数据库可能会非常繁琐,而且容易出错。因此,实现第一次启动时自动初始化数据库将会成为非常必要的一项功能。
二、实现步骤
- 创建一个初始化数据库的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');
- 在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:)下的相对路径或者绝对路径。
- 创建启动类
创建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脚本。
- 运行程序
最后,我们可以启动应用程序,并查看日志输出,看看自动初始化数据库是否成功。如果一切顺利,我们就能够看到“自动初始化数据库开始”和“自动初始化数据库结束”的日志输出,并且在数据库中可以看到初始化后的数据。
三、示例说明
接下来,我将介绍两个示例,分别是使用H2数据库和使用MySQL数据库。
- 使用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表中的所有记录,并输出结果。
如果自动初始化功能生效,我们就能够在控制台看到查询到的记录信息,否则程序将会抛出异常。
- 使用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技术站