1. 程式人生 > >使用sql查詢mysql/oracle/sql server/gp數據庫中指定表的字段信息(字段名/字段類型/字段長度/是否是主鍵/是否為空)

使用sql查詢mysql/oracle/sql server/gp數據庫中指定表的字段信息(字段名/字段類型/字段長度/是否是主鍵/是否為空)

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數據庫中指定表的字段信息(字段名/字段類型/字段長度/是否是主鍵/是否為空)