首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL脚本文件执行器

SQL脚本文件执行器

作者头像
朝雨忆轻尘
发布2019-06-19 15:51:49
9930
发布2019-06-19 15:51:49
举报
文章被收录于专栏:朝雨忆轻尘朝雨忆轻尘

处于项目需求,需要能够批量执行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/  版权所有,欢迎转载,转载请注明原文作者及出处。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-08-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档