package com.xiruibin.db.util; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.util.LinkedHashMap; import java.util.Map; import com.xiruibin.DBDriverAutoLoad; import com.xiruibin.DBInfo; import com.xiruibin.Log; import com.xiruibin.Parameters; public final class DBUtils { private Parameters parameters = null; private Connection conn = null; private Statement stm = null; private ResultSet rs = null; private Map<String, String> tableinfo = new LinkedHashMap<String, String>(); public DBUtils(Parameters parameters) { this.parameters = parameters; DBDriverAutoLoad.load(); } public Map<String, LinkedHashMap<String, LinkedHashMap<String, String>>> getDatabaseInfo() throws Exception { Map<String, LinkedHashMap<String, LinkedHashMap<String, String>>> info = new LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, String>>>(); conn = DriverManager.getConnection( DBInfo.getCurrentDriverUrl(parameters.getHost(), parameters.getPort(), parameters.getDatabase()), parameters.getUser(), parameters.getPassword()); DatabaseMetaData dmd = conn.getMetaData(); String schema = null; if (parameters.getSchema() != null) { schema = parameters.getSchema().toUpperCase(); } ResultSet dbrs = dmd.getTables(null, schema, null, new String[] { "TABLE" }); int n = 0; while (dbrs.next()) { String table_name = dbrs.getString("TABLE_NAME"); if (!parameters.getTables().isEmpty()) { if (!parameters.getTables().contains(table_name)) { continue; } } // if (n>27) // break; LinkedHashMap<String, LinkedHashMap<String, String>> tablesMap = info .get(table_name); if (tablesMap == null) { tablesMap = new LinkedHashMap<String, LinkedHashMap<String, String>>(); } // tablesMap.put(column_name, columnInfo); Log.info("===========================" + dbrs.getString("TABLE_NAME") + "==========================="); ResultSetMetaData rsmd = dbrs.getMetaData(); String remark = dbrs.getString("REMARKS"); if (remark != null && !"null".equals(remark)) { tableinfo.put(dbrs.getString("TABLE_NAME"), remark); } else { tableinfo.put(dbrs.getString("TABLE_NAME"), ""); } for (int i = 1; i <= rsmd.getColumnCount(); i++) { rsmd.getColumnName(i); Log.info(rsmd.getColumnName(i) + ":" + dbrs.getString(i)); } Log.info("----------------------------------------------------------"); ResultSet rsc = getColumns(table_name); ResultSetMetaData rscmd = rsc.getMetaData(); while (rsc.next()) { String column_name = rsc.getString("COLUMN_NAME"); LinkedHashMap<String, String> columnInfo = tablesMap .get(column_name); if (columnInfo == null) columnInfo = new LinkedHashMap<String, String>(); try { columnInfo.put("column_comment", rsc.getString("REMARKS")); } catch (SQLException e) { columnInfo.put("column_comment", ""); } String typeName = rsc.getString("TYPE_NAME"); if ("CHAR".equals(typeName) || "VARCHAR".equals(typeName)) { columnInfo .put("column_type", typeName + "(" + rsc.getString("COLUMN_SIZE") + ")"); } else { columnInfo.put("column_type", typeName); } String def = String.valueOf(rsc.getObject("COLUMN_DEF")); if ("null".equals(def)) { columnInfo.put("column_default", ""); } else { columnInfo.put("column_default", def); } String key = rsc.getString("IS_AUTOINCREMENT"); if ("YES".equals(key)) { columnInfo.put("column_si", "√"); } else { columnInfo.put("column_si", ""); } if ("YES".equals(key)) { columnInfo.put("column_key", "√"); } else { columnInfo.put("column_key", ""); } if ("YES".equals(rsc.getString("IS_NULLABLE"))) { columnInfo.put("is_nullable", ""); } else { columnInfo.put("is_nullable", "X"); } StringBuilder sb = new StringBuilder(); for (int j = 1; j <= rscmd.getColumnCount(); j++) { sb.append(rscmd.getColumnName(j)).append("[") .append(rsc.getObject(j)).append("]").append(" "); } Log.info(sb.toString()); tablesMap.put(column_name, columnInfo); } info.put(table_name, tablesMap); Log.info(""); n++; } stm = conn.createStatement(); releaseDBResource(); return info; } public Map<String, String> getTableInfo() { return tableinfo; } public ResultSet getColumns(String tableName) { try { DatabaseMetaData db2dmd = conn.getMetaData(); String schema = null; if (parameters.getSchema() != null) { schema = parameters.getSchema().toUpperCase(); } return db2dmd.getColumns(null, schema, tableName, null); } catch (SQLException e) { e.printStackTrace(); } return null; } /** * 释放资源 * * @throws SQLException */ public void releaseDBResource() throws SQLException { if (null != rs) { rs.close(); } if (null != stm) { stm.close(); } if (null != conn) { conn.close(); } } }