📄 schemaframe.java
字号:
package schemaview;import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.table.*;import java.sql.*;import com.borland.dbswing.*;import javax.swing.tree.*;import javax.swing.event.*;import com.borland.dx.sql.dataset.*;/** * Title: 查看数据库结构 * Description: 这是一个用来浏览数据库结构的小工具 * Copyright: Copyright (c) 2001 * Company: * @author * @version 1.0 */public class SchemaFrame extends JFrame { JPanel contentPane; BorderLayout borderLayout1 = new BorderLayout(); JLabel jStatusBar = new JLabel(); JPanel jPanelLabel = new JPanel(); GridLayout gridLayout1 = new GridLayout(); JLabel jLabel1 = new JLabel(); JLabel jLabel2 = new JLabel(); JPanel jPanelMain = new JPanel(); GridLayout gridLayout2 = new GridLayout(); JScrollPane jScrollPaneLeft = new JScrollPane(); JScrollPane jScrollPaneRight = new JScrollPane(); JdbTable jdbTable = new JdbTable(); JTree jTreeSchema; DefaultMutableTreeNode root,tablesNodes,viewsNodes,systablesNodes,proceduresNodes,synonymsNodes; DefaultTreeModel model; Database db = new Database(); boolean tabLoaded=false; boolean sysTabLoaded=false; boolean procLoaded=false; boolean viewLoaded=false; boolean synLoaded=false; DatabaseMetaData dbSchemaData; /**Construct the frame*/ public SchemaFrame() { enableEvents(AWTEvent.WINDOW_EVENT_MASK); try { jbInit(); } catch(Exception e) { e.printStackTrace(); } } /**Component initialization*/ private void jbInit() throws Exception { //setIconImage(Toolkit.getDefaultToolkit().createImage(SchemaFrame.class.getResource("[Your Icon]"))); contentPane = (JPanel) this.getContentPane(); jStatusBar.setText(" "); contentPane.setLayout(borderLayout1); this.setSize(new Dimension(400, 300)); this.setTitle("数据库结构浏览器"); jPanelLabel.setLayout(gridLayout1); gridLayout1.setColumns(2); jLabel1.setText("请选取数据库对象"); jLabel2.setText("该对象的属性"); jPanelMain.setLayout(gridLayout2); gridLayout2.setColumns(2); db.setConnection(new com.borland.dx.sql.dataset.ConnectionDescriptor("jdbc:odbc:JavaTest", "sa", "java", false, "sun.jdbc.odbc.JdbcOdbcDriver")); contentPane.add(jStatusBar, BorderLayout.SOUTH); contentPane.add(jPanelLabel, BorderLayout.NORTH); jPanelLabel.add(jLabel1, null); jPanelLabel.add(jLabel2, null); contentPane.add(jPanelMain, BorderLayout.CENTER); jPanelMain.add(jScrollPaneLeft, null); dbSchemaData=db.getMetaData(); initTree(); jdbTable.setVisible(false) ; jScrollPaneLeft.getViewport().add(jTreeSchema, null); jPanelMain.add(jScrollPaneRight, null); jScrollPaneRight.getViewport().add(jdbTable, null); jTreeSchema.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() { public void valueChanged(TreeSelectionEvent e) { jTreeSchema_valueChanged(e); } }); } /**Overridden so we can exit when window is closed*/ protected void processWindowEvent(WindowEvent e) { super.processWindowEvent(e); if (e.getID() == WindowEvent.WINDOW_CLOSING) { System.exit(0); } } void initTree(){ tablesNodes=new DefaultMutableTreeNode("Table"); viewsNodes=new DefaultMutableTreeNode("View"); systablesNodes=new DefaultMutableTreeNode("System Table"); proceduresNodes=new DefaultMutableTreeNode("Procedure"); synonymsNodes=new DefaultMutableTreeNode("Synonym"); root=new DefaultMutableTreeNode("ODBC:JavaTest"); root.add(tablesNodes); root.add(viewsNodes); root.add(systablesNodes); root.add(proceduresNodes); root.add(synonymsNodes); model=new DefaultTreeModel(root); jTreeSchema=new JTree(model); } void jTreeSchema_valueChanged(TreeSelectionEvent e) { TreePath selPath=jTreeSchema.getSelectionPath(); DefaultMutableTreeNode selNode=(DefaultMutableTreeNode)selPath.getLastPathComponent(); if(selNode.equals(tablesNodes)){ if(!tabLoaded) loadTables(tablesNodes,model,dbSchemaData,"TABLE"); tabLoaded=true; } if(selNode.equals(viewsNodes)){ if(!viewLoaded) loadTables(viewsNodes,model,dbSchemaData,"VIEW"); viewLoaded=true; } if(selNode.equals(systablesNodes)){ if(!sysTabLoaded) loadTables(systablesNodes,model,dbSchemaData,"SYSTEM TABLE"); sysTabLoaded=true; } if(selNode.equals(synonymsNodes)){ if(!synLoaded) loadTables(synonymsNodes,model,dbSchemaData,"SYNONYM"); synLoaded=true; } if(selNode.equals(proceduresNodes)){ if(!procLoaded) loadProcs(proceduresNodes,model,dbSchemaData); procLoaded=true; } if(selNode.equals(root)){ disPlayConInfo(); } if(selPath.getPathCount()==2) disPlayChildInfo(selNode); if(selPath.getPathCount()==3) disPlayTabInfo(selNode); if(selPath.getPathCount()==4) disPlayFieldsInfo(selNode); if(selPath.getPathCount()==5) disPlayFieldInfo(selNode); jStatusBar.setText(selNode.toString()+" has "+selNode.getChildCount()+" items" ); } void loadTables(DefaultMutableTreeNode treeNode,DefaultTreeModel treeModel,DatabaseMetaData schemaData,String type){ String types[]=new String[1]; types[0]=type; try{ ResultSet rs=schemaData.getTables(null,null,null,types); if(rs!=null){ while(rs.next() ){ String nodeName=rs.getString("TABLE_NAME").trim(); DefaultMutableTreeNode newNode=new DefaultMutableTreeNode(nodeName); treeModel.insertNodeInto(newNode,treeNode,treeNode.getChildCount()); loadColums(newNode,treeModel,schemaData,nodeName); } } }catch(Exception e){System.out.println(e);} } void loadProcs(DefaultMutableTreeNode treeNode,DefaultTreeModel treeModel,DatabaseMetaData schemaData){ try{ ResultSet rs=schemaData.getProcedures(null,null,null); if(rs!=null){ while(rs.next() ){ String nodeName=rs.getString("PROCEDURE_NAME").trim(); DefaultMutableTreeNode newNode=new DefaultMutableTreeNode(nodeName); treeModel.insertNodeInto(newNode,treeNode,treeNode.getChildCount()); } } }catch(Exception e){System.out.println(e);} } void loadColums(DefaultMutableTreeNode treeNode,DefaultTreeModel treeModel,DatabaseMetaData schemaData,String tableName){ DefaultMutableTreeNode colNode=new DefaultMutableTreeNode("Columns" ); DefaultMutableTreeNode indNode=new DefaultMutableTreeNode("Indexs" ); try{ ResultSet rs=schemaData.getColumns(null,null,tableName,null); if(rs!=null){ while(rs.next() ){ String nodeName=rs.getString("COLUMN_NAME"); DefaultMutableTreeNode newNode=new DefaultMutableTreeNode(nodeName); treeModel.insertNodeInto(newNode,colNode,colNode.getChildCount()); } } if(colNode.getChildCount() >0) treeModel.insertNodeInto(colNode,treeNode,treeNode.getChildCount()); rs=null; rs=schemaData.getIndexInfo(null,null,tableName,false,false); if(rs!=null){ while(rs.next() ){ String nodeName=rs.getString("INDEX_NAME"); if(nodeName!=null){ DefaultMutableTreeNode newNode=new DefaultMutableTreeNode(nodeName.trim()); treeModel.insertNodeInto(newNode,indNode,indNode.getChildCount()); } } } if(indNode.getChildCount() >0) treeModel.insertNodeInto(indNode,treeNode,treeNode.getChildCount()); }catch(Exception e){System.out.println(e);} } void disPlayChildInfo(DefaultMutableTreeNode parentNode){ String row[]=new String[1]; jdbTable.setVisible(false) ; jdbTable.setDataSet(null); DefaultTableModel tableModel=new DefaultTableModel(); tableModel.addColumn(parentNode.toString()); for(int i=1;i<=parentNode.getChildCount() ;i++){ row[0]=parentNode.getChildAt(i-1).toString(); tableModel.addRow(row); } jdbTable.setModel(tableModel); jdbTable.setVisible(true) ; jdbTable.setAutoResizeMode(JdbTable.AUTO_RESIZE_ALL_COLUMNS ); jdbTable.setRowHeaderVisible(false) ; } void disPlayConInfo(){ String row[]=new String[2]; jdbTable.setVisible(false) ; jdbTable.setDataSet(null); DefaultTableModel tableModel=new DefaultTableModel(); tableModel.addColumn("属性"); tableModel.addColumn("值"); try{ row[0]="URL"; row[1]=dbSchemaData.getURL(); tableModel.addRow(row); row[0]="ReadOnly"; row[1]=dbSchemaData.isReadOnly()?"yes":"no"; tableModel.addRow(row); row[0]="Database Product"; row[1]=dbSchemaData.getDatabaseProductName(); tableModel.addRow(row); row[0]="Product Version"; row[1]=dbSchemaData.getDatabaseProductVersion(); tableModel.addRow(row); row[0]="Driver"; row[1]=dbSchemaData.getDriverName(); tableModel.addRow(row); row[0]="DriverVersion"; row[1]=dbSchemaData.getDriverVersion(); tableModel.addRow(row); }catch(Exception e){} jdbTable.setModel(tableModel); jdbTable.setVisible(true) ; jdbTable.setAutoResizeMode(JdbTable.AUTO_RESIZE_ALL_COLUMNS ); jdbTable.setRowHeaderVisible(false) ; } void disPlayTabInfo(DefaultMutableTreeNode tabNode){ String row[]=new String[2]; String tableName=tabNode.toString(); String types[]=new String[1]; types[0]=tabNode.getParent().toString(); jdbTable.setVisible(false) ; jdbTable.setDataSet(null); DefaultTableModel tableModel=new DefaultTableModel(); tableModel.addColumn("属性"); tableModel.addColumn("值"); try{ ResultSet rs=dbSchemaData.getTables(null,null,tableName,types); ResultSetMetaData rsmd=rs.getMetaData(); rs.next(); for(int i=1;i<=rsmd.getColumnCount() ;i++){ row[0]=rsmd.getColumnName(i); row[1]=rs.getString(row[0]); tableModel.addRow(row); } }catch(Exception e){} jdbTable.setModel(tableModel); jdbTable.setVisible(true) ; jdbTable.setAutoResizeMode(JdbTable.AUTO_RESIZE_ALL_COLUMNS ); jdbTable.setRowHeaderVisible(false) ; } void disPlayFieldsInfo(DefaultMutableTreeNode tabNode){ String tableName=tabNode.getParent().toString(); String typeName=tabNode.toString(); jdbTable.setVisible(false) ; jdbTable.setDataSet(null); try{ ResultSet rs; if(typeName.toUpperCase().equals("INDEXS") ) rs=dbSchemaData.getIndexInfo(null,null,tableName,false,false); else rs=dbSchemaData.getColumns(null,null,tableName,null); jdbTable.setDataSet(db.resultSetToDataSet(rs)); }catch(Exception e){} jdbTable.setVisible(true) ; jdbTable.setAutoResizeMode(JdbTable.AUTO_RESIZE_OFF); jdbTable.setRowHeaderVisible(false) ; } void disPlayFieldInfo(DefaultMutableTreeNode fieldNode){ String row[]=new String[2]; String tableName=fieldNode.getParent().getParent().toString(); String typeName=fieldNode.getParent().toString(); String fieldName=fieldNode.toString(); jdbTable.setVisible(false) ; jdbTable.setDataSet(null); DefaultTableModel tableModel=new DefaultTableModel(); tableModel.addColumn("属性"); tableModel.addColumn("值"); try{ ResultSet rs; if(typeName.toUpperCase().equals("INDEXS") ) rs=dbSchemaData.getIndexInfo(null,null,tableName,false,false); else rs=dbSchemaData.getColumns(null,null,tableName,fieldName); ResultSetMetaData rsmd=rs.getMetaData(); while(rs.next()){ if(typeName.toUpperCase().equals("INDEXS") ){ String indexName=rs.getString("INDEX_NAME"); if(indexName==null) continue; indexName=indexName.toUpperCase(); if(!indexName.equals(fieldName.toUpperCase())) continue; row[0]="NON_UNIQUE"; row[1]=rs.getString(row[0]); tableModel.addRow(row); row[0]="COLUMN_NAME"; row[1]=rs.getString(row[0]); tableModel.addRow(row); row[0]="ASC_OR_DESC"; row[1]=rs.getString(row[0]); tableModel.addRow(row); } else{ row[0]="COLUMN_NAME"; row[1]=rs.getString(row[0]); tableModel.addRow(row); row[0]="TYPE_NAME"; row[1]=rs.getString(row[0]); tableModel.addRow(row); row[0]="COLUMN_SIZE"; row[1]=rs.getString(row[0]); tableModel.addRow(row); row[0]="DECIMAL_DIGITS"; row[1]=rs.getString(row[0]); tableModel.addRow(row); row[0]="IS_NULLABLE"; row[1]=rs.getString(row[0]); tableModel.addRow(row); row[0]="SQL_DATA_TYPE"; row[1]=rs.getString(row[0]); tableModel.addRow(row); } } }catch(Exception e){System.out.println(e);} jdbTable.setModel(tableModel); jdbTable.setVisible(true) ; jdbTable.setAutoResizeMode(JdbTable.AUTO_RESIZE_ALL_COLUMNS); jdbTable.setRowHeaderVisible(false) ; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -