Pada awalnya, appQuery cuma digunakan untuk membuat aplikasi yang bisa melakukan tes koneksi ke database yang berbeda. Pada perkembangannya, perlu banyak fungsi tambahan agar bisa digunakan sesuai dengan kebutuhan. Akhirnya dibuatlah 4Query.

appQuery versi lama dan 4Query versi baru

Tujuan dari proyek ini cuma beberapa hal sederhana saja:

# Melakukan tes koneksi ke berbagai database dengan URL Database yang disediakan bisa diubah

# Menjalankan dan tes query dengan hasil yang langsung ditampilkan

# Membuat Aplikasi sederhana dan ringan berbasis java sehingga mudah dipakai untuk melihat obyek di database. Itulah gunanya dipilih interface tanpa titlebar yang dipindah dengan cara drag, menghilangkan dan menampilkan dari systray, serta always on top

# Membuat contoh dan tes koneksi apabila akan membuat aplikasi java ke database

Feature dari program ini diantaranya:* Bisa melakukan koneksi ke berbagai database. Database yang didukung adalah: MS SQL Server / Express, MySQL, Oracle, PostgreSQL, sedangkan database yang lain bisa menggunakan ODBC.

* Bisa mengubah database URL dengan memilih koneksi Custom. Misalkan untuk melakukan koneksi ke MySql yang tidak berada di Localhost

* Semua driver dan library yang digunakan sudah disertakan dalam program.

+ Bisa mengambil daftar semua database yang tersedia di server ke dalam combobox yang bisa langsung dipilih. Oracle tidak menyediakan database metadata sehingga tidak bisa mengeluarkan database yang ada.

* Mengambil daftar tabel yang tersedia di database.

* Menampilkan hasil dari Query Editor di JTable

+ Menyimpan hasil perubahan data dari JTable ke database. Caranya, Ubah data di JTable, kemudian klik Save Data. Data akan bisa diubah apabila diambil langsung dari combobox daftar tabel, bukan dari hasil query box.

+ Menghapus baris terpilih di JTable dari database dengan tombol Delete Data

* Mengkopi isi data di JTable untuk dipindahkan ke aplikasi lain melalui Clipboard System dengan tombol Copy Data

+ memindahkan Window dengan cara mendrag. Ini untuk membuat aplikasi tanpa TitleBar

+ Membuat Tray Icon di Systray

+ Membuat window menjadi AlwaysOnTop

Ps:

* Perbaikan feature sebelumnya

+ Penambahan feature baru

Source Code

    Connection con;
    Statement stmt;
    String perintah;
    DefaultTableModel model;
    public void connectDriver() {
        //String dbDrv = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
        //String dbUrl = "jdbc:microsoft:sqlserver://localhost;DatabaseName="+db;
        try {
            Class.forName(tDriver.getText());
            try {
                con = DriverManager.getConnection(tKoneksi.getText(), tUser.getText(), String.valueOf(tPass.getPassword()));
            } catch (com.mysql.jdbc.CommunicationsException communicationsException) {
            }
            stmt = con.createStatement();
            lStatus.setText("Driver Connected");
        } catch (Exception ce) {
            System.out.println(ce.toString() + "1 " + tPass.getPassword().toString());
            lStatus.setText("Failure Connection: " + ce.toString());//lStatus.getText()+"\n"+
            tabel.setModel(model = new DefaultTableModel());
            cbTabel.setModel(new javax.swing.DefaultComboBoxModel());
        }
    }

Membuat koneksi ke Database

    private static final String sqlServerDriver = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
    private static final String sqlServerUrl = "jdbc:microsoft:sqlserver:"; //jdbc:microsoft:sqlserver://localhost;DatabaseName="+db;
    private static final String mySqlDriver = "com.mysql.jdbc.Driver";
    private static final String mySqlUrl = "jdbc:mysql:";//jdbc:mysql://localhost/untag
    private static final String oracleDriver = "oracle.jdbc.driver.OracleDriver";
    private static final String oracleUrl = "jdbc:oracle:thin:";   //jdbc:oracle:thin:@machine_name:1521:database_name", "scott"
    private static final String pgsqlDriver = "org.postgresql.Driver";
    private static final String pgsqlUrl = "jdbc:postgresql:";    //jdbc:postgresql://host:port/database
    private static final String odbcDriver = "sun.jdbc.odbc.JdbcOdbcDriver";
    private static final String odbcUrl = "jdbc:odbc:";    //jdbc:odbc:sqlKuliah 
 
    private void setDatabaseUrl() { 
 
        lDb.setText("DB/Table");
        tDriver.setEnabled(false);
        tKoneksi.setEnabled(false);
        tPass.setEnabled(true);
        String setDB = null;
        try {
            setDB = cbDb.getSelectedItem().toString();
        } catch (Exception e) {
            setDB = "";
        }
        switch (cbDriver.getSelectedIndex()) {
            case 0://MySQL
                tDriver.setText(lihatTabel.mySqlDriver); 
 
                if (setDB.equals("")) {
                    tKoneksi.setText(lihatTabel.mySqlUrl + "//localhost/");
                } else {
                    tKoneksi.setText(lihatTabel.mySqlUrl + "//localhost/" + cbDb.getSelectedItem());
                }
                break;
            case 1://SQL Server
                tDriver.setText(lihatTabel.sqlServerDriver);
                if (setDB.equals("")) {
                    tKoneksi.setText(lihatTabel.sqlServerUrl + "//localhost");
                } else {
                    tKoneksi.setText(lihatTabel.sqlServerUrl + "//localhost;DatabaseName=" + cbDb.getSelectedItem());
                }
                break;
            case 2://Oracle
                tDriver.setText(lihatTabel.oracleDriver); 
 
                if (setDB.equals("")) {
                    tKoneksi.setText(lihatTabel.oracleUrl + "@localhost:1521:XE");
                } else {
                    //jdbc:oracle:thin:@machine_name:1521:database_name
                    tKoneksi.setText(lihatTabel.oracleUrl + "@localhost:1521:XE");
                    //tKoneksi.setText(lihatTabel.oracleUrl + "@localhost:1521:XE:" + cbDb.getSelectedItem());
                }
                break;
            case 3://PGSQL
                tDriver.setText(lihatTabel.pgsqlDriver);
                if (setDB.equals("")) {
                    tKoneksi.setText(lihatTabel.pgsqlUrl + "//localhost/");
                } else {
                    tKoneksi.setText(lihatTabel.pgsqlUrl + "//localhost/" + cbDb.getSelectedItem());
                }
                tKoneksi.setEnabled(true);
                break;
            case 4://odbc
                tDriver.setText(lihatTabel.odbcDriver);
                tKoneksi.setText(lihatTabel.odbcUrl + "");
                tKoneksi.setEnabled(true);
                //tPass.setText("");
                //lDb.setText("DS Name");
                break;
            case 5://custom
            default://Custom
                tDriver.setEnabled(true);
                tKoneksi.setEnabled(true);
                break;
        }
        getTables();
    }

Menentukan Database URL tergantung koneksi dan driver yang digunakan

    private void getDatabases() {
        cbDb.setModel(new javax.swing.DefaultComboBoxModel());
        connectDriver();
        getTables();
        java.sql.ResultSet rsDb = null;
        try {
            rsDb = con.getMetaData().getCatalogs();
            for (; rsDb.next();) {
                cbDb.addItem(rsDb.getString("TABLE_CAT"));
            } 
 
            rsDb = con.getMetaData().getSchemas(); 
 
            for (; rsDb.next();) {
                System.out.println(rsDb.getString("TABLE_SCHEM"));
            } 
 
            ///cbDb.setSelectedIndex(0);
        } catch (Exception ex) {
            //Logger.getLogger(lihatTabel.class.getName()).log(Level.SEVERE, null, ex);
        } 
 
    }

Mengambil daftar database yang tersedia di server database yang dihubungkan

    private void getTables() {
        try {
            connectDriver();
            String str = "";
            if (cbDb.getSelectedItem().toString().equals("")) {
                str = null; 
 
            } else {
                str = cbDb.getSelectedItem().toString(); 
 
            }
            java.sql.ResultSet rsTabel = con.getMetaData().getTables(str, null, null, new String[]{"TABLE"});
            cbTabel.setModel(new javax.swing.DefaultComboBoxModel());
            for (; rsTabel.next();) {
                cbTabel.addItem(rsTabel.getString("TABLE_NAME"));
            }
            cbTabel.setSelectedIndex(-1);
            lStatus.setText(lStatus.getText() + "\nChange Database success");
        } catch (Exception e) {
            System.err.println(e.toString());
            lStatus.setText(lStatus.getText() + "\nError Connect to Database: " + e.toString()); 
 
        }
    }

Mendapatkan daftar tabel yang ada dalam database

    private void setJTable() {
        try {
            //con.setCatalog(cbDb.getSelectedItem().toString());
            tabel.setModel(model = new DefaultTableModel());
            tabel.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            perintah = tQuery.getText();
            if (stmt.execute(perintah)) {
                java.sql.ResultSet hasil = stmt.executeQuery(perintah);
                java.sql.ResultSetMetaData rsKolom = hasil.getMetaData();
                for (int I = 1; I <= rsKolom.getColumnCount(); I++) {
                    model.addColumn(rsKolom.getColumnName(I).trim());
                }
                Vector V = null;
                for (int I = 0; hasil.next(); I++) {
                    V = new Vector();
                    for (int J = 1; J <= hasil.getMetaData().getColumnCount(); J++) {
                        Object obj = null;
                        try {
                            obj = hasil.getObject(J);
                        } catch (SQLException sQLException) {
                        }
                        try {
                            V.add(obj.toString());
                        } catch (Exception e) {
                            V.add("");
                        }
                    }
                    model.addRow(V);
                }
            } else {
            }
            lStatus.setText(lStatus.getText() + "\nUpdate Table success");
        } catch (Exception ex) {
            System.err.println(ex.toString());
            lStatus.setText(lStatus.getText() + "\nError Execute Query: " + ex.toString());
        }
    }

menampilkan isi data dari tabel di database ke JTable

    private void tSaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tSaveActionPerformed 
 
        perintah = "\nupdate " + cbTabel.getSelectedItem() + " set "
                + tabel.getColumnName(tabel.getSelectedColumn()) + " = '"
                + (String) tabel.getValueAt(tabel.getSelectedRow(), tabel.getSelectedColumn()) + "' "
                + "where "; 
 
        for (int I = 0; I < tabel.getColumnCount(); I++) {
            if (tabel.getSelectedColumn() != I) {
                perintah += (tabel.getColumnName(I) + " = '"
                        + tabel.getValueAt(tabel.getSelectedRow(), I) + "' ");
                if (I < tabel.getColumnCount() - 1) {
                    perintah += " AND ";
                }
            }
        } 
 
        try {
            if (stmt.execute(perintah)) {
            } else {
                lStatus.setText(lStatus.getText() + "\nSuccess: " + "" + perintah);
            }
        } catch (Exception ex) {
            lStatus.setText(lStatus.getText() + "Error Execute Query: " + "" + perintah + "\n" + ex);
        }
        cbTabelActionPerformed(evt);
    }//GEN-LAST:event_tSaveActionPerformed

Menyimpan isi JTable ke Database

    private void tDeleteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tDeleteActionPerformed 
 
        perintah = "\nDelete from " + cbTabel.getSelectedItem() + " "
                //+ tabel.getColumnName(tabel.getSelectedColumn()) + " = '"
                //+ (String) tabel.getValueAt(tabel.getSelectedRow(), tabel.getSelectedColumn()) + "' "
                + "where "; 
 
        for (int I = 0; I < tabel.getColumnCount(); I++) {
            //if (tabel.getSelectedColumn() != I) {
            perintah += (tabel.getColumnName(I) + " = '"
                    + tabel.getValueAt(tabel.getSelectedRow(), I) + "' ");
            if (I < tabel.getColumnCount() - 1) {
                perintah += " AND ";
            }
            //}
        }
        //lStatus.setText(lStatus.getText() + perintah);
        try {
            if (stmt.execute(perintah)) {
            } else {
                lStatus.setText(lStatus.getText() + "\nSuccess: " + "" + perintah);
            }
        } catch (Exception ex) {
            lStatus.setText(lStatus.getText() + "\nError Execute Query: " + "" + perintah + "\n" + ex);
        }
        cbTabelActionPerformed(evt);
    }//GEN-LAST:event_tDeleteActionPerformed

Menghapus baris terpilih di JTable dari database

    private void tCopyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tCopyActionPerformed
        Clipboard c = this.getToolkit().getSystemClipboard();
        c.setContents(new copyData((String) tabel.getValueAt(tabel.getSelectedRow(), tabel.getSelectedColumn())),
                new ClipboardOwner() { 
 
                    @Override
                    public void lostOwnership(Clipboard c, Transferable t) {
                    }
                }); 
 
    }//GEN-LAST:event_tCopyActionPerformed 
 
    class copyData implements Transferable { 
 
        DataFlavor FLAVOR = new DataFlavor("application/x-java-serialized-object; class=java.lang.String", "String");
        DataFlavor[] FLAVORS = new DataFlavor[]{FLAVOR};
        String str; 
 
        public copyData(String str) {
            this.str = str;
        } 
 
        @Override
        public DataFlavor[] getTransferDataFlavors() {
            return FLAVORS;
        } 
 
        @Override
        public boolean isDataFlavorSupported(DataFlavor f) {
            return f.equals(FLAVOR);
        } 
 
        @Override
        public Object getTransferData(DataFlavor f)
                throws UnsupportedFlavorException {
            if (!f.equals(FLAVOR)) {
                throw new UnsupportedFlavorException(f);
            }
            return str;
        }
    }

Mengkopi isi data

    int xStart;
    int yStart; 
 
    private void formMouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_formMouseDragged
        setLocation(evt.getLocationOnScreen().x - xStart, evt.getLocationOnScreen().y - yStart);
    }//GEN-LAST:event_formMouseDragged 
 
    private void formMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_formMousePressed
        xStart = evt.getX();
        yStart = evt.getY();
    }//GEN-LAST:event_formMousePressed

Memindahkan JFrame dengan cara drag

        SystemTray tray;
        TrayIcon trayIcon; 
 
        tTopActionPerformed(null);
        tray = SystemTray.getSystemTray();
        setIconImage(new ImageIcon(getClass().getResource("icon.jpg")).getImage());
        trayIcon = new TrayIcon(getIconImages().get(0).getScaledInstance(tray.getTrayIconSize().width, tray.getTrayIconSize().height, 0));
        trayIcon.addMouseListener(new MouseListener() { 
 
            @Override
            public void mouseClicked(MouseEvent e) {
                if (e.getButton() == MouseEvent.BUTTON1) {
                    setVisible(!isVisible());
                    mShow.setState(isVisible());
                }
            } 
 
            @Override
            public void mousePressed(MouseEvent e) {
            } 
 
            @Override
            public void mouseReleased(MouseEvent e) {
            } 
 
            @Override
            public void mouseEntered(MouseEvent e) {
            } 
 
            @Override
            public void mouseExited(MouseEvent e) {
            }
        });
        trayIcon.setPopupMenu(pSystray);
        trayIcon.setImageAutoSize(true);
        tray.add(trayIcon);
        tabel.setModel(model = new DefaultTableModel());

Membuat tray icon

private void tTopActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tTopActionPerformed
    setAlwaysOnTop(tTop.isSelected());
}//GEN-LAST:event_tTopActionPerformed

Membuat AlwaysOnTop

Download program dalam bentuk exe yang bisa langsung dijalankan apabila sudah terintstall jre:

Download 4Query.exe

Source Code:

Download 4Query Source Code
appQuery bisa diambil dari blog yang lama:

appquery-akses-java-ke-semua-jenis.html

appquery-java-source-code.html

Project ini dibuat dengan jdk1.6.0_17 terbaru untuk bisa memanfaatkan feature seperti Systray. Dan menggunakan Netbeans 6.8  agar mudah diedit ulang oleh siapa saja.

Driver sudah disertakan dalam program, silakan mencari sendiri apabila sendiri dengan kata kunci jdbc driver di google, misalkan oracle jdbc driver.