package com.unmi.db;

import java.io.FileInputStream;

import java.io.InputStream;

import java.sql.Connection;

import java.sql.Statement;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

/**

* 读取 SQL 脚本并执行

*

@author Unmi

*/

public class SqlFileExecutor {

/**

* 读取 SQL 文件,获取 SQL 语句

* @param sqlFile SQL 脚本文件

*

@return List 返回所有 SQL 语句的 List

*

@throws Exception

*/

private List loadSql(String sqlFile) throws Exception {

List sqlList = new ArrayList();

try {

InputStream sqlFileIn = new FileInputStream(sqlFile);

StringBuffer sqlSb = new StringBuffer();

byte[] buff = new byte[1024];

int byteRead = 0;

while ((byteRead = sqlFileIn.read(buff)) != -1) {

sqlSb.append(new String(buff, 0, byteRead));

}

// Windows 下换行是 \r\n, Linux 下是 \n

String[] sqlArr = sqlSb.toString().split("(;\\s*\\r\\n)|(;\\s*\\n)");

for (int i = 0; i < sqlArr.length; i++) {

String sql = sqlArr[i].replaceAll("--.*", "").trim();

if (!sql.equals("")) {

sqlList.add(sql);

}

}

return sqlList;

} catch (Exception ex) {

throw new Exception(ex.getMessage());

}

}

/**

* 传入连接来执行 SQL 脚本文件,这样可与其外的数据库操作同处一个事物中

* @param conn 传入数据库连接

* @param sqlFile SQL 脚本文件

*

@throws Exception

*/

public void execute(Connection conn, String sqlFile) throws Exception {

Statement stmt = null;

List sqlList = loadSql(sqlFile);

stmt = conn.createStatement();

for (String sql : sqlList) {

stmt.addBatch(sql);

}

int[] rows = stmt.executeBatch();

System.out.println("Row count:" + Arrays.toString(rows));

}

/**

* 自建连接,独立事物中执行 SQL 文件

* @param sqlFile SQL 脚本文件

*

@throws Exception

*/

public void execute(String sqlFile) throws Exception {

Connection conn = DBCenter.getConnection();

Statement stmt = null;

List sqlList = loadSql(sqlFile);

try {

conn.setAutoCommit(false);

stmt = conn.createStatement();

for (String sql : sqlList) {

stmt.addBatch(sql);

}

int[] rows = stmt.executeBatch();

System.out.println("Row count:" + Arrays.toString(rows));

DBCenter.commit(conn);

} catch (Exception ex) {

DBCenter.rollback(conn);

throw ex;

} finally {

DBCenter.close(null, stmt, conn);

}

}

public static void main(String[] args) throws Exception {

List sqlList = new SqlFileExecutor().loadSql(args[0]);

System.out.println("size:" + sqlList.size());

for (String sql : sqlList) {

System.out.println(sql);

}

}

}

java sql脚本_java执行sql脚本相关推荐

  1. java sql脚本_Java 执行 SQL 脚本文件

    是拷贝的别人的,以备学习 package com.unmi.db; import java.io.FileInputStream; import java.io.InputStream; import ...

  2. java 查询sql语句_java执行SQL语句实现查询的通用方法详解

    完成sql查询 并将查询结果放入vector容器,以便其他程序使用 /* * 执行sql查询语句 */ public static vector executequery(class clazz, s ...

  3. java调用shell脚本_Java 执行Shell脚本指令

    一.介绍 有时候我们在Linux中运行Java程序时,需要调用一些Shell命令和脚本.而Runtime.getRuntime().exec()方法给我们提供了这个功能,而且Runtime.getRu ...

  4. Java 使用execute方法执行Sql语句

    Java 使用execute方法执行Sql语句. mysql.ini是一个配置文件.配置内容可以看上一篇. class ExecuteSql {     private String driver; ...

  5. sql无效字符 执行sql语句报错解决方案

    sql无效字符 执行sql语句报错解决方案 参考文章: (1)sql无效字符 执行sql语句报错解决方案 (2)https://www.cnblogs.com/feifeicui/p/8907851. ...

  6. java调用MySQL脚本_Java调用SQL脚本执行常用的方法示例

    前言 大家都知道,在Java中调用SQL脚本的方式有多种,在这里只记录一种自己常用的方式,个人觉得挺实用方便的. 运用ScriptRunner这个类. ScriptRunner类用于执行SQL语句,例 ...

  7. Java使用数据库命令执行sql脚本(Windows版)

            传统使用Java ScrptRunner类执行sql脚本时会有很多语法限制,程序只能最简单的sql语句,该功能并不适用于实际应用场景:因此可以改变思路,使用Java直接执行Dos命令的 ...

  8. java直接调用并执行sql脚本

    1.背景:项目本身功能简单,不想使用开源框架引入过多不需要的依赖,避免程序部署时,人工忘记执行sql脚本文件问题 2.此demo为使用mybatis中脚本执行工具类org.apache.ibatis. ...

  9. beeline执行sql语句_beeline执行sql脚本交易

    beeline执行sql脚本交易 发布时间:2020-04-20 来源:脚本之家 点击: 用VisualBasic编制这类程序时,由于VB自身没有这种切换功能,因此需要利用第三方控件或调用Window ...

最新文章

  1. C语言指针总结大学霸IT达人
  2. Redhat7.4安装Oracle11g详细步骤
  3. 【小项目关键技术七】MPU6050
  4. 伯克利计算机科学录取率,Berkeley的CS「加州大学伯克利分校计算机科学系」
  5. Python lambda函数
  6. python零基础能学吗-Python编程语言好学吗?零基础转行能学Python吗?
  7. Apache+Php+Mysql配置
  8. javascript篇:策略模式验证表单
  9. 在家如何下载nature中的文献
  10. 中级软件测试工程师是什么水平,中级软件测试工程师需要满足的基本评定条件...
  11. openstack rabbitmq报错导致识别不到计算节点 解决方案
  12. 纯CSS3实现360度旋转特效
  13. 什么是顶级域名、根域/二级域名、一级域名/子域名
  14. JavaWeb学习总结(五十一)——邮件的发送与接收原理
  15. 通过浏览器响应实现excel导出
  16. MVC框架简易留言板实例
  17. bedtools指南
  18. 用Python分析微博股市热度和A股走势的关联
  19. 嵌入式领域的职业发展方向是什么?
  20. error LNK2038: 检测到“RuntimeLibrary”的不匹配项 解决方法

热门文章

  1. CVPR2021|用于立体匹配的可学习双边网格
  2. 聊聊学历那点事----学历重要还是能力重要?
  3. 华为M6平板在录屏的时候报错SIGABRT
  4. oracle逗号隔开行转列_Oracle行转列函数
  5. java 生成 dll_java类封装成dll
  6. java基础学习_IO流03_字符流、IO流小结、案例_day21总结
  7. PyQt5_基础控件使用
  8. Oracle11g安装详细步骤(图文教程)
  9. 性能测试岗位常见面试题答案
  10. 跟谁学定增融资:拟加大高途课堂投入,因存在违规被监管要求整改