Download NetBeans!

20081119 Wednesday November 19, 2008

Getting Started with the Database Explorer API

Now that the Database Explorer API is official, I need to write a tutorial covering some typical things that you might want to do with it. David Van Couvering, who leads this area of NetBeans, provided me with the following notes. Thanks a lot David. The use case is that of a developer wanting to inspect metadata for a connection in the Database Explorer.

  1. Get a connection. Normally the first step for this is to find out what connection the user wants to use. We provide a helper utility that provides you with a combo box containing all current connections in the Database Explorer, as well as the ability to create a new connection. Here's how you might use this API:

    • In your UI, create a combo box.

    • Associate the combo box with the utility:
      DatabaseExplorerUIs.connect(dbconnComboBox, ConnectionManager.getDefault());
    • In your action listener for your combo box:
      Object selected = dbconnComboBox.getSelectedItem();
              if (selected instanceof DatabaseConnection) {
                  dbconn = (DatabaseConnection) selected;
      }
  2. Make sure you're connected. It's possible your database connection is not connected. Here's what you do:
            Connection conn = dbconn.getJDBCConnection(true);
            if (conn == null) {
                ConnectionManager.getDefault().showConnectionDialog(dbconn);
            }
            conn = dbconn.getJDBCConnection(true);
            if (conn == null) {
                // user chose not to connect, handle this
            }
  3. Get metadata. Let's say you want to get all the tables for the connection. We are going to be adding a new Metadata API, but for now you just use the native JDBC DatabaseMetadata. So, for example:
            Connection conn = dbconn.getJDBCConnection(true);
            try {
                ResultSet rs = conn.getMetaData().getTables(null, null, "*", new String[]{"TABLE"});
                while (rs.next()) {
                    System.out.println("Table name is " + rs.getString("TABLE_SCHEMA") + "." + rs.getString("TABLE"));
                }
            } catch (SQLException sqle) {
                // handle me
            }
    

For example, here's a TopComponent showing the result of the code above:

Finally, here's some code, also from David, for dragging and dropping in a snippet. It comes from J2EEComponentDropProvider.java in org.netbeans.modules.form.j2ee:

    /**
     * Processes given transferable and returns the corresponding
     * NewComponentDrop.
     *
     * @param formModel corresponding form model.
     * @param transferable description of transferred data.
     * @return NewComponentDrop that corresponds to given
     * transferable or null if this provider
     * don't understand to or don't want to process this data transfer.
     */
    public NewComponentDrop processTransferable(FormModel formModel, Transferable transferable) {
        try {
            if (transferable.isDataFlavorSupported(DatabaseMetaDataTransfer.CONNECTION_FLAVOR)) {
                DatabaseMetaDataTransfer.Connection connection = (DatabaseMetaDataTransfer.Connection)transferable.getTransferData(DatabaseMetaDataTransfer.CONNECTION_FLAVOR);
                return new DBConnectionDrop(formModel, connection);
            } else if (transferable.isDataFlavorSupported(DatabaseMetaDataTransfer.COLUMN_FLAVOR)) {
                DatabaseMetaDataTransfer.Column column = (DatabaseMetaDataTransfer.Column)transferable.getTransferData(DatabaseMetaDataTransfer.COLUMN_FLAVOR);
                return new DBColumnDrop(formModel, column);
            } else if (transferable.isDataFlavorSupported(DatabaseMetaDataTransfer.TABLE_FLAVOR)) {
                DatabaseMetaDataTransfer.Table table = (DatabaseMetaDataTransfer.Table)transferable.getTransferData(DatabaseMetaDataTransfer.TABLE_FLAVOR);
                return new DBTableDrop(formModel, table);
            }
        } catch (Exception ex) {
            // should not happen

            Logger.getLogger(getClass().getName()).log(Level.INFO, ex.getMessage(), ex);
        }
        return null;
    }

All the above code will be part of a new tutorial soon.

Nov 19 2008, 01:14:28 AM PST Permalink