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. 20165210 Java第一次实验报告

    20165210 第一次实验报告 实验内容 建立目录运行简单的Java程序 建立自己学号的目录 在上个目录下建立src,bin等目录 Javac,Java的执行在学号目录下 IDEA的调试与设置断点 ...

  2. 查看.Net Framework版本号

    目录 摘要 .NET Framework 的版本 确定计算机上安装的 .NET Framework 版本 补充几个查看.Net Framework版本号 概要 本文描述如何确定计算机上安装的 Micr ...

  3. 非maven项目下载maven的jar

    很多时候我们需要jar,可惜项目不是maven的,但是我们只有一个maven的坐标,那怎么办? 比如: <dependencies> <dependency> <grou ...

  4. Vue 将样式绑定到一个对象让模板更清晰

    Vue 将样式绑定到一个对象让模板更清晰 <div id="app"> <div v-bind:style="styleObject"> ...

  5. angular track by $index

    这个东西配合删除数组时会出现永远删除uoloadPicArr这个数组的最后一个一项 其用法是主要用在当ng-repeat循环时如果其内部的dom元素有id属性存在 可以避免页面出现相同的id  只是一 ...

  6. Spark Shuffle大揭秘

    什么是Shuffle: Shuffle中文翻译为“洗牌”,需要Shuffle的关键原因是某种具有共同特征的数据需要最终汇聚到一个计算节点上进行计算. Shuffle面临的问题: 1. 数据量非常大: ...

  7. JDBC小常识

    1 JDBC连接数据库6步 Load the JDBC Driver Establish the Database Connection Create a Statement Object Execu ...

  8. 二:HTML文本编译器 kindeditor-4.1.10 的使用 SpringMVC+jsp的实现

    这和一篇与上一篇的区别在与,上一篇是直接请求到action我们剩下的都是我们全部手动处理, 而这一片篇是由kindeditor内部处理,图片上传到本地,基本上没什么区别,但是有一点一定要注意的就是,这 ...

  9. MySQL insert插入

    使用INSERT语句插入新数据 语法:INSERT [INTO] tbl_name [(col_name,...)] VALUES (pression,...),…      INSERT [INTO ...

  10. react-router4.x 实用例子(路由过渡动画、代码分割)

    react-router4.2.0实用例子 代码分割 官网上面写的代码分割是不支持create-react-app脚手架的,要使用import实现 创建一个bundle.js文件 import { C ...