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 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 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