處於項目需求,需要能夠批量執行SQL腳本文件,需要由前台頁面操作觸發執行。
查找相關資料,發現 Ant 提供了 SQLExec 組件可以支持SQL文件的執行,測試效果不錯。
以下是對 SQLExec 封裝后支持批量執行的執行器組件。
package com.ge.digital.spo.sql.execute.ant; import java.io.File; import org.apache.tools.ant.Project; import org.apache.tools.ant.taskdefs.SQLExec; import org.apache.tools.ant.types.EnumeratedAttribute; public class AntSqlRunner { public void runSqlScript() { String driverClass = "com.mysql.jdbc.Driver"; String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8"; String username = "root"; String password = "mysql"; String targetSqlFolder = "/home/ca6417/upload/RecoverySQL/"; // 存放SQL腳本的目錄 String logOutputFolder = "/home/ca6417/upload/RecoverySQL/"; // 執行結果輸出目錄,出錯的時候才會生成錯誤報告 runSqlScriptFiles(driverClass, url, username, password, targetSqlFolder, logOutputFolder); } public static void runSqlScriptFiles(String driverClass, String url, String username, String password, String targetSqlFolder, String logOutputFolder) { SQLExec sqlExec = new SQLExec(); sqlExec.setDriver(driverClass); sqlExec.setUrl(url); sqlExec.setUserid(username); sqlExec.setPassword(password); // 如果執行過程有語句出錯時如何處理,可以選擇繼續執行或停止. sqlExec.setOnerror((SQLExec.OnError) (EnumeratedAttribute.getInstance(SQLExec.OnError.class, "stop"))); sqlExec.setPrint(true); sqlExec.setProject(new Project()); String targetSqlFile = targetSqlFolder; if(!new File(targetSqlFolder).isDirectory()) { targetSqlFolder = new File(targetSqlFolder).getParentFile().getAbsolutePath(); } runSqlScript(sqlExec, targetSqlFile, targetSqlFolder, logOutputFolder); } private static void runSqlScript(SQLExec sqlExec, String targetFile, String targetSqlFolder, String logOutputFolder) { File file = new File(targetFile); if(file.isDirectory()) {
// 如果是目錄,遍歷執行所有腳本 for(File f :file.listFiles()) { String fileStr = f.getAbsolutePath(); runSqlScript(sqlExec, fileStr, file.getAbsolutePath(), logOutputFolder); } } else {
// 如果是腳本文件,執行SQL腳本 String targetSqlFile = targetFile; String logOutputFile = getLogOutputFile(logOutputFolder, targetSqlFolder, targetSqlFile); runSqlScriptFile(sqlExec, targetSqlFile, logOutputFile); } } private static void runSqlScriptFile(SQLExec sqlExec, String targetSqlFile, String logOutputFile) { sqlExec.setSrc(new File(targetSqlFile)); sqlExec.setOutput(new File(logOutputFile)); sqlExec.execute(); System.out.println(targetSqlFile + " execute success."); } private static String getLogOutputFile(String logOutputFolder, String targetSqlFolder, String targetSqlFile) { String logFileName = targetSqlFile.substring(0, targetSqlFile.indexOf(".")) + ".txt"; logFileName = logFileName.replace(targetSqlFolder, logOutputFolder); return logFileName; } }
作者:朝雨憶輕塵
出處:https://www.cnblogs.com/xifengxiaoma/
版權所有,歡迎轉載,轉載請注明原文作者及出處。
