此程序實現將mysql數據庫的模式信息展示出來。下面我簡要地說明一下。
1.樹形結構的實現。
SimplePanel pl=new SimplePanel(); private void buildFrameLayout(){ try{ pane = getContentPane(); //關閉面板 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //BorderLayout佈局管理器 JPanel panel = new JPanel(); final JScrollPane scrollPane = new JScrollPane(); //panel.setBounds(24, 10, 173, 317); panel.add(scrollPane); //初始化根節點 DefaultMutableTreeNode root=new DefaultMutableTreeNode(connection.getCatalog()); //獲得表名 Vector<Object> vector = getTableNames(); DefaultMutableTreeNode menu_accp = null; for(int i = 0; i < vector.size(); i++){ String strName = (String)vector.get(i); //初始化枝節點 menu_accp = new DefaultMutableTreeNode(strName); Vector<Object> vectorColumn = getColumnNames(strName); DefaultMutableTreeNode menu_accp_son = null; //添加枝節點數據 root.add(menu_accp); for(int j = 0; j < vectorColumn.size(); j++){ //初始化葉子節點 menu_accp_son = new DefaultMutableTreeNode((String)vectorColumn.get(j)); //添加葉子節點數據 menu_accp.add(menu_accp_son); } } tree = new JTree(root); TreeSelectionModel model = tree.getSelectionModel(); //一次只能選擇一個樹節點 model.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); //顯示樹 scrollPane.setViewportView(tree); pane.add(panel,BorderLayout.WEST); //註冊點擊節點事件 tree.addTreeSelectionListener(new TreeSelectionListener() { public void valueChanged(TreeSelectionEvent e) { DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree .getLastSelectedPathComponent(); // 可選用戶對象 Object nodeInfo = node.getUserObject(); if (node.getLevel()==0) { //根節點不處理 } else if (node.getLevel()==1){ //枝節點 pl.getPanel(connection, nodeInfo.toString(),node.getParent().toString(),node.getLevel()); } else { //葉子節點 pl.getPanel(connection, nodeInfo.toString(),node.getParent().toString(),node.getLevel()); } } }); pane.add(pl,BorderLayout.CENTER); }catch(Exception e){e.printStackTrace();} }
2.信息展示的實現。
public ColumnModel(Connection connection, String selectTable) throws SQLException { Statement stmt = connection.createStatement(); // 執行數據查找 ResultSet rset = stmt.executeQuery("SELECT * FROM " + selectTable); // 結果集元數據 ResultSetMetaData rsmd = rset.getMetaData(); // 列長 int count = rsmd.getColumnCount(); String[] tableHeads = { "屬性ID", "屬性名" }; // 將表格頭轉換過向量類型,以備表格模型使用 columnHeaders = new Vector<Object>(); for (int i = 0; i < tableHeads.length; i++) { columnHeaders.add(tableHeads[i]); } tableData = new Vector<Object>(count); for (int i = 1; i <= count; i++) { Vector<Object> rowData = new Vector<Object>(count); rowData.add(i); rowData.add(rsmd.getColumnName(i)); tableData.addElement(rowData); } } public ColumnModel(Connection connection, String selectNode, String parentNode) throws SQLException { Statement stmt = connection.createStatement(); // 執行數據查找 ResultSet rset = stmt.executeQuery("SELECT * FROM " + parentNode); // 結果集元數據 ResultSetMetaData rsmd = rset.getMetaData(); // 列長 int count = rsmd.getColumnCount(); String[] tableHeads = { "屬性ID", "數據類型", "(最大)長度", "小數位" }; // 將表格頭轉換過向量類型,以備表格模型使用 columnHeaders = new Vector<Object>(); for (int i = 0; i < tableHeads.length; i++) { columnHeaders.add(tableHeads[i]); } tableData = new Vector<Object>(count); int strInt = 0; for (int i = 1; i <= count; i++) { if (rsmd.getColumnName(i).equals(selectNode)) { strInt = i; break; } } Vector<Object> rowData = new Vector<Object>(count); rowData.add(strInt); rowData.add(rsmd.getColumnTypeName(strInt)); rowData.add(rsmd.getColumnDisplaySize(strInt)); rowData.add(rsmd.getPrecision(strInt)); tableData.addElement(rowData); } //======================================================= public RowModel(Connection connection, String selectTable) throws SQLException { // 執行數據查找 DatabaseMetaData dbMetaData = connection.getMetaData(); // 結果集元數據 // ResultSetMetaData rsmd = rset.getMetaData(); // 獲取表的主外鍵的描述 ResultSet tablePrimaryKeyInfo = dbMetaData.getPrimaryKeys(null, null, selectTable); // 列長 int count = 3; String[] tableHeads = { "鍵名", "鍵屬性(組)", "鍵類型" }; // 將表格頭轉換過向量類型,以備表格模型使用 columnHeaders = new Vector<Object>(); for (int i = 0; i < tableHeads.length; i++) { columnHeaders.add(tableHeads[i]); } String strTest = "("; String strTest1 = ""; while (tablePrimaryKeyInfo.next()) { strTest += tablePrimaryKeyInfo.getString("COLUMN_NAME") + " "; strTest1 = tablePrimaryKeyInfo.getString("PK_NAME"); } strTest = strTest.trim().replace(' ', ',') + ")"; tableData = new Vector<Object>(count); Vector<Object> rowData = new Vector<Object>(count); rowData.add("PK_INTER"); rowData.add(strTest); rowData.add(strTest1); tableData.addElement(rowData); } public RowModel(Connection connection, String selectNode, String parentNode) throws SQLException { Statement stmt = connection.createStatement(); // 執行數據查找 ResultSet rset = stmt.executeQuery("SELECT * FROM " + parentNode); // 結果集元數據 ResultSetMetaData rsmd = rset.getMetaData(); DatabaseMetaData dbMetaData = connection.getMetaData(); ResultSet columnInfo = dbMetaData.getColumns(null, null, parentNode, selectNode); // 列長 int count = rsmd.getColumnCount(); String[] tableHeads = { "屬性ID", "DEFAULT", "NOT NULL" }; // 將表格頭轉換過向量類型,以備表格模型使用 columnHeaders = new Vector<Object>(); for (int i = 0; i < tableHeads.length; i++) { columnHeaders.add(tableHeads[i]); } tableData = new Vector<Object>(count); int strInt = 0; for (int i = 1; i <= count; i++) { if (rsmd.getColumnName(i).equals(selectNode)) { strInt = i; break; } } while (columnInfo.next()) { Vector<Object> rowData = new Vector<Object>(count); rowData.add(strInt); rowData.add(columnInfo.getString("COLUMN_DEF")); rowData.add(columnInfo.getString("IS_NULLABLE")); tableData.addElement(rowData); } } //======================================================= public ComponentModel(Connection connection, String selectTable) throws SQLException { // 執行數據查找 DatabaseMetaData dbMetaData = connection.getMetaData(); ResultSet tableForeignKeyInfo = dbMetaData.getImportedKeys(null, null, selectTable); String[] tableHeads = { "外鍵", "外鍵屬性", "引用的關係", "引用的屬性", "更新規則", "刪除規則" }; // 將表格頭轉換過向量類型,以備表格模型使用 columnHeaders = new Vector<Object>(); for (int i = 0; i < tableHeads.length; i++) { columnHeaders.add(tableHeads[i]); } // 列長 int count = columnHeaders.size(); tableData = new Vector<Object>(count); while (tableForeignKeyInfo.next()) { Vector<Object> rowData = new Vector<Object>(count); rowData.add("FK_ENTER"); rowData.add(tableForeignKeyInfo.getString("FKCOLUMN_NAME")); rowData.add(tableForeignKeyInfo.getString("PKTABLE_NAME")); rowData.add(tableForeignKeyInfo.getString("PKCOLUMN_NAME")); short sht = Short.parseShort(tableForeignKeyInfo .getString("UPDATE_RULE")); String strTest = ""; switch (sht) { // 如果已經被導入,則不允許更新主鍵 case 3: strTest = "importedNoAction"; break; // 將導入的鍵更改爲與主鍵更新一致 case 0: strTest = "importedKeyCascade"; break; // 如果已更新導入鍵的主鍵,則將導入鍵更改爲 NULL case 2: strTest = "importedKeySetNull"; break; // 如果已更新導入鍵的主鍵,則將導入鍵更改爲默認值 case 4: strTest = "importedKeySetDefault"; break; // 與 importedKeyNoAction 相同(爲了與 ODBC 2.x 兼容) case 1: strTest = "importedKeyRestrict"; break; default: break; } rowData.add(strTest); short sht1 = Short.parseShort(tableForeignKeyInfo .getString("DELETE_RULE")); String strTest1 = ""; switch (sht1) { case 3: strTest1 = "importedKeyNoAction"; break; case 0: strTest1 = "importedKeyCascade"; break; case 2: strTest1 = "importedKeySetNull"; break; case 4: strTest1 = "importedKeyRestrict"; break; case 1: strTest1 = "importedKeySetDefault"; break; default: break; } rowData.add(strTest1); tableData.addElement(rowData); } } public ComponentModel(Connection connection, String selectNode, String parentNode) throws SQLException { Statement stmt = connection.createStatement(); // 執行數據查找 ResultSet rset = stmt.executeQuery("SELECT * FROM " + parentNode); // 結果集元數據 ResultSetMetaData rsmd = rset.getMetaData(); // 列長 int count = rsmd.getColumnCount(); String[] tableHeads = { "屬性ID", "是否只讀", "是否只寫" }; // 將表格頭轉換過向量類型,以備表格模型使用 columnHeaders = new Vector<Object>(); for (int i = 0; i < tableHeads.length; i++) { columnHeaders.add(tableHeads[i]); } tableData = new Vector<Object>(count); int strInt = 0; for (int i = 1; i <= count; i++) { if (rsmd.getColumnName(i).equals(selectNode)) { strInt = i; break; } } Vector<Object> rowData = new Vector<Object>(count); rowData.add(strInt); rowData.add(rsmd.isReadOnly(strInt)); rowData.add(rsmd.isWritable(strInt)); tableData.addElement(rowData); }
最終的實現效果如下:
一、架構圖**** 二、Nginx**** 用於做服務的反向代理。 三、網關**** PaaS平臺所有服務統一入口,包含token鑑權功能。 四、開放平臺**** 對第三方平臺開放的服務入口。 五、MQTT**** MQTT用於設備消息通
本文闡述了某商業銀行如何利用 TiCDC Syncpoint 功能,在 TiDB 平臺上構建一個既能處理實時交易又能進行準實時計算的一體化架構,用以優化其零售資格業務系統的實踐。通過遷移到 TiDB 並巧妙應用 Syncpoint,該銀行成
本文介紹了某省婦幼健康管理系統的建設和數據庫架構優化的過程。原有的數據庫架構使用了 StarRocks 作爲分析層,但隨着業務的發展,這套架構暴露出諸多痛點,不再適應婦幼業務的需求。爲解決這些問題,該系統選擇了將原有架構中的 StarRoc
引言 在數字化浪潮的推動下,數據庫技術已成爲支撐數字經濟的堅實基石。騰訊雲 TVP《技術指針》聯合《明說三人行》特別策劃的直播系列——【中國數據庫前世今生】,我們將通過五期直播,帶您穿越五個十年,深入探討每個時代的數據庫演變
查詢出來的日期數據比數據庫中日期數據晚8小時,一開始很懵逼,IDEA 和 server 時區都一樣呢!後來發現: jdbcUrl=jdbc:mysql://localhost:hentai?useUnicode=true&character
比對結論 如果只能單機部署的話,clickhouse基本無敵。 如果集羣化,starRocks可以替換clickhouse,但支持的函數會相對少一些(clickhouse有不少自定義函數) 信息比對 功能 clickhouse
一、架構設計流程 架構的設計的是爲了降低整體的複雜性,那麼架構設計的第一步就是熟悉業務,識別其中的核心訴求,僅考慮技術的話就是識別複雜度。 1.1 識別複雜度 架構的複雜度主要來源於第一節中介紹的“高性能”“高可用”“可擴展”等幾個方面,實
一、架構設計的主要目的 爲了解決軟件系統複雜度帶來的問題 二、複雜性來源 軟件的架構設計是一個非常複雜的過程;基於業務&技術現狀、公司成本、團隊規模、團隊技術能力、近三年業務發展規模預測、技術發展趨勢等條件篩選出合適的技術、編寫多種架構設計
✍ 專欄小結 1 月 3 日,我在社區發佈事務模塊的第一篇文章;4 月 17 日,發佈了最後一篇文章。歷時 3 個半月,用 14 篇文章對事務模塊做了比較全面的介紹。 本文我們對事務模塊已經發布的 14 篇文章做個簡單回顧。 01 期《事
除了 MySQL 本身之外,如何分析定位其他因素的可能性? 作者:龔唐傑,愛可生 DBA 團隊成員,主要負責 MySQL 技術支持,擅長 MySQL、PG、國產數據庫。 愛可生開源社區出品,原創內容未經授權不得隨意使用,轉載請聯繫小編並註
DataGear 企業版 1.1.0 已發佈,歡迎瞭解試用! http://datagear.tech/pro/ DataGear 5.0.0 發佈,核心功能重構,新增圖表追加更新模式,具體更新內容如下: 重構:【圖表數據集】概念和設計
DataGear 企業版 1.1.0 正式發佈,歡迎大家瞭解試用! http://datagear.tech/pro/ 企業版 1.1.0 新增了MQTT、WebSocket實時數據集功能,新增了Redis、MongoDB數據集功能,具體更
前端面試題 - null是原始類型,但爲什麼typeof null的結果是object? 造成這個結果的原因是null的內存地址是以000開頭,而js會將000開頭的內存地址視爲object。 通過isNull()來判斷一個值是不是null
DHTMLX Suite UI 組件庫允許您更快地構建跨平臺、跨瀏覽器 Web 和移動應用程序。它包括一組豐富的即用式 HTML5 組件,這些組件可以輕鬆組合到單個應用程序界面中。 DHTMLX Gantt是用於跨瀏覽器和跨平臺應用程序的功
本文分享自華爲雲社區《GaussDB(DWS)向量化執行引擎詳解》,作者: yd_212508532。 前言 適用版本:【基線功能】 傳統的行執行引擎大多采用一次一元組的執行模式,這樣在執行過程中CPU大部分時間並沒有用來處理數據,更