那我们开始详细讲解“spring.datasource.schema配置详解”的完整攻略:
1. 前言
在Spring Boot中,我们常用的数据源配置是通过application.properties
或application.yml
文件中的spring.datasource
前缀来完成的,这种配置方式已经足够适用于绝大多数场景了。但是,在某些特殊情况下,我们需要更加细粒度的控制,比如:在启动应用时自动执行一些初始化SQL脚本,或者强制指定数据源的schema等等。在这些情况下,我们就需要使用spring.datasource.schema
属性来完成更加精细的配置。
2. 配置方式
spring.datasource.schema
属性有两种配置方式,一种是采用直接指定SQL文件的方式,另一种则是采用通过程序指定SQL语句的方式。
2.1 直接指定SQL文件
这种方式需要在spring.datasource.schema
属性后面跟上SQL文件的相对路径,例如:
spring.datasource.schema=classpath:sql/init.sql
上面的配置表示在启动应用时,会自动执行sql/init.sql
文件中的SQL脚本。
需要注意的是,如果SQL文件中有多条SQL语句的话,需要用;
进行分隔,否则只会执行第一条SQL语句。
此外,还可以通过spring.datasource.continue-on-error=true
属性来控制在执行SQL脚本时出现错误时是否继续执行。
2.2 通过程序指定SQL语句
这种方式需要自己编写一个实现org.springframework.jdbc.datasource.init.DataSourceInitializer
接口的初始化器,然后在@Configuration
注解标记的配置类中使用@Bean
注解将其注册为Spring Bean,例如:
@Configuration
public class DataSourceConfig {
@Bean
public DataSourceInitializer dataSourceInitializer(DataSource dataSource) {
ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
populator.addScript(new ClassPathResource("schema.sql"));
populator.setContinueOnError(true);
DataSourceInitializer initializer = new DataSourceInitializer();
initializer.setDataSource(dataSource);
initializer.setDatabasePopulator(populator);
return initializer;
}
}
上面的配置表示在启动应用时,会自动执行classpath:schema.sql
文件中的SQL语句,如果出现错误会继续执行。
需要注意的是,如果SQL文件中有多条SQL语句的话,需要用;
进行分隔,否则只会执行第一条SQL语句。
3. 示例
3.1 直接指定SQL文件
假设我们有一个名为user
的数据库,其中有一个名为user_info
的表,我们需要在改表上创建一个名为phone
的新列,可以通过以下步骤来完成:
- 在当前项目的资源目录下创建
schema.sql
文件,文件内容如下:
sql
ALTER TABLE `user_info` ADD COLUMN `phone` VARCHAR(20) DEFAULT NULL;
- 配置
application.yml
文件,添加如下内容:
yaml
spring.datasource.schema=classpath:schema.sql
此时,启动应用后,应该能在数据库中看到新建的phone
列。
3.2 通过程序指定SQL语句
假设我们有一个名为product
的数据库,其中有一个名为product_info
的表,我们需要在改表上创建一个名为price
的新列,并且同时添加一个触发器,可以通过以下步骤来完成:
- 在当前项目的资源目录下创建
schema.sql
文件,文件内容如下:
``sql
product_info
ALTER TABLEADD COLUMN
price` DECIMAL(10,2) DEFAULT NULL;
SHOW WARNINGS;
CREATE TRIGGER trg_update_price
BEFORE UPDATE ON product_info
FOR EACH ROW
BEGIN
SET NEW.price = NEW.price + 100;
END;
```
- 创建一个实现
org.springframework.jdbc.datasource.init.DataSourceInitializer
接口的初始化器,代码如下:
```java
@Configuration
public class DataSourceConfig {
@Bean
public DataSourceInitializer dataSourceInitializer(DataSource dataSource) {
ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
populator.addScript(new ClassPathResource("schema.sql"));
populator.setContinueOnError(true);
DataSourceInitializer initializer = new DataSourceInitializer();
initializer.setDataSource(dataSource);
initializer.setDatabasePopulator(populator);
return initializer;
}
}
```
此时,启动应用后,应该能在数据库中看到新建的price
列,并且在每次更新product_info
表时,price
列的值会自动加上100。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring.datasource.schema配置详解 - Python技术站