package com.xxx.xxx.dao;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator; import com.ft.hsm.Util.ConstantValue;
import com.ft.hsm.Util.StringUtil; /*
* 使用java以及jdbc执行sql脚本的工具示例代码
*/ public class SqlHelper {
private static Logger logger; static {
logger = Logger.getLogger(ScreenDaoImpl.class);
PropertyConfigurator.configure(ConstantValue.PATH_SCREENSERVER_LOG4J_PROPERTIES);
} public static boolean createDBFromSQLFile(String SQLPath, String SQLFileCharsetName, String dbFilePath,
int[] retRowsExpected) {
if (StringUtil.isEmpty(SQLPath) || StringUtil.isEmpty(SQLFileCharsetName) || StringUtil.isEmpty(dbFilePath)
|| 0 >= retRowsExpected.length) {
logger.error("参数错误");
return false;
} // 检验是否己创建
File dbfile = new File(dbFilePath);
if (dbfile.exists() || dbfile.isDirectory()) {
logger.error(dbFilePath + "数据库文件己存在或存在同名文件夹");
return false;
} // 读取SQL文件
String sql = getText(SQLPath, SQLFileCharsetName); // "UTF-8"
if (StringUtil.isEmpty(sql)) {
logger.error("读取SQL文件失败");
return false;
} // 转换为SQL语句
List<String> sqlList = getSql(sql, SQLFileCharsetName);
for (int i = 0; i < sqlList.size(); i++) {
logger.info(i + ":" + sqlList.get(i));
} boolean isSuccess = false;
try { // 执行SQL语句
int[] rows = SqlHelper.execute(getConn(dbFilePath), sqlList);
logger.info("Row count Expected:" + Arrays.toString(retRowsExpected)); // 执行结果集鉴定
isSuccess = Arrays.equals(rows, retRowsExpected); // 调试打印执行结果集
if (null == rows || rows.length != retRowsExpected.length) {
logger.error("返回结果与期望个数不符, rows.length=" + rows.length + ", retRowsExpected.length="
+ retRowsExpected.length);
} else {
for (int index = 0; index < rows.length; index++) {
logger.info("rows[" + index + "] return=" + rows[index] + ", expected=" + retRowsExpected[index]
+ ",sql=" + sqlList.get(index)); }
}
} catch (Exception e) {
e.printStackTrace();
} return isSuccess;
} private static Connection getConn(String dbFile) {
String driver = "org.sqlite.JDBC"; // "com.mysql.jdbc.Driver";
String url = "jdbc:sqlite:" + dbFile; // "数据库连接";
// String username = "账号";
// String password = "密码";
Connection conn = null;
try {
Class.forName(driver); //classLoader,加载对应驱动
conn = (Connection) DriverManager.getConnection(url/*, username, password*/);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
} public static int[] execute(Connection conn, List<String> sqlList) throws Exception {
Statement stmt = null;
stmt = conn.createStatement();
for (String sql : sqlList) {
sql = sql.trim();
if (sql != null && !sql.trim().equals(""))
stmt.addBatch(sql);
}
int[] rows = stmt.executeBatch();
logger.info("Row count returned:" + Arrays.toString(rows));
conn.close(); return rows;
} /*
* getText方法吧path路径里面的文件按行读数来放入一个大的String里面去
* 并在换行的时候加入\r\n
*/
public static String getText(String path, String SQLFileCharsetName) {
File file = new File(path);
if (!file.exists() || file.isDirectory()) {
logger.error(path + "文件不存在或存在同名文件夹");
return null;
}
StringBuilder sb = new StringBuilder();
try {
FileInputStream fis = new FileInputStream(path);
InputStreamReader isr = new InputStreamReader(fis, SQLFileCharsetName);
BufferedReader br = new BufferedReader(isr);
String temp = null;
temp = br.readLine();
while (temp != null) {
if (temp.length() >= 2) {
String str1 = temp.substring(0, 1);
String str2 = temp.substring(0, 2);
if (str1.equals("#") || str2.equals("--") || str2.equals("/*") || str2.equals("//")) {
temp = br.readLine();
continue;
}
sb.append(temp + "\r\n");
} temp = br.readLine();
}
br.close(); } catch (Exception e) {
e.printStackTrace();
}
return sb.toString();
} /*
* getSqlArray方法
* 从文件的sql字符串中分析出能够独立执行的sql语句并返回
*/
public static List<String> getSql(String sql, String SQLFileCharsetName) {
String s = sql; s = tryDeleteBOM(SQLFileCharsetName, s); s = s.replaceAll("\r\n", "\r");
s = s.replaceAll("\r\n", "\r");
s = s.replaceAll("\r", "\n");
List<String> ret = new ArrayList<String>();
String[] sqlarry = s.split(";"); //用;把所有的语句都分开成一个个单独的句子
sqlarry = filter(sqlarry);
ret = Arrays.asList(sqlarry);
return ret;
} public static String[] filter(String[] ss) {
List<String> strs = new ArrayList<String>();
for (String s : ss) {
if (s != null && !s.equals("")) {
strs.add(s);
}
}
String[] result = new String[strs.size()];
for (int i = 0; i < strs.size(); i++) {
result[i] = strs.get(i).toString(); }
return result;
} private static String tryDeleteBOM(String SQLFileCharsetName, String s) {
byte[] byteSQL = null; logger.info("判断是否含有UTF-8的BOM头"); try {
byteSQL = s.getBytes(SQLFileCharsetName); // 去掉UTF-8的BOM头
if (byteSQL[0] == (byte) 0xef && byteSQL[1] == (byte) 0xbb && byteSQL[2] == (byte) 0xbf) {
logger.info("含有UTF-8的BOM头");
logger.info("去掉UTF-8的BOM头前" + Arrays.toString(byteSQL)); s = new String(byteSQL, 3, byteSQL.length - 3, SQLFileCharsetName); logger.info("去掉UTF-8的BOM头后为:" + Arrays.toString(s.getBytes(SQLFileCharsetName)));
} else {
logger.info("不含有UTF-8的BOM头");
}
} catch (UnsupportedEncodingException ex) {
ex.printStackTrace();
}
return s;
} public static void main(String[] args) {
String SQLPath = "config/xxx_create.utf8.sql";
String dbFile = "db" + File.separator + "test.db";
String SQLFileCharsetName = "UTF-8";
// String SQLFileCharsetName = "GBK";
int[] retRowsExpected = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; boolean isSuccess = createDBFromSQLFile(SQLPath, SQLFileCharsetName, dbFile, retRowsExpected);
logger.info("创建数据库" + (isSuccess ? "成功" : "失败"));
} }

  

去掉utf-8的Bom头:使用java以及jdbc不使用第三方库执行sql文件脚本的更多相关文章

  1. 使用java以及jdbc不使用第三方库执行sql文件脚本

    使用java以及jdbc不使用第三方库执行sql文件脚本 2017年02月15日 15:51:45 阅读数:660 使用java执行sql脚本的方法 解析sql脚本,删除不必要的注释和空行 将语句按分 ...

  2. C#和Java中执行SQL文件脚本的代码(非常有用)

    原文:C#和Java中执行SQL文件脚本的代码(非常有用) 我们在做程序的时候有事后会涉及到利用sql文件 直接执行,可是在sql文件中有很多注释,我们要一句一句的执行首先必须的得把sql文件解析 去 ...

  3. [疯狂Java]JDBC:PreparedStatement预编译执行SQL语句

    1. SQL语句的执行过程——Statement直接执行的弊病: 1) SQL语句和编程语言一样,仅仅就会普通的文本字符串,首先数据库引擎无法识别这种文本字符串,而底层的CPU更不理解这些文本字符串( ...

  4. 10.1(java学习笔记)JDBC基本操作(连接,执行SQL语句,获取结果集)

    一.JDBC JDBC的全称是java database connection java数据库连接. 在java中需要对数据库进行一系列的操作,这时就需要使用JDBC. sun公司制定了关于数据库操作 ...

  5. java调用含第三方库的py文件

    这是一个心酸的历程. py文件如下: 这里调用出现的问题主要是第三方包的问题,因为你的py文件里可能含有很多三方库文件,jython的jar包里可能不含有这个,所以这时需要你找到你已有三方库文件的ex ...

  6. java当中JDBC当中请给出一个sql server的helloworld例子

    [学习笔记] 1.sql server的helloworld例子: import java.sql.*; public class JdbcHelloSqlServer {  public stati ...

  7. java当中JDBC当中请给出一个sql server的stored procedure例子

    3.sql server的stored procedure例子: import java.sql.*;public class StoredProc0 {public static void main ...

  8. java当中JDBC当中请给出一个sql server的dataSource的helloworld例子

     [学习笔记] 4. sql server的dataSource的helloworld: import java.sql.*;import javax.sql.*;import net.sourcef ...

  9. java 执行sql文件

    # 背景 用例执行完毕,期望回滚数据,因此希望执行sql来回滚数据 # 步骤 直接show代码,借助的是mybatis的ScriptRunner /** * 执行xx库下的表备份脚本 * * @par ...

随机推荐

  1. OpenCV教程【002 VideoCapture加载并播放视频】

    #include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace c ...

  2. np.unique 的实现

    1. 简单实现 import numpy as np def unique(ar): perm = ar.argsort() aux = ar[perm] flag = np.concatenate( ...

  3. ICE 的回调

    使用分布式计算中间件ICE到现在已经有一年多了,在这一年里里面对ICE的理解.应用比较熟悉. 使用ICE写分布式软件,确实是很方便:ICE比较稳定.可靠,调用返回速度低延迟,使用简单,学习曲线不是很陡 ...

  4. bzoj 3681 Arietta

    一棵有根树,每个点有一个音高,有 $m$ 中弹奏方法,每种方法可以弹奏 $d$ 子树中音高在 $[l,r]$ 间的音符,每种方法最多弹 $t$ 次 求最多能弹出多少个音符 $n \leq 10000$ ...

  5. BZOJ5341: [Ctsc2018]暴力写挂

    BZOJ5341: [Ctsc2018]暴力写挂 https://lydsy.com/JudgeOnline/problem.php?id=5341 分析: 学习边分治. 感觉边分治在多数情况下都能用 ...

  6. ACM学习历程—2016"百度之星" - 资格赛(Astar Round1)

    http://bestcoder.hdu.edu.cn/contests/contest_show.php?cid=690 A题: 给定字符串,求任意区间的Hash值. 根据题目给定的Hash方式,属 ...

  7. Python 算法之二分查找

    二分查找 二分查找又称折半查找 优点是比较次数少,查找速度快,平均性能好 缺点是要求待查表为有序表,且插入删除困难 折半查找方法适用于不经常变动而查找频繁的有序列表. 猜数字游戏 1.生成一个有序列表 ...

  8. UIButton 不同状态图片来回切换

    做百度地图是否显示路况信息,用到两种状态的图片 第一种方法:用Bool进行标记 声明一个 Bool _isRoad; - (void)roadBtnAction:(UIButton *)sender ...

  9. php用zendstudio建立wsdl

    首先,新建的时候要选择soap,然后deocument和rpc都可以. 类和方法的页面: <?php //发货接口 class test{ function send_do_delivery($ ...

  10. 机器学习:多项式回归(scikit-learn中的多项式回归和 Pipeline)

    一.scikit-learn 中的多项式回归 1)实例过程 模拟数据 import numpy as np import matplotlib.pyplot as plt x = np.random. ...