此程序實現將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); }
最終的實現效果如下:
詳解 binlog 時間戳與 exec_time 的關係。 作者:李錫超,蘇商銀行DBA,負責數據庫和中間件運維和建設。擅長 MySQL、Python、Oracle,愛好騎行、技術研究和分享。 愛可生開源社區出品,原創內容未經授權不得隨意
01 背 景 播放鏈路是愛奇藝最重要的業務,鏈路穩定性極其重要,隨着愛奇藝用戶的不斷增長和熱播劇集的推廣,播放鏈路往往面臨着難以預估的用戶流量的突增,考
安裝MYSQL時的一系列三大問題與三大解決方法 問題一: 問題二: 問題三: 問題一: 在安裝時候輸入 net start mysql 時候報錯爲: net不是內部或外部命令也不是可運行。 解決方法: 環境變量的問題
MySQL的監控方式也有很多種: 慢查詢日誌slow_log 優點:MySQL自帶,記錄的慢SQL語句完整;缺點:需要登錄mysql服務器;如果slow_log文件太大,還需要利用其他工具分析日誌,比如mysqldumpslow; p
mysql只有在事務提交的時候纔會記錄binlog日誌,此時日誌還在內存中,那binlog是什麼時候被刷到磁盤中的呢? mysql通過sync_binlog控制刷盤,取值範圍0~n 0:不強制要求刷盤,由系統自行判斷什麼時候將binlog寫
1.hive 1.1 解壓 tar -zxf apache-hive-1.2.2-bin.tar.gz -C .. mv apache-hive-1.2.2-bin/ hive-1.2.2 1.2 修改配置
大晚上不睡覺、枸杞泡起來@我 一個月之前、自從入了樹莓派4b 8g板之後、就無法自拔,上班除了開發業務代碼和搭建內部UI組件庫之外,就是不亦樂乎的學習docker、mysql、mongodb、php、python、frp等,採購了阿里雲E
瞭解如何可視化 MySQL 連接的內存使用情況。 作者:Benjamin Dicken 本文和封面來源:https://planetscale.com/blog/,愛可生開源社區翻譯。 本文約 3000 字,預計閱讀需要 10 分鐘。
背景 最近領導分配了個任務,測試sit環境一些功能相比之前慢了許多,需要優化一下。 問題排查過程 瀏覽器F12查看相關接口的響應,看到底是哪個接口反應慢,根據互聯網的要求,頁面3秒還沒有顯示出來,用戶體驗會非常差。 查看相關代碼的提交
去年寫過一篇《Topic數量太多!RocketMQ炸了!》,大家評價還不錯。 結果,2024年的開頭,我們的RocketMQ又炸了! 1、問題現象 先說明下RocketMQ版本, 4.6.0的老版本了。 線下環境客戶端啓動會頻
作者:戴濤 導讀 近日,平凱星辰解決方案技術部總經理戴濤在 2024 數據技術嘉年華活動中,做了主題爲“構建面向未來的金融核心系統”的分享,本文爲戴濤演講實錄的全文。 文章分析了中國金融行業的發展趨勢,並且基於這些趨勢對數據庫選擇從架構、運
本文分享自華爲雲社區《GaussDB SQL基本語法示例-CASE表達式》,作者:Gauss松鼠會小助手2。 一、前言 SQL是用於訪問和處理數據庫的標準計算機語言。GaussDB支持SQL標準(默認支持SQL2、SQL3和SQL4的主要
原文:https://blog.fengjx.com/pages/d6f092 介紹 go-kit的分層設計可以看成是一個洋蔥,有許多層。這些層可以劃分爲我們的三個領域。 Service: 最內部的服務領域是基於你特定服務定義的,也是
原文:https://blog.fengjx.com/pages/40737e 介紹 go-kit 是一個微服務開發工具集,並不算一個完整的框架。根據工程實踐總結的一套開發規範,解決分佈式開發中的常見問題,它同樣也適用於單體服務開發。
二叉樹 「二叉樹 binary tree」是一種非線性數據結構,代表“祖先”與“後代”之間的派生關係,體現了“一分爲二” 的分治邏輯。與鏈表類似,二叉樹的基本單元是節點,每個節點包含值、左子節點引用和右子節點引用。 每個節點都有兩個引