需求
最近在做一箇中間庫的映射表(加載兩個表信息的字段映射匹配),需要加載數據庫表字段的詳細信息,即列的信息,比如:字段名,字段類型,字段長度,描述…等。其中的踩坑點在此記錄一下。
核心方法
ResultSet columnSet = dbmd.getColumns(null, "%", clz, "%");
原型:ResultSet DatabaseMetaData getColumns(String catalog,String schema,String tableName,String columnName);
參數說明:
參數catalog : 類別名稱
參數schema : 用戶方案名稱
參數tableName : 數據庫表名稱
參數columnName : 列名稱
思路分析
- jdbc獲取鏈接;
- 獲取表中所有字段信息;
- 處理空值以及根據實際業務變化;
代碼
其中,有兩種實現方法:
- 使用ResultSetMetaData獲取數據庫表信息(即執行sql語句返回的resultSet)
- 使用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;
}