zoukankan      html  css  js  c++  java
  • Java 执行 SQL 脚本文件

    转自:http://blog.csdn.net/hongmin118/article/details/4588941

      1 package com.unmi.db;
      2 
      3 import java.io.FileInputStream;
      4 import java.io.InputStream;
      5 import java.sql.Connection;
      6 import java.sql.Statement;
      7 import java.util.ArrayList;
      8 import java.util.Arrays;
      9 import java.util.List;
     10 
     11 /**
     12  * 读取 SQL 脚本并执行
     13  * @author Unmi
     14  */
     15 public class SqlFileExecutor {
     16 
     17     /**
     18      * 读取 SQL 文件,获取 SQL 语句
     19      * @param sqlFile SQL 脚本文件
     20      * @return List<sql> 返回所有 SQL 语句的 List
     21      * @throws Exception
     22      */
     23     private List<String> loadSql(String sqlFile) throws Exception {
     24         List<String> sqlList = new ArrayList<String>();
     25 
     26         try {
     27             InputStream sqlFileIn = new FileInputStream(sqlFile);
     28 
     29             StringBuffer sqlSb = new StringBuffer();
     30             byte[] buff = new byte[1024];
     31             int byteRead = 0;
     32             while ((byteRead = sqlFileIn.read(buff)) != -1) {
     33                 sqlSb.append(new String(buff, 0, byteRead));
     34             }
     35 
     36             // Windows 下换行是 /r/n, Linux 下是 /n
     37             String[] sqlArr = sqlSb.toString().split("(;//s*//r//n)|(;//s*//n)");
     38             for (int i = 0; i < sqlArr.length; i++) {
     39                 String sql = sqlArr[i].replaceAll("--.*", "").trim();
     40                 if (!sql.equals("")) {
     41                     sqlList.add(sql);
     42                 }
     43             }
     44             return sqlList;
     45         } catch (Exception ex) {
     46             throw new Exception(ex.getMessage());
     47         }
     48     } 
     49 
     50     /**
     51      * 传入连接来执行 SQL 脚本文件,这样可与其外的数据库操作同处一个事物中
     52      * @param conn 传入数据库连接
     53      * @param sqlFile SQL 脚本文件
     54      * @throws Exception
     55      */
     56     public void execute(Connection conn, String sqlFile) throws Exception {
     57         Statement stmt = null;
     58         List<String> sqlList = loadSql(sqlFile);
     59         stmt = conn.createStatement();
     60         for (String sql : sqlList) {
     61             stmt.addBatch(sql);
     62         }
     63         int[] rows = stmt.executeBatch();
     64         System.out.println("Row count:" + Arrays.toString(rows));
     65     }
     66 
     67     /**
     68      * 自建连接,独立事物中执行 SQL 文件
     69      * @param sqlFile SQL 脚本文件
     70      * @throws Exception
     71      */
     72     public void execute(String sqlFile) throws Exception {
     73         Connection conn = DBCenter.getConnection();
     74         Statement stmt = null;
     75         List<String> sqlList = loadSql(sqlFile);
     76         try {
     77             conn.setAutoCommit(false);
     78             stmt = conn.createStatement();
     79             for (String sql : sqlList) {
     80                 stmt.addBatch(sql);
     81             }
     82             int[] rows = stmt.executeBatch();
     83             System.out.println("Row count:" + Arrays.toString(rows));
     84             DBCenter.commit(conn);
     85         } catch (Exception ex) {
     86             DBCenter.rollback(conn);
     87             throw ex;
     88         } finally {
     89             DBCenter.close(null, stmt, conn);
     90         }
     91     }
     92 
     93     public static void main(String[] args) throws Exception {
     94         List<String> sqlList = new SqlFileExecutor().loadSql(args[0]);
     95         System.out.println("size:" + sqlList.size());
     96         for (String sql : sqlList) {
     97             System.out.println(sql);
     98         }
     99     }
    100 }
  • 相关阅读:
    常用的 JavaScript 简写方法
    user-select详解
    惊人的CSS和JavaScript动画logos例子
    debounce与throttle区别
    Vue.js中data,props和computed数据
    字体图标出现乱码的兼容方案
    ios调用Html内JS alert 不能点击关闭为甚?
    统一诊断服务 (Unified diagnostic services , UDS) (二)
    统一诊断服务 (Unified diagnostic services , UDS) (一)
    CAN总线同步
  • 原文地址:https://www.cnblogs.com/Mr-Nobody/p/3587901.html
Copyright © 2011-2022 走看看