去掉utf-8的Bom头:使用java以及jdbc不使用第三方库执行sql文件脚本
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文件脚本的更多相关文章
- 使用java以及jdbc不使用第三方库执行sql文件脚本
使用java以及jdbc不使用第三方库执行sql文件脚本 2017年02月15日 15:51:45 阅读数:660 使用java执行sql脚本的方法 解析sql脚本,删除不必要的注释和空行 将语句按分 ...
- C#和Java中执行SQL文件脚本的代码(非常有用)
原文:C#和Java中执行SQL文件脚本的代码(非常有用) 我们在做程序的时候有事后会涉及到利用sql文件 直接执行,可是在sql文件中有很多注释,我们要一句一句的执行首先必须的得把sql文件解析 去 ...
- [疯狂Java]JDBC:PreparedStatement预编译执行SQL语句
1. SQL语句的执行过程——Statement直接执行的弊病: 1) SQL语句和编程语言一样,仅仅就会普通的文本字符串,首先数据库引擎无法识别这种文本字符串,而底层的CPU更不理解这些文本字符串( ...
- 10.1(java学习笔记)JDBC基本操作(连接,执行SQL语句,获取结果集)
一.JDBC JDBC的全称是java database connection java数据库连接. 在java中需要对数据库进行一系列的操作,这时就需要使用JDBC. sun公司制定了关于数据库操作 ...
- java调用含第三方库的py文件
这是一个心酸的历程. py文件如下: 这里调用出现的问题主要是第三方包的问题,因为你的py文件里可能含有很多三方库文件,jython的jar包里可能不含有这个,所以这时需要你找到你已有三方库文件的ex ...
- java当中JDBC当中请给出一个sql server的helloworld例子
[学习笔记] 1.sql server的helloworld例子: import java.sql.*; public class JdbcHelloSqlServer { public stati ...
- java当中JDBC当中请给出一个sql server的stored procedure例子
3.sql server的stored procedure例子: import java.sql.*;public class StoredProc0 {public static void main ...
- java当中JDBC当中请给出一个sql server的dataSource的helloworld例子
[学习笔记] 4. sql server的dataSource的helloworld: import java.sql.*;import javax.sql.*;import net.sourcef ...
- java 执行sql文件
# 背景 用例执行完毕,期望回滚数据,因此希望执行sql来回滚数据 # 步骤 直接show代码,借助的是mybatis的ScriptRunner /** * 执行xx库下的表备份脚本 * * @par ...
随机推荐
- python二分查找模块bisect
bisect模块用于二分查找,非常方便. Bisect模块提供的函数有: 1.查找 bisect.bisect_left(a,x, lo=0, hi=len(a)) : 查找在有序列表a中插入x的in ...
- linux内嵌汇编语言
http://blog.chinaunix.net/uid-21254310-id-1828921.html http://www.cnblogs.com/lxgeek/archive/2011/01 ...
- Visualforce入门第五篇_2017.3.1
Visualforce添加过滤器,实现数据的筛选 参考原文:https://trailhead.salesforce.com/modules/visualforce_fundamentals/unit ...
- Erlang pool management -- Emysql pool optimize
在上一篇关于Emysql pool (http://www.cnblogs.com/--00/p/4281938.html)的分析的最后提到 现在的emysql_conn_mgr gen_server ...
- IPv4 forwarding is disabled. Networking will not work.
centos 7 docker 启动了一个web服务 但是启动时 报 WARNING: IPv4 forwarding is disabled. Networking will not work. 网 ...
- java bean Format注解用法
@NumberFormat(style=Style.NUMBER) private int number; @DateTimeFormat(pattern="yyyy-MM-dd&qu ...
- 蓝桥杯 算法训练 ALGO-143 字符串变换
算法训练 字符串变换 时间限制:1.0s 内存限制:256.0MB 问题描述 相信经过这个学期的编程训练,大家对于字符串的操作已经掌握的相当熟练了.今天,徐老师想测试一下大家对于字符串操作的掌 ...
- 杂项:UUID
ylbtech-杂项:UUID UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部 ...
- vi,sed,tr,awk技巧
将文件中的换行替换为逗号 使用sed: sed -e :a -e N -e '$!ba' -e 's/\n/,/g' filename 使用tr: cat filename | tr '\n' ',' ...
- elasticsearch的功能及适用场景(2)
1.Elasticsearch的功能 (1)分布式的搜索引擎和数据分析引擎 搜索:百度,网站的站内搜索,IT系统的检索数据分析:电商网站,最近7天牙膏这种商品销量排名前10的商家有哪些:新闻网站,最近 ...