1. 程式人生 > 其它 >spring+mybatis執行SQL指令碼檔案

spring+mybatis執行SQL指令碼檔案

技術標籤:MyBatisSQL指令碼

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檔案下,如下圖:
在這裡插入圖片描述