Mega Code Archive

 
Categories / Java / Database SQL JDBC
 

This program uses metadata to display arbitrary tables in a database

/*    This program is a part of the companion code for Core Java 8th ed.    (http://horstmann.com/corejava)    This program is free software: you can redistribute it and/or modify    it under the terms of the GNU General Public License as published by    the Free Software Foundation, either version 3 of the License, or    (at your option) any later version.    This program is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    GNU General Public License for more details.    You should have received a copy of the GNU General Public License    along with this program.  If not, see <http://www.gnu.org/licenses/>. */ import com.sun.rowset.*; import java.sql.*; import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.*; import javax.swing.*; import javax.sql.*; import javax.sql.rowset.*; /**  * This program uses metadata to display arbitrary tables in a database.  * @version 1.31 2007-06-28  * @author Cay Horstmann  */ public class ViewDB {    public static void main(String[] args)    {       EventQueue.invokeLater(new Runnable()          {             public void run()             {                JFrame frame = new ViewDBFrame();                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);                frame.setVisible(true);             }          });    } } /**  * The frame that holds the data panel and the navigation buttons.  */ class ViewDBFrame extends JFrame {    public ViewDBFrame()    {       setTitle("ViewDB");       setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);       tableNames = new JComboBox();       tableNames.addActionListener(new ActionListener()          {             public void actionPerformed(ActionEvent event)             {                showTable((String) tableNames.getSelectedItem());             }          });       add(tableNames, BorderLayout.NORTH);       try       {          readDatabaseProperties();          Connection conn = getConnection();          try          {             DatabaseMetaData meta = conn.getMetaData();             ResultSet mrs = meta.getTables(null, null, null, new String[] { "TABLE" });             while (mrs.next())                tableNames.addItem(mrs.getString(3));          }          finally          {             conn.close();          }       }       catch (SQLException e)       {          JOptionPane.showMessageDialog(this, e);       }       catch (IOException e)       {          JOptionPane.showMessageDialog(this, e);       }       JPanel buttonPanel = new JPanel();       add(buttonPanel, BorderLayout.SOUTH);       previousButton = new JButton("Previous");       previousButton.addActionListener(new ActionListener()          {             public void actionPerformed(ActionEvent event)             {                showPreviousRow();             }          });       buttonPanel.add(previousButton);       nextButton = new JButton("Next");       nextButton.addActionListener(new ActionListener()          {             public void actionPerformed(ActionEvent event)             {                showNextRow();             }          });       buttonPanel.add(nextButton);       deleteButton = new JButton("Delete");       deleteButton.addActionListener(new ActionListener()          {             public void actionPerformed(ActionEvent event)             {                deleteRow();             }          });       buttonPanel.add(deleteButton);       saveButton = new JButton("Save");       saveButton.addActionListener(new ActionListener()          {             public void actionPerformed(ActionEvent event)             {                saveChanges();             }          });       buttonPanel.add(saveButton);    }    /**     * Prepares the text fields for showing a new table, and shows the first row.     * @param tableName the name of the table to display     */    public void showTable(String tableName)    {       try       {          // open connection          Connection conn = getConnection();          try          {             // get result set             Statement stat = conn.createStatement();             ResultSet result = stat.executeQuery("SELECT * FROM " + tableName);             // copy into cached row set             crs = new CachedRowSetImpl();             crs.setTableName(tableName);             crs.populate(result);                      }          finally          {             conn.close();          }          if (scrollPane != null) remove(scrollPane);          dataPanel = new DataPanel(crs);          scrollPane = new JScrollPane(dataPanel);          add(scrollPane, BorderLayout.CENTER);          validate();          showNextRow();       }       catch (SQLException e)       {          JOptionPane.showMessageDialog(this, e);       }    }    /**     * Moves to the previous table row.     */    public void showPreviousRow()    {       try       {          if (crs == null || crs.isFirst()) return;          crs.previous();          dataPanel.showRow(crs);       }       catch (SQLException e)       {          for (Throwable t : e)             t.printStackTrace();       }    }    /**     * Moves to the next table row.     */    public void showNextRow()    {       try       {          if (crs == null || crs.isLast()) return;          crs.next();          dataPanel.showRow(crs);       }       catch (SQLException e)       {          JOptionPane.showMessageDialog(this, e);       }    }    /**     * Deletes current table row.     */    public void deleteRow()    {       try       {          Connection conn = getConnection();          try          {             crs.deleteRow();             crs.acceptChanges(conn);             if (!crs.isLast()) crs.next();             else if (!crs.isFirst()) crs.previous();             else crs = null;             dataPanel.showRow(crs);          }          finally          {             conn.close();          }       }       catch (SQLException e)       {          JOptionPane.showMessageDialog(this, e);       }    }    /**     * Saves all changes.     */    public void saveChanges()    {       try       {          Connection conn = getConnection();          try          {             dataPanel.setRow(crs);             crs.acceptChanges(conn);          }          finally          {             conn.close();          }       }       catch (SQLException e)       {          JOptionPane.showMessageDialog(this, e);       }    }    private void readDatabaseProperties() throws IOException    {       props = new Properties();       FileInputStream in = new FileInputStream("database.properties");       props.load(in);       in.close();       String drivers = props.getProperty("jdbc.drivers");       if (drivers != null) System.setProperty("jdbc.drivers", drivers);          }        /**     * Gets a connection from the properties specified in the file database.properties     * @return the database connection     */    private Connection getConnection() throws SQLException    {       String url = props.getProperty("jdbc.url");       String username = props.getProperty("jdbc.username");       String password = props.getProperty("jdbc.password");       return DriverManager.getConnection(url, username, password);    }    public static final int DEFAULT_WIDTH = 400;    public static final int DEFAULT_HEIGHT = 200;    private JButton previousButton;    private JButton nextButton;    private JButton deleteButton;    private JButton saveButton;    private DataPanel dataPanel;    private Component scrollPane;    private JComboBox tableNames;    private Properties props;    private CachedRowSet crs; } /**  * This panel displays the contents of a result set.  */ class DataPanel extends JPanel {    /**     * Constructs the data panel.     * @param rs the result set whose contents this panel displays     */    public DataPanel(RowSet rs) throws SQLException    {       fields = new ArrayList<JTextField>();       setLayout(new GridBagLayout());       GridBagConstraints gbc = new GridBagConstraints();       gbc.gridwidth = 1;       gbc.gridheight = 1;       ResultSetMetaData rsmd = rs.getMetaData();       for (int i = 1; i <= rsmd.getColumnCount(); i++)       {          gbc.gridy = i - 1;          String columnName = rsmd.getColumnLabel(i);          gbc.gridx = 0;          gbc.anchor = GridBagConstraints.EAST;          add(new JLabel(columnName), gbc);          int columnWidth = rsmd.getColumnDisplaySize(i);          JTextField tb = new JTextField(columnWidth);          if (!rsmd.getColumnClassName(i).equals("java.lang.String"))             tb.setEditable(false);                          fields.add(tb);          gbc.gridx = 1;          gbc.anchor = GridBagConstraints.WEST;          add(tb, gbc);       }    }    /**     * Shows a database row by populating all text fields with the column values.     */    public void showRow(ResultSet rs) throws SQLException    {       for (int i = 1; i <= fields.size(); i++)       {          String field = rs.getString(i);          JTextField tb = (JTextField) fields.get(i - 1);          tb.setText(field);       }    }        /**     * Updates changed data into the current row of the row set     */    public void setRow(RowSet rs) throws SQLException    {       for (int i = 1; i <= fields.size(); i++)       {          String field = rs.getString(i);          JTextField tb = (JTextField) fields.get(i - 1);          if (!field.equals(tb.getText()))             rs.updateString(i, tb.getText());       }       rs.updateRow();    }    private ArrayList<JTextField> fields; } //File: database.properties #jdbc.drivers=org.apache.derby.jdbc.ClientDriver jdbc.url=jdbc:derby://localhost:1527/COREJAVA;create=true jdbc.username=dbuser jdbc.password=secret