spring+mybatis執行SQL指令碼檔案
阿新 • • 發佈:2021-01-21
spring+mybatis執行SQL指令碼檔案
使用ScriptRunner技術執行SQL指令碼檔案,比原生JDBC執行SQL的有點有如下:
1、程式碼更加簡潔
2、有效的記錄了執行SQL的日誌及錯誤日誌
程式碼如下:
package com.lylp.common.update;
import org.apache.commons.codec.Charsets;
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.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.sql.Connection;
/**
* mybatis執行SQL指令碼
*/
@Component
public class UpdateSqlService {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private DataSource dataSource;
/**
* 使用ScriptRunner執行SQL指令碼
*/
public void doExecuteSql() {
//通過資料來源獲取資料庫連結
Connection connection = DataSourceUtils.getConnection(dataSource);
//建立指令碼執行器
ScriptRunner scriptRunner = new ScriptRunner(connection);
//建立字元輸出流,用於記錄SQL執行日誌
StringWriter writer = new StringWriter();
PrintWriter print = new PrintWriter(writer);
//設定執行器日誌輸出
scriptRunner.setLogWriter(print);
//設定執行器錯誤日誌輸出
scriptRunner.setErrorLogWriter(print);
//設定讀取檔案格式
Resources.setCharset(Charsets.UTF_8);
String[] filePaths = {"sql/update1.sql", "sql/update2.sql"};
for (String path : filePaths) {
Reader reader = null;
try {
//獲取資原始檔的字元輸入流
reader = Resources.getResourceAsReader(path);
} catch (IOException e) {
//檔案流獲取失敗,關閉連結
logger.error(e.getMessage(), e);
scriptRunner.closeConnection();
return;
}
//執行SQL指令碼
scriptRunner.runScript(reader);
//關閉檔案輸入流
try {
reader.close();
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
}
//輸出SQL執行日誌
logger.debug(writer.toString());
//關閉輸入流
scriptRunner.closeConnection();
}
}
SQL指令碼放在resources檔案下,如下圖: