处于项目需求,需要能够批量执行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(, targetSqlFile.indexOf(".")) + ".txt";
logFileName = logFileName.replace(targetSqlFolder, logOutputFolder);
return logFileName;
}
}

作者:朝雨忆轻尘
出处:https://www.cnblogs.com/xifengxiaoma/
版权所有,欢迎转载,转载请注明原文作者及出处。

SQL脚本文件执行器的更多相关文章

  1. CUBRID学习笔记 28 执行sql脚本文件

    一下命令在csql下执行. insert_commands.sql为sql脚本文件 ;CL ;READ insert_commands.sql ;RU 第一行的cl 清空命令缓存,等同clear第二行 ...

  2. Java 执行 SQL 脚本文件

    转自:http://blog.csdn.net/hongmin118/article/details/4588941 package com.unmi.db; import java.io.FileI ...

  3. 如何执行一个mysql的sql脚本文件

    sql脚本是包含一到多个sql命令的sql语句,我们可以将这些sql脚本放在一个文本文件中(我们称之为“sql脚本文件”),然后通过相关的命令执行这个sql脚本文件.基本步骤如下:一.创建包含sql命 ...

  4. mysql执行sql脚本文件

    mysql执行sql脚本文件 方法一:使用cmd命令执行(windows下,unix或Linux在的其控制台下) [MySQL的bin目录]\mysql –u用户名 –p密码 –D数据库<[sq ...

  5. [转]SQL server2008 导入超大SQL脚本文件(超过10M)

    同事给我一个sqlserver的学习库,sql脚本导出有300m,gui执行有内存溢出的错误报出来,所以问了一下度娘,学而时习之:) 1. SQL server2008 导入超大SQL脚本文件(超过1 ...

  6. MySQL控制台执行.sql脚本文件

    用notepad++编写好一个.sql脚本文件: drop database if exists library; create database library default character ...

  7. 使用命令执行 sql 脚本文件

    使用命令执行 sql 脚本文件 方法: 在 Windows 下使用 cmd 命令执行(或 Unix 或 Linux 控制台下)[Mysql的bin目录]\mysql –u用户名 –p密码 –D数据库名 ...

  8. mysql中如何在命令行中,执行一个SQL脚本文件?

    需求描述: 在mysql数据库的使用中,有的时候,需要直接在shell的命令行中,执行某个SQL脚本文件, 比如,要初始化数据库,创建特定的存储过程,创建表等操作,这里进行一个基本的测试. 一般情况, ...

  9. Oracle使用超大SQL脚本文件恢复数据问题记录

    在以前获取的Oracle数据库备份一般都是dmp文件,创建表空间和用户就直接使用imp或者impdp导入即可. 这一次遇到的情况比较特殊,对方提供数据时给我的是使用SQLPlus导出的SQL脚本文件, ...

随机推荐

  1. (有点递归的感觉)RGCDQ--hdu--5317

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5317 感觉好神奇呀,一堆数在一起可以找到规律,学长讲完后,觉得自己是如此的so young f[x] ...

  2. (网络流) Island Transport --Hdu -- 4280

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=4280 源点是West, 汇点是East, 用Dinic带入求就好了 代码:要用c++提交 #pragma ...

  3. wxpython 图像编程

    转: http://wxhowto.googlecode.com/svn-history/r6/trunk/body/ch10.tex 的 HTML 档. 使用图像编程 这一章来了解一下我们可以使用图 ...

  4. MRP备忘

    mrp自动发放计划 物料:采购员 计划员 自动发放时间栏 提前期 mrp:product profile PO:profile自动生成请求 Auto-Release Planned Orders In ...

  5. [翻译] Using Custom Functions in a Report 在报表中使用自己义函数

    Using Custom Functions in a Report  在报表中使用自己义函数   FastReport has a large number of built-in standard ...

  6. 微软DevOps软件开发高级培训课程(深圳站) 2016.04.06

    深圳特区云集了国内众多大型IT企业,作为北上广深的一线城市,当之无愧! 我们在深圳同方信息港的微软办公室是举行培训,60人的培训教室,生生被挤满了80人,过道都被全部占用了.可惜由于换了电脑,把照片搞 ...

  7. javascript 对象克隆

    浅克隆 先看代码: /** * 浅克隆 克隆传入对象,只克隆一层 * @param {any} source */ function shallowClone(source) { var tiaget ...

  8. From Alpha to Gamma (I)

    What we think of as conventional alpha-blending is basically wrong. --Tom Forsyth 前段时间在Amazon上淘的三本二手 ...

  9. 【cocos2d-x 仙凡奇缘-网游研发(2) 角色换线系统】

    转载请注明出处:http://www.cnblogs.com/zisou/p/xianfan01.html 做一款游戏就先得制作好策划文档,和基本的人物世界构架的设计,然后架空在这样一个虚拟的世界中每 ...

  10. 769. Max Chunks To Make Sorted

    Given an array arr that is a permutation of [0, 1, ..., arr.length - 1], we split the array into som ...