Java/Database SQL JDBC/Database Viewer

Материал из Java эксперт
Перейти к: навигация, поиск

Database Browser

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
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.Vector;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;
public class DatabaseBrowser extends JFrame {
  protected Connection connection;
  protected JComboBox catalogBox;
  protected JComboBox schemaBox;
  protected JComboBox tableBox;
  protected JTable table = new JTable();
  public static void main(String[] args) throws Exception {
    new sun.jdbc.odbc.JdbcOdbcDriver();
    DatabaseBrowser db = new DatabaseBrowser();
  }
  public DatabaseBrowser() throws Exception {
    ConnectionDialog cd = new ConnectionDialog(this);
    connection = cd.getConnection();
    Container pane = getContentPane();
    pane.add(getSelectionPanel(), BorderLayout.NORTH);
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    refreshTable();
    pane.add(new JScrollPane(table), BorderLayout.CENTER);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(600, 450);
    setVisible(true);
  }
  protected JPanel getSelectionPanel() {
    JPanel panel = new JPanel();
    panel.add(new JLabel("Catalog"));
    panel.add(new JLabel("Schema"));
    panel.add(new JLabel("Table"));
    catalogBox = new JComboBox();
    populateCatalogBox();
    panel.add(catalogBox);
    schemaBox = new JComboBox();
    populateSchemaBox();
    panel.add(schemaBox);
    tableBox = new JComboBox();
    populateTableBox();
    panel.add(tableBox);
    catalogBox.addItemListener(new ItemListener() {
      public void itemStateChanged(ItemEvent event) {
        String newCatalog = (String) (catalogBox.getSelectedItem());
        try {
          connection.setCatalog(newCatalog);
        } catch (Exception e) {
        }
        populateSchemaBox();
        populateTableBox();
        refreshTable();
      }
    });
    schemaBox.addItemListener(new ItemListener() {
      public void itemStateChanged(ItemEvent event) {
        populateTableBox();
        refreshTable();
      }
    });
    tableBox.addItemListener(new ItemListener() {
      public void itemStateChanged(ItemEvent event) {
        refreshTable();
      }
    });
    return panel;
  }
  protected void populateCatalogBox() {
    try {
      DatabaseMetaData dmd = connection.getMetaData();
      ResultSet rset = dmd.getCatalogs();
      Vector values = new Vector();
      while (rset.next()) {
        values.addElement(rset.getString(1));
      }
      rset.close();
      catalogBox.setModel(new DefaultComboBoxModel(values));
      catalogBox.setSelectedItem(connection.getCatalog());
      catalogBox.setEnabled(values.size() > 0);
    } catch (Exception e) {
      catalogBox.setEnabled(false);
    }
  }
  protected void populateSchemaBox() {
    try {
      DatabaseMetaData dmd = connection.getMetaData();
      ResultSet rset = dmd.getSchemas();
      Vector values = new Vector();
      while (rset.next()) {
        values.addElement(rset.getString(1));
      }
      rset.close();
      schemaBox.setModel(new DefaultComboBoxModel(values));
      schemaBox.setEnabled(values.size() > 0);
    } catch (Exception e) {
      schemaBox.setEnabled(false);
    }
  }
  protected void populateTableBox() {
    try {
      String[] types = { "TABLE" };
      String catalog = connection.getCatalog();
      String schema = (String) (schemaBox.getSelectedItem());
      DatabaseMetaData dmd = connection.getMetaData();
      ResultSet rset = dmd.getTables(catalog, schema, null, types);
      Vector values = new Vector();
      while (rset.next()) {
        values.addElement(rset.getString(3));
      }
      rset.close();
      tableBox.setModel(new DefaultComboBoxModel(values));
      tableBox.setEnabled(values.size() > 0);
    } catch (Exception e) {
      tableBox.setEnabled(false);
    }
  }
  protected void refreshTable() {
    String catalog = (catalogBox.isEnabled() ? catalogBox.getSelectedItem().toString() : null);
    String schema = (schemaBox.isEnabled() ? schemaBox.getSelectedItem().toString() : null);
    String tableName = (String) tableBox.getSelectedItem();
    if (tableName == null) {
      table.setModel(new DefaultTableModel());
      return;
    }
    String selectTable = (schema == null ? "" : schema + ".") + tableName;
    if (selectTable.indexOf(" ") > 0) {
      selectTable = "\"" + selectTable + "\"";
    }
    try {
      Statement stmt = connection.createStatement();
      ResultSet rset = stmt.executeQuery("SELECT * FROM " + selectTable);
      table.setModel(new ResultSetTableModel(rset));
    } catch (Exception e) {
    }
  }

}
class ConnectionDialog extends JDialog {
  protected JTextField useridField;
  protected JTextField passwordField;
  protected JTextField urlField;
  protected boolean canceled;
  protected Connection connect;
  public ConnectionDialog(JFrame f) {
    super(f, "Connect To Database", true);
    buildDialogLayout();
    setSize(300, 200);
  }
  public Connection getConnection() {
    setVisible(true);
    return connect;
  }
  protected void buildDialogLayout() {
    Container pane = getContentPane();
    pane.add(new JLabel("Userid:"));
    pane.add(new JLabel("Password:"));
    pane.add(new JLabel("URL:"));
    useridField = new JTextField(10);
    pane.add(useridField);
    passwordField = new JTextField(10);
    pane.add(passwordField);
    urlField = new JTextField(15);
    pane.add(urlField);
    pane.add(getButtonPanel());
  }
  protected JPanel getButtonPanel() {
    JPanel panel = new JPanel();
    JButton btn = new JButton("Ok");
    btn.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent event) {
        onDialogOk();
      }
    });
    panel.add(btn);
    return panel;
  }
  protected void onDialogOk() {
    if (attemptConnection()) {
      setVisible(false);
    }
  }
  protected boolean attemptConnection() {
    try {
      connect = DriverManager.getConnection(urlField.getText(), useridField.getText(),
          passwordField.getText());
      return true;
    } catch (Exception e) {
      JOptionPane.showMessageDialog(this, "Error connecting to " + "database: " + e.getMessage());
    }
    return false;
  }
}
class ResultSetTableModel extends AbstractTableModel {
  protected Vector columnHeaders;
  protected Vector tableData;
  public ResultSetTableModel(ResultSet rset) throws SQLException {
    Vector rowData;
    ResultSetMetaData rsmd = rset.getMetaData();
    int count = rsmd.getColumnCount();
    columnHeaders = new Vector(count);
    tableData = new Vector();
    for (int i = 1; i <= count; i++) {
      columnHeaders.addElement(rsmd.getColumnName(i));
    }
    while (rset.next()) {
      rowData = new Vector(count);
      for (int i = 1; i <= count; i++) {
        rowData.addElement(rset.getObject(i));
      }
      tableData.addElement(rowData);
    }
  }
  public int getColumnCount() {
    return columnHeaders.size();
  }
  public int getRowCount() {
    return tableData.size();
  }
  public Object getValueAt(int row, int column) {
    Vector rowData = (Vector) (tableData.elementAt(row));
    return rowData.elementAt(column);
  }
  public boolean isCellEditable(int row, int column) {
    return false;
  }
  public String getColumnName(int column) {
    return (String) (columnHeaders.elementAt(column));
  }
}