springboot启动时执行脚本配置使用参见:https://blog.csdn.net/hyf576501135/article/details/121768985
在用Eclipse或者IDE工具启动的时候,脚本正常执行并且没有出现中文乱码;但是在打包发布后,发现正常执行,但是出现了中文乱码,然后百度了一下,基本上全部都是让在配置文件里面增加配置spring.datasource.sql-script-encoding=utf-8,然后清一色的写的是使用springboot自带的方式进行启动的。但是使用代码的方式灵活启动没有写怎么搞…找资料没法了,就只能跟代码
看代码,其实最终是给DataSourceInitializer设置了DatabasePopulator这个类,先看DataSourceInitializer类的关键代码
public class DataSourceInitializer implements InitializingBean, DisposableBean {
......
@Override
public void afterPropertiesSet() {
execute(this.databasePopulator);
}
@Override
public void destroy() {
execute(this.databaseCleaner);
}
private void execute(@Nullable DatabasePopulator populator) {
Assert.state(this.dataSource != null, "DataSource must be set");
if (this.enabled && populator != null) {
DatabasePopulatorUtils.execute(populator, this.dataSource);
}
}
}
第一步:执行execute,由工具类继续执行
public abstract class DatabasePopulatorUtils {
public static void execute(DatabasePopulator populator, DataSource dataSource) throws DataAccessException {
Assert.notNull(populator, "DatabasePopulator must not be null");
Assert.notNull(dataSource, "DataSource must not be null");
try {
Connection connection = DataSourceUtils.getConnection(dataSource);
try {
populator.populate(connection);
}
finally {
DataSourceUtils.releaseConnection(connection, dataSource);
}
}
catch (scriptException ex) {
throw ex;
}
catch (Throwable ex) {
throw new UncategorizedscriptException("Failed to execute database script", ex);
}
}
}
第二步:由ResourceDatabasePopulator自身执行populate方法
@Override
public void populate(Connection connection) throws scriptException {
Assert.notNull(connection, "'connection' must not be null");
for (Resource script : this.scripts) {
EncodedResource encodedscript = new EncodedResource(script, this.sqlscriptEncoding);
scriptUtils.executeSqlscript(connection, encodedscript, this.continueOnError, this.ignoreFailedDrops,
this.commentPrefixes, this.separator, this.blockCommentStartDelimiter, this.blockCommentEndDelimiter);
}
}
看到把传入的resource进行包装,并且指定了sqlscriptEncoding的编码格式,因此只需要设置ResourceDatabasePopulator这个实例的这个编码参数即可。修改后获取DatabasePopulator方法:
private DatabasePopulator databasePopulator(boolean hasShema) throws IOException {
ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
//设置文件编码参数
populator.setSqlscriptEncoding("utf-8");
ResourcePatternResolver resolver = ResourcePatternUtils.getResourcePatternResolver(null);;
Resource[] resources = null;
if (!hasShema) {
resources = resolver.getResources("classpath:/" + sqlscriptSchema + "/*");
for (Resource resource : resources) {
populator.addscript(resource);
}
}
resources = resolver.getResources("classpath:/" + sqlscriptData + "/*");
for (Resource resource : resources) {
populator.addscript(resource);
}
resources = resolver.getResources("classpath:/" + sqlscriptProcedure + "/*");
for (Resource resource : resources) {
populator.addscript(resource);
}
return populator;
}



