根據數據庫的四大參數獲取指定庫中的所有表
//根據數據庫的參數獲取指定庫中的所有表
public static List<Map<String, String>> getDbTables(String driver, String url, String user, String pwd) {
Connection conn = null;
ResultSet rs = null;
List<Map<String, String>> tables = new ArrayList<>();
try {
conn = getConnections(driver, url, user, pwd);
DatabaseMetaData dbMetaData = conn.getMetaData();
rs = dbMetaData.getTables(null, getSchema(conn), null, new String[]{"TABLE"});
while (rs.next()) {
Map<String, String> map = new HashMap<>(1 << 3);
//獲取數據庫的表名
map.put("tableNam", rs.getString("TABLE_NAME"));
//獲取數據庫的表類型
map.put("tableType", rs.getString("TABLE_TYPE"));
// 所屬數據庫
map.put("tableCat", rs.getString("TABLE_CAT"));
// 所屬用戶
map.put("tableSchem", rs.getString("TABLE_SCHEM"));
map.put("tableRemarks", rs.getString("REMARKS"));
tables.add(map);
}
} catch (Exception e) {
LoggerUtil.error(String.valueOf(RetCode.DB_CONN_ERROR), Utils.getStackTrace(e));
throw new ServiceException(RetCode.DB_CONN_ERROR, "failed to get db tables", null);
} finally {
safeClose(rs, conn);
}
return tables;
}
根據數據庫的表名獲取數據庫的字段、主鍵、唯一索引
注意:oracle區分大小寫,所以在獲取唯一索引時和oracle有區別。
public static Map<String, List<Map<String, Object>>> getColumnsByTableList(String driver, String url,
String user, String pwd, List<String> tableList, int dbType) {
LoggerUtil.debug("tableList: {}", tableList);
if (CollectionUtils.isEmpty(tableList)) {
return null;
}
Map<String, List<Map<String, Object>>> tableColumns = new HashMap<>(tableList.size());
Connection conn = null;
ResultSet rs = null;
try {
conn = getConnections(driver, url, user, pwd);
DatabaseMetaData dbMetaData = conn.getMetaData();
String userName = conn.getMetaData().getUserName();
if ((userName == null) || (userName.length() == 0)) {
throw new Exception("ORACLE數據庫模式不允許爲空");
}
List<Map<String, Object>> columns = null;
for (String tableName : tableList) {
columns = new ArrayList<>();
// 獲取主鍵字段
ResultSet primaryKeys = dbMetaData.getPrimaryKeys(null, userName, tableName);
Set<String> keySet = new HashSet<>(8);
//根據結果集元數據打印內容
ResultSetMetaData pkmd = primaryKeys.getMetaData();
while (primaryKeys.next()) {
for (int i = 1; i <= pkmd.getColumnCount(); i++) {
//獲取主鍵的名稱
if ("COLUMN_NAME".equalsIgnoreCase(pkmd.getColumnName(i))) {
keySet.add(primaryKeys.getString(i));
}
}
}
Set<String> uniqueKeyMap = new HashSet<>(16);
//獲取唯一索引
if (Constants.DB_TYPE_ORACLE11 == dbType || Constants.DB_TYPE_ORACLE12 == dbType) {
// 由於oracle區分大小寫,在寫oracle的sql語句時,表名或字段是小寫的話,需要添加雙引號
String tableName1 = "\'" + tableName + "\'";
String sql = "select t.*,i.index_type from user_ind_columns t,user_indexes i where t.index_name = i.index_name and i.uniqueness='UNIQUE' and t.table_name = " + tableName1;
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rsKey = pstmt.executeQuery();
while (rsKey.next()) {
String indexName = rsKey.getString("COLUMN_NAME");
uniqueKeyMap.add(indexName);
}
} else {
//mysql數據庫
ResultSet indexInfo = dbMetaData.getIndexInfo(null, null, tableName, false, false);
while (indexInfo.next()) {
String indexName = indexInfo.getString("INDEX_NAME");
//如果爲真則說明索引值不唯一,爲假則說明索引值必須唯一。
boolean nonUnique = indexInfo.getBoolean("NON_UNIQUE");
if (!nonUnique) {
uniqueKeyMap.add(indexName);
}
}
}
rs = dbMetaData.getColumns(null, "%", tableName, "%");
while (rs.next()) {
Map<String, Object> map = new HashMap<>(1 << 4);
map.put("columnName", rs.getString("COLUMN_NAME"));
map.put("columnType", rs.getString("TYPE_NAME"));
map.put("datasize", rs.getInt("COLUMN_SIZE"));
map.put("remarks", rs.getString("REMARKS"));
// 默認值
map.put("columnDefault", rs.getString("COLUMN_DEF"));
// 是否允許爲null, NO:不允許空,YES:可以爲空,空: 不確定
map.put("isNullable", rs.getString("IS_NULLABLE"));
// 是否主鍵
map.put("key", keySet.contains(map.get("columnName")) ? Constants.IS_KEY : Constants.NOT_KEY);
map.put("uniqueKey", uniqueKeyMap.contains(rs.getString("COLUMN_NAME")) ? Constants.IS_UNIQUE_KEY : Constants.NOT_UNIQUE_KEY);
columns.add(map);
}
if (!columns.isEmpty()) {
tableColumns.put(tableName, columns);
}
}
} catch (Exception e) {
LoggerUtil.warn("get columns by table list happened exception, detail:{}", Utils.getStackTrace(e));
throw new ServiceException(RetCode.DB_CONN_ERROR, "failed to get columns by table list");
} finally {
safeClose(rs, conn);
}
return tableColumns;
}