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. SQLite的Pragma语句
  2. 大数据技术下 分布式数据库何去何从?
  3. java parsedouble valueof_java String.valueOf() 方法的使用
  4. python基础 ---- 使用pyCharm 调试
  5. 天刀手游制作人亲笔详解制作思路
  6. 中文简体字-繁体字转换 WEB 服务(源代码)
  7. delphi 最全日期格式_DateUtils时间单元说明
  8. 基于 DirectShow 的播放器
  9. stackexchange.mysql_.net core使用redis基于StackExchange.Redis
  10. 使用phpStudyy运行tipask
  11. 【编程开发】 C与C++中的关于函数指针的强制类型转换与指针函数的关系
  12. mysql 语法手册_MySQL语法大全_自己整理的学习笔记
  13. 整理一下第一次参加华为大数据挑战赛自己的一些收获吧(正式赛篇阶段一)
  14. java前端开发简历_web前端工程师简历
  15. CSV导入到clickhouse
  16. 大厂面试预备篇——《两万字MySql基础总结》❤️建议收藏
  17. Koltin简明学习,also,takeIf,takeUnless
  18. win10无限重启服务器,win10系统更新kb4284835补丁失败无限重启的解决方法
  19. Elasticsearch APIs解析(一、API规范及约定)
  20. UE4-GamePlay-UPlayer

热门文章

  1. 【转载】用VScode刷LeetCode
  2. DevCloud会员权益升级!日常领码豆,轻松换好礼!
  3. 华硕灵耀3 Deluxe获得“创新设计奖” 但它值得买吗?
  4. linux系统命令pwd,linux系统下pwd命令用法详解
  5. 有道翻译API+Jackson+HttpClient
  6. arcgis使用js动态加载坐标
  7. JavaSE复习总结
  8. 把两个C++项目编译成wasm
  9. 80道常见性能测试面试题
  10. Chrome 69 for mac版本浏览器下载,OpenSUSE版本,Chrome 69 windows 64位版本