You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

564 lines
20 KiB

package com.fr.plugin.decision.utils;
import com.fr.data.core.db.ColumnInformation;
import com.fr.data.core.db.DBUtils;
import com.fr.data.impl.NameDatabaseConnection;
import com.fr.json.JSONArray;
import com.fr.json.JSONObject;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.StringUtils;
import com.fr.web.utils.WebUtils;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.sql.*;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class JdbcUtils {
public static Connection getConnection(String connection) {
NameDatabaseConnection db = new NameDatabaseConnection(connection);
try {
Connection conn = db.createConnection();
return conn;
} catch (Exception e) {
FineLoggerFactory.getLogger().error("HW_excel导入:" + connection + "数据连接创建失败");
}
return null;
}
public static String getCreateSql(int type, String tableName, JSONArray items){
String createSql = "";
switch (type){
case 1:
createSql = getOracleCreateSql(items,tableName);
break;
case 2:
createSql = getSqlServerCreateSql(items,tableName);
break;
case 3:
createSql = getMysqlCreateSql(items,tableName);
break;
case 4:
createSql = getPostGreCreateSql(items, tableName);
break;
case 5:
createSql = getSybaseCreateSql(items,tableName);
break;
}
FineLoggerFactory.getLogger().debug("HW_excel导入:建表语句为 " + createSql);
return createSql;
}
/*
mysql boolean 0/1
oracle char(1) 0/1 不允许为空
sqlServer bit 0/1
PostGre boolean 0/1/true/false
sybase bit 0/1 不允许为空
*/
private static String getMysqlCreateSql(JSONArray items, String tableName){
String sql = " ( ";
for (Object ja : items){
JSONObject item = new JSONObject(ja.toString());
String colname = "`" + item.getString("colName") + "`";
int colType = item.getInt("colType");
String colLen = item.getString("colLength");
String colTypeStr ;
switch (colType){
case 1:
colTypeStr = colname + " int,";
break;
case 3:
colTypeStr = colname + " boolean,";
break;
case 4:
colTypeStr = colname + " datetime,";
break;
case 5:
colTypeStr = colname + " decimal(" + colLen.split(",")[0]+","+ colLen.split(",")[1] + "),";
break;
default:
colTypeStr = colname + " varchar(" +colLen + "),";
break;
}
sql += colTypeStr;
}
return "create table "+ tableName + sql.substring(0,sql.length()-1) +" )" ;
}
private static String getSqlServerCreateSql(JSONArray items, String tableName){
String sql = " ( ";
for (Object ja : items){
JSONObject item = new JSONObject(ja.toString());
String colname = "[" + item.getString("colName") + "]" ;
int colType = item.getInt("colType");
String colLen = item.getString("colLength");
String colTypeStr ;
switch (colType){
case 1:
colTypeStr = colname + " int,";
break;
case 3:
colTypeStr = colname + " bit,";
break;
case 4:
colTypeStr = colname + " datetime,";
break;
case 5:
colTypeStr = colname + " decimal(" + colLen.split(",")[0] + "," + colLen.split(",")[1] + "),";
break;
default:
colTypeStr = colname + " varchar(" +colLen + "),";
break;
}
sql += colTypeStr;
}
return "create table "+ tableName + sql.substring(0,sql.length()-1) + " )" ;
}
private static String getOracleCreateSql(JSONArray items, String tableName){
String sql = " ( ";
for (Object ja : items){
JSONObject item = new JSONObject(ja.toString());
String colname = "\"" + item.getString("colName") + "\"";
int colType = item.getInt("colType");
String colLen = item.getString("colLength");
String colTypeStr ;
switch (colType){
case 1:
int len = Integer.parseInt(colLen) > 38 ? 38:Integer.parseInt(colLen);
colTypeStr = colname + " number(" + len + "),";
break;
case 3:
colTypeStr = colname + " char(1),";
break;
case 4:
colTypeStr = colname + " date,";
break;
case 5:
colTypeStr = colname + " decimal(" + colLen.split(",")[0] + "," + colLen.split(",")[1] + "),";
break;
default:
colTypeStr = colname + " varchar2(" +colLen + "),";
break;
}
sql += colTypeStr;
}
return "create table "+ tableName + sql.substring(0,sql.length()-1) + " )" ;
}
private static String getPostGreCreateSql(JSONArray items, String tableName){
String sql = " ( ";
for (Object ja : items){
JSONObject item = new JSONObject(ja.toString());
String colname = "\"" + item.getString("colName") + "\"";
int colType = item.getInt("colType");
String colLen = item.getString("colLength");
String colTypeStr ;
switch (colType){
case 1:
colTypeStr = colname + " integer,";
break;
case 3:
colTypeStr = colname + " boolean,";
break;
case 4:
colTypeStr = colname + " date,";
break;
case 5:
colTypeStr = colname + " decimal(" + colLen.split(",")[0] + ","+ colLen.split(",")[1] + "),";
break;
default:
colTypeStr = colname + " varchar(" + colLen + "),";
break;
}
sql += colTypeStr;
}
return "create table "+ tableName + sql.substring(0,sql.length()-1) + " )" ;
}
private static String getSybaseCreateSql(JSONArray items, String tableName){
String sql = " ( ";
for (Object ja : items){
JSONObject item = new JSONObject(ja.toString());
String colname = "[" + item.getString("colName") + "]" ;
int colType = item.getInt("colType");
String colLen = item.getString("colLength");
String colTypeStr ;
switch (colType){
case 1:
colTypeStr = colname + " int,";
break;
case 3:
colTypeStr = colname + " bit,";
break;
case 4:
colTypeStr = colname + " date,";
break;
case 5:
colTypeStr = colname + " decimal(" + colLen.split(",")[0] + "," + colLen.split(",")[1] + "),";
break;
default:
colTypeStr = colname + " varchar(" + colLen + "),";
break;
}
sql += colTypeStr;
}
return "create table "+ tableName + sql.substring(0,sql.length()-1) + " )" ;
}
public static String getInsertSql(String tableName, JSONArray items, int type){
String colStr = " (";
StringBuffer stringBuffer = new StringBuffer(" values (");
for (int i = 0, len = items.size(); i < len; i++) {
String colName = dealColName(items.getJSONObject(i).getString("colName"), type);
if (i == len - 1) {
colStr += colName + ")";
stringBuffer.append("?)");
} else {
colStr += colName + ",";
stringBuffer.append("?,");
}
}
FineLoggerFactory.getLogger().debug("HW_excel导入:插入语句为 " + "insert into " + tableName + colStr + stringBuffer.toString());
return "insert into " + tableName + colStr + stringBuffer.toString();
}
private static String dealColName(String colName, int type){
switch (type){
case 1:
case 4:
return "\"" + colName + "\"";
case 2:
case 5:
return "[" + colName + "]";
case 3:
return "`" + colName + "`";
}
return "";
}
public static String getDeleteSql(String tableName, int type){
return "delete from " + tableName;
}
public static String getDropSql(String tableName){
return "drop table " + tableName;
}
public static String getQuerySql(String tableName, int type, String schema){
switch (type){
case 1:
return "select * from " + tableName + " rownum < 5000";
case 2:
case 5:
return "select top(5000) * from " + tableName;
case 3:
case 4:
return "select * from " + tableName + " limit 0,5000";
default:
FineLoggerFactory.getLogger().debug("HW_excel导入:getQuerySql返回为空");
return "";
}
}
public static String getQueryColSql(String tableName, int type, String schema){
return "select * from " + tableName + " where 1=2";
}
/*
oracle:1
sqlserver:2
mysql:3
postgresql:4
sybase:5
*/
public static int getConnectionType(Connection conn) throws SQLException {
String DatabaseProductName = conn.getMetaData().getDatabaseProductName().trim().toUpperCase();
FineLoggerFactory.getLogger().debug("HW_excel导入:数据库 ProductName 为: " + DatabaseProductName);
if (StringUtils.contains(DatabaseProductName,"ORACLE")){
return 1;
}
if (StringUtils.contains(DatabaseProductName,"SQL SERVER")) {
return 2;
}
if (StringUtils.contains(DatabaseProductName,"MYSQL")){
return 3;
}
if (StringUtils.contains(DatabaseProductName,"POSTGRE")){
return 4;
}
if (StringUtils.contains(DatabaseProductName,"SYBASE")){
return 5;
}
return 0;
}
private static void dealPrepareStatement(PreparedStatement pstm, String value, int index, int type, int databaseType) throws SQLException {
try {
switch (type) {
case 1:
pstm.setInt(index, Double.valueOf(value).intValue());
break;
case 3:
switch (value.toUpperCase()) {
case "TRUE":
case "1":
if (databaseType == 4){
pstm.setBoolean(index, true);
} else {
pstm.setInt(index, 1);
} break;
case "FALSE":
case "0":
if (databaseType == 4){
pstm.setBoolean(index, false);
} else {
pstm.setInt(index, 0);
} break;
}
break;
case 4:
java.sql.Date date = java.sql.Date.valueOf(value);
pstm.setDate(index, date);
break;
case 5:
pstm.setFloat(index, Float.parseFloat(value));
break;
default:
if (isNumeric(value)){
pstm.setString(index, value.split("\\.")[0]);
} else {
pstm.setString(index, value);
}
}
} catch (Exception e){
pstm.setString(index, value);
}
}
/**
* 匹配是否为数字
* @param str 可能为中文,也可能是-19162431.1254,不使用BigDecimal的话,变成-1.91624311254E7
*/
public static boolean isNumeric(String str) {
// 该正则表达式可以匹配所有的数字 包括负数
Pattern pattern = Pattern.compile("-?[0-9]+(\\.0)");
String bigStr;
try {
bigStr = new BigDecimal(str).toString();
} catch (Exception e) {
return false;//异常 说明包含非数字。
}
Matcher isNum = pattern.matcher(bigStr); // matcher是全匹配
if (!isNum.matches()) {
return false;
}
return true;
}
/**
* 把从数据库中查询出来的 ResultSetMetaData 转为 JSONArray
*/
public static JSONArray formatRsToTableData(ResultSet rs) throws Exception{
ResultSetMetaData md = rs.getMetaData();
JSONArray jsonArray = new JSONArray();
while(rs.next()) {
JSONArray rowArray = new JSONArray();
for(int i=1; i<=md.getColumnCount(); i++) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("text", rs.getString(i));
rowArray.add(jsonObject);
}
jsonArray.add(rowArray);
}
return jsonArray;
}
public static JSONArray formatRs2ColAttr(ColumnInformation[] columnInformations){
JSONArray colsAttr = JSONArray.create();
for(int i = 0; i < columnInformations.length; i++) {
JSONObject colAttr = JSONObject.create();
colAttr.put("colType", columnInformations[i].getColumnType());
colAttr.put("colName", columnInformations[i].getColumnName());
colAttr.put("colLength", columnInformations[i].getColumnSize());
colAttr.put("id",i+1);
colAttr.put("excelCol","");
colsAttr.add(colAttr);
}
return colsAttr;
}
public static void addPrimaryKeyColAttr(JSONArray colsAttr, List<String> primaryKeyCol) {
for (Object col:colsAttr) {
String colName = ((JSONObject) col).getString("colName");
if (primaryKeyCol.contains(colName)) {
((JSONObject) col).put("primaryKey", true);
} else {
((JSONObject) col).put("primaryKey", false);
}
}
}
public static JSONArray formatRsToJsonArray(ResultSet rs) throws Exception{
ResultSetMetaData md = rs.getMetaData();
JSONArray jsonArray = new JSONArray();
while(rs.next()) {
JSONObject jsonObject = new JSONObject();
for(int i=1; i<=md.getColumnCount(); i++) {
jsonObject.put(md.getColumnName(i), rs.getString(i));
}
jsonArray.add(jsonObject);
}
return jsonArray;
}
public static int changeStr2Type(String typeStr , int connType, int scale){
int type;
switch (typeStr.toUpperCase()){
case "INT":
case "INT4":
case "INTEGER":
type = 1; break;
case "BIT":
case "CHAR":
case "BOOL":
case "TINYINT":
case "BOOLEAN":
type = 3; break;
case "DATE":
case "DATETIME":
type = 4; break;
case "DECIMAL":
case "NUMERIC":
type = 5; break;
case "NUMBER": // oracle 整形和小数都是 number 类型,需要判断 scale
if (scale == 0) {
type = 1; break;
} else {
type = 5; break;
}
default:
type = 2;
}
return type;
}
public static int pstsExecBatch(PreparedStatement psts, JSONArray items, Map<String, List> values, int type) throws SQLException {
int count = 0;
for (int j =0; j< values.get(items.getJSONObject(0).get("colName")).size(); j++) {
for (int k=0; k<items.size();k++){
dealPrepareStatement(
psts,
values.get(items.getJSONObject(k).getString("colName")).get(j).toString(),
k+1,
items.getJSONObject(k).getInt("colType"),
type
);
}
count ++ ;
// sybase 执行 executeBatch 效率异常低,改用 execute
if(type == 5){
psts.execute();
continue;
}
psts.addBatch();
if( j!=0 && j%10000==0 ){
psts.executeBatch();
psts.clearBatch();
System.out.println("HW_excel导入:pstsExecBatch 批量执行完成");
FineLoggerFactory.getLogger().info("HW_excel导入:pstsExecBatch 批量执行完成");
}
}
System.out.println("HW_excel导入:pstsExecBatch 执行完成");
FineLoggerFactory.getLogger().info("HW_excel导入:pstsExecBatch 执行完成");
if(type == 5){
return count;
}
psts.executeBatch();
psts.clearBatch();
return count;
}
// 建表操作
public static int execCreatTable(String connection, String tableName, JSONArray items, HttpServletResponse res){
String createSql;
Statement smt = null;
Connection conn = getConnection(connection);
int line = -1;
try {
smt = conn.createStatement();
int type = JdbcUtils.getConnectionType(conn);
createSql = JdbcUtils.getCreateSql(type, tableName, items);
System.out.println("HW_excel导入:建表语句为 " + createSql);
FineLoggerFactory.getLogger().debug("HW_excel导入:建表语句为 " + createSql);
line = smt.executeUpdate(createSql);
} catch (Exception e){
e.printStackTrace();
System.out.println("HW_excel导入:建表执行异常!");
FineLoggerFactory.getLogger().info("HW_excel导入:建表执行异常!");
try {
WebUtils.printAsJSON(res,new JSONObject().put("status","fail").put("errorText","表创建失败:" + e.getLocalizedMessage()));
} catch (Exception e1) {
e1.printStackTrace();
}
} finally {
closeConn(conn, null, smt);
}
return line;
}
public static void closeConn(Connection conn, PreparedStatement psts, Statement smt){
if(conn != null){
DBUtils.closeConnection(conn);
}
if(psts != null){
DBUtils.close(psts);
}
if(smt != null){
DBUtils.close(smt);
}
}
public static boolean isHive(Connection conn){
try {
String DatabaseProductName = conn.getMetaData().getDatabaseProductName().trim().toUpperCase();
FineLoggerFactory.getLogger().debug("isHive:" + DatabaseProductName);
if (StringUtils.contains(DatabaseProductName,"HIVE")){
return true;
}
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
}