JDBC通過表名加載數據庫表結構信息

需求

最近在做一箇中間庫的映射表(加載兩個表信息的字段映射匹配),需要加載數據庫表字段的詳細信息,即列的信息,比如:字段名,字段類型,字段長度,描述…等。其中的踩坑點在此記錄一下。

核心方法

ResultSet columnSet = dbmd.getColumns(null, "%", clz, "%");

原型:ResultSet DatabaseMetaData getColumns(String catalog,String schema,String tableName,String columnName);
參數說明:
參數catalog : 類別名稱
參數schema : 用戶方案名稱
參數tableName : 數據庫表名稱
參數columnName : 列名稱

思路分析

  1. jdbc獲取鏈接;
  2. 獲取表中所有字段信息;
  3. 處理空值以及根據實際業務變化;

代碼

其中,有兩種實現方法:

  1. 使用ResultSetMetaData獲取數據庫表信息(即執行sql語句返回的resultSet)
  2. 使用DatabaseMetaData獲取數據庫表信息(效率更高點
//使用DatabaseMetaData獲取數據庫表信息
public static List<String> getMetaDataDbmd(String clz,String url,String user,String password) throws SQLException {
    Connection conn = getConnection(url,user,password);
    List<String> list = new ArrayList<String>();
    try {
        DatabaseMetaData dbmd = conn.getMetaData();
        ResultSet columnSet = dbmd.getColumns(null, "%", clz, "%");
        while (columnSet.next()) {
            StringBuffer sb = new StringBuffer();
            String decimalDigits =  columnSet.getString("DECIMAL_DIGITS");
            String typeName =  columnSet.getString("TYPE_NAME");
            sb.append(columnSet.getString("COLUMN_NAME") + ",");//字段名
            if("NUMBER".equals(typeName)){
                typeName = Optional.ofNullable(decimalDigits).map(a -> a = "NUMBER_DIGITS").orElse("NUMBER");
            }
            sb.append(typeName + ",");//字段類型
            sb.append(columnSet.getString("COLUMN_SIZE") + ",");//字段長度
            sb.append(columnSet.getString("NULLABLE") + ",");//是否爲空 0爲非空,1爲空
            sb.append(columnSet.getString("DECIMAL_DIGITS") + ",");//小數部分的位數
            sb.append(columnSet.getString("REMARKS")==null?" ":URLEncoder.encode(columnSet.getString("REMARKS"), "UTF-8"));
            list.add(sb.toString());
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }finally {
        closeConnection(conn);
    }
    return list;
}
//使用ResultSetMetaData獲取數據庫表信息
public static List<String> getMetaDataRsmd(String clz) {
   Connection conn = getConnection();
   List<String> list = new ArrayList<String>();
   try {
      Statement stmt = conn.createStatement();
      String sql = "select * from " + clz;
      ResultSet rs = stmt.executeQuery(sql);
      ResultSetMetaData rsmd = rs.getMetaData();
      int count = rsmd.getColumnCount();
      for (int i = 1; i <= count; i++) {
         StringBuffer sb = new StringBuffer();
         sb.append(rsmd.getColumnName(i) + ",");
         sb.append(rsmd.getColumnTypeName(i) + ",");
         sb.append(rsmd.getPrecision(i));
         list.add(sb.toString());
      }
   } catch (SQLException e) {
      e.printStackTrace();
   }
   return list;
}

延伸拓展

java查詢oracle數據庫所有表DatabaseMetaData用法

JDBC的那點事之DatabaseMetaData之獲取表的所有列名

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章