import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.jdbc.ScriptRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.stereotype.Component;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
import java.sql.Connection;
import java.sql.SQLException;
/**
* @author lidg
* @date 2022/6/28
* @desc
*/
@Component
@Order(value = 1)
public class SysMgrSlqScriptRunner implements ApplicationRunner {
private static final Logger logger = LoggerFactory.getLogger(SysMgrSlqScriptRunner.class);
@Autowired
private DataSource dataSource;
@Override
public void run(ApplicationArguments args) throws Exception {
String scriptPath = "db/ca.sql";
execSqlScript(dataSource, scriptPath);
}
}
/**
* 脚本执行
*
* @param dataSource 数据源
* @param sqlFilePath 脚本路径
*
* @throws IOException
*/
public static void execSqlScript(DataSource dataSource, String sqlFilePath) throws IOException {
// 通过数据源获取数据库连接
Connection connection = DataSourceUtils.getConnection(dataSource);
// 创建脚本执行器
ScriptRunner scriptRunner = new ScriptRunner(connection);
// 设置执行器日志输出
StringWriter writer = new StringWriter();
PrintWriter printWriter = new PrintWriter(writer);
scriptRunner.setLogWriter(printWriter);
// 设置执行器错误日志输出
StringWriter errorWriter = new StringWriter();
PrintWriter errorPrintWriter = new PrintWriter(errorWriter);
scriptRunner.setErrorLogWriter(errorPrintWriter);
// 设置读取资源文件的字符集
Resources.setCharset(StandardCharsets.UTF_8);
try (Reader reader = Resources.getResourceAsReader(sqlFilePath)) {
scriptRunner.runScript(reader);
} finally {
try {
connection.close();
} catch (SQLException e) {
logger.error("to close the connection of database is failure", e);
}
if (StringUtils.isNotEmpty(writer.toString())) {
logger.info(writer.toString());
}
if (StringUtils.isNotEmpty(errorWriter.toString())) {
logger.error(errorWriter.toString());
}
}
}
}
springboot 容器加载完成后执行sql脚本
最新推荐文章于 2023-04-04 17:19:02 发布