使用sql查詢mysql/oracle/sql server/gp數據庫中指定表的字段信息(字段名/字段類型/字段長度/是否是主鍵/是否為空)
阿新 • • 發佈:2018-11-15
statement oracle數據庫 style cte key post creates str columns
1,根據數據庫類型拼接不同URL
/** * 根據類型不同拼接連接的URL * @param dbType 1:mysql、2:oracle、3:sql server、4:gp * @param ip * @param port * @param databaseName * @return*/ public static String getTestDbUrl(int dbType, String ip, String port, String databaseName){ String url = "";if (Constant.DATABASE_TYPE_MYSQL == dbType){ //mysql url = "jdbc:mysql://"+ip+":"+port+"/"+databaseName+"?useUnicode=true&characterEncoding=UTF8"; }else if (Constant.DATABASE_TYPE_ORACLE == dbType){ //oracle url = "jdbc:oracle:thin:@"+ip+":"+port+":ORCL"; }else if (Constant.DATABASE_TYPE_SQL_SERVER == dbType){ //sql server url = "jdbc:sqlserver://"+ip+":"+port+";databaseName="+databaseName+";integratedSecurity=true"; }else if (Constant.DATABASE_TYPE_GP == dbType){ //gp url = "jdbc:postgresql://"+ip+":"+port+"/"+databaseName; }return url; }
2,創建連接並查詢
/** * 通過jsbc獲取數據 * @param driver driver * @param url 數據庫url * @param username 用戶名 * @param password 密碼 * @param sql sql語句 * @param sqlType 語句類型 ,1:查詢語句,2:創建語句 * @param columnConnt 查詢語句返回列的個數 * @return List */ public static List<Map<String, String>> getJdbcData(String driver, String url, String username, String password, String sql, int sqlType, int columnConnt){ Connection con = null; Statement st = null; ResultSet rs = null; List<Map<String, String>> result = new ArrayList<>(); try { //1.加載oracle數據庫驅動 Class.forName(driver); //2.獲取數據庫連接 con = DriverManager.getConnection(url, username, password); //3.獲取執行sql語句的平臺 st = con.createStatement(); //4.執行sql語句獲取結果集 // 查詢 if(sqlType == 1){ rs = st.executeQuery(sql); //5.循環獲取結果集數據 int i = 1; while(rs.next()){ if(i <= columnConnt){ Map<String, String> resultMap = new HashMap<>(columnConnt); for (int j = 0; j < columnConnt; j++) { resultMap.put("column" + (j + 1) + "", rs.getString(j + 1)); } result.add(resultMap); } } }else{ // 創建 int rss = st.executeUpdate(sql); Map<String, String> resultMap = new HashMap<>(columnConnt); resultMap.put("column" + 1 + "", rss + ""); result.add(resultMap); } return result; } catch (ClassNotFoundException e) { e.printStackTrace(); Map<String, String> resultMap = new HashMap<>(columnConnt); resultMap.put("column1", "-1"); result.add(resultMap); } catch (SQLException e) { e.printStackTrace(); Map<String, String> resultMap = new HashMap<>(columnConnt); resultMap.put("column1", "-1"); result.add(resultMap); }finally{ //關閉rs if(rs != null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } //關閉st if(st != null){ try { st.close(); } catch (SQLException e) { e.printStackTrace(); } } //關閉con if(con != null){ try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } return result; } // return result; }
3,設置參數
/** * 查詢指定數據庫中指定表的字段信息 * @param databaseType 數據庫類型: 1:mysql、2:oracle、3:sql server、4:gp * @param databaseName 數據庫名稱 * @param databaseIp 數據庫ip * @param databasePort 數據庫端口 * @param databaseUserName 數據庫用戶名 * @param databaseUserPassword 數據庫用戶的密碼 * @param tableName 表名 * @return*/ public static List<Map<String, String>> getColumnInfoByTableName(int databaseType, String databaseName, String databaseIp, String databasePort, String databaseUserName, String databaseUserPassword, String tableName){ String sql = ""; if (Constant.DATABASE_TYPE_MYSQL == databaseType){ //mysql sql = "SELECT column_name, data_type,(case when data_type = ‘int‘ or data_type = ‘float‘ or data_type = ‘double‘ or data_type = ‘decimal‘ then NUMERIC_PRECISION else CHARACTER_MAXIMUM_LENGTH end ) as data_length,\n" + "(case when IS_NULLABLE = ‘NO‘ then 0 else 1 end)as data_Null,(case when COLUMN_KEY=‘PRI‘ then 1 else 0 end) as data_IsPK\n" + " FROM information_schema.COLUMNS WHERE table_schema = ‘"+databaseName+"‘ and table_name = ‘"+tableName+"‘"; }else if (Constant.DATABASE_TYPE_ORACLE == databaseType){ //oracle sql = "SELECT column_name, data_type, data_length, NULLABLE,(case when column_name=(select col.column_name \n" + "from user_constraints con, user_cons_columns col \n" + "where con.constraint_name = col.constraint_name \n" + "and con.constraint_type=‘P‘ \n" + "and col.table_name = "+tableName+"\n" + ") then 1 else 0 end) as IsPK\n" + " FROM all_tab_cols\n" + " WHERE table_name = ‘"+tableName+"‘ "; }else if (Constant.DATABASE_TYPE_SQL_SERVER == databaseType){ //sql server sql = "SELECT C.name as column_name, T.name as data_type, COLUMNPROPERTY(C.id,C.name,‘PRECISION‘) as data_length, \n" + "convert(bit,case when exists(SELECT 1 FROM sysobjects where xtype=‘PK‘ and parent_obj=c.id and name in (\n" + " SELECT name FROM sysindexes WHERE indid in(\n" + " SELECT indid FROM sysindexkeys WHERE id = c.id AND colid=c.colid))) then 1 else 0 end) \n" + " as data_IsPK, convert(bit,C.IsNullable) as data_Null\n" + "FROM syscolumns C INNER JOIN systypes T ON C.xusertype = T.xusertype \n" + "inner join sysobjects d on a.id=d.id and d.xtype=‘U‘ and d.name<>‘dtproperties‘ \n" + "where T.name is not null\n" + "and d.name=‘"+tableName+"‘"; }else if (Constant.DATABASE_TYPE_GP == databaseType){ //gp } List<Map<String, String>> columnNameList = JdbcUtil.getJdbcData(SingletonHoldResource.getInstance().getDictMap(Constant.DB_DRIVER).get(Integer.toString(databaseType)), getTestDbUrl(databaseType, databaseIp, databasePort, databaseName), databaseUserName, databaseUserPassword, sql, 1, 5); //結果中的對應關系:column1 -- name; column2 -- type; column3 -- length; column4 -- IsNull; column5 -- isPk; return columnNameList; }
使用sql查詢mysql/oracle/sql server/gp數據庫中指定表的字段信息(字段名/字段類型/字段長度/是否是主鍵/是否為空)