Contoh Aplikasi Java dengan JDBC

Ini adalah contoh aplikasi Swing dengan menggunakan JDBC API untuk koneksi ke database mySQL. Mungkin program ini agak kurang modern ya, soalnya tren nya sekarang kan kalo koneksi ke database biasanya pake persistence API seperti Hibernate dan sebagainya. Tapi gpp, namanya juga belajar, mulai dari yang paling mudah dulu, baru yang mudah, dan jangan dibuat sulit..

Aplikasi ini sebenarnya hasil kerja kelompok tugas akhir semester pemrograman berorientasi objek di kuliah saya. Namanya bernama Waroeng Laptop, kegunaanya untuk keperluan manajemen pembelian dan penjualan barang-barang Laptop di suatu toko.

Waroeng Laptop Screenshot

Waroeng Laptop Screenshot

Source codenya dapat di-download di sini berupa NetBeansProject , dikompress dalam format 7 zip.

(Catatan : link sudah diperbaiki, sekarang Anda bisa mendownload source code nya. )

Oh ya,  agar programnya bisa dikompile dan dijalankan, komputer yang digunakan perlu dipasang server mySQL, trus dimasukin database laptop, dengan sintaks-sintaks dalam file   laptopDatabaseSample.sql (sebenarnya ekstension filenya .sql , tapi agak susah upload file .sql di wordpress).

Pembahasan

Pembahasan Kelas Item

package waroeng_laptop.domain;
public class Item {
    private String kodeBarang;
    private String merek;
    private String type;
    private String processor;
    private String hdd;
    private String memory;
    private String layar;
    private int harga;
    private Integer custID;
    @Override
    public boolean equals(Object obj) {
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        final Item other = (Item) obj;
        if ((this.kodeBarang == null) ? (other.kodeBarang != null) : !this.kodeBarang.equals(other.kodeBarang))
            return false;
        return true;
    }
    @Override
    public int hashCode() {
        int hash = 7;
        hash = 79 * hash + (this.kodeBarang != null ? this.kodeBarang.hashCode() : 0);
        return hash;
    }
    public Object[] toArray() {
        Object[] obj = {
            kodeBarang,
            merek,
            type,
            processor,
            hdd,
            memory,
            layar,
            harga,
            custID
        };
        return obj;
    }
    @Override
    public String toString() {
        return kodeBarang;
    }
    public Item() {}
    public Item(String kodeBarang) {
        this.kodeBarang = kodeBarang;
    }
    public Item(String kodeBarang, String merek, String type, String processor, String hdd, String memory, String layar, int harga, Integer custID) {
        this.kodeBarang = kodeBarang;
        this.merek = merek;
        this.type = type;
        this.processor = processor;
        this.hdd = hdd;
        this.memory = memory;
        this.layar = layar;
        this.harga = harga;
        this.custID = custID;
    }
    public Item(String kodeBarang, String merek, String type, String processor, String hdd, String memory, String layar, int harga) {
        this.kodeBarang = kodeBarang;
        this.merek = merek;
        this.type = type;
        this.processor = processor;
        this.hdd = hdd;
        this.memory = memory;
        this.layar = layar;
        this.harga = harga;
    }
    public int getCustID() {
        return custID;
    }
    public void setCustID(Integer custID) {
        this.custID = custID;
    }
    public int getHarga() {
        return harga;
    }
    public void setHarga(int harga) {
        this.harga = harga;
    }
    public String getHdd() {
        return hdd;
    }
    public void setHdd(String hdd) {
        this.hdd = hdd;
    }
    public String getKodeBarang() {
        return kodeBarang;
    }
    public void setKodeBarang(String kodeBarang) {
        this.kodeBarang = kodeBarang;
    }
    public String getLayar() {
        return layar;
    }
    public void setLayar(String layar) {
        this.layar = layar;
    }
    public String getMemory() {
        return memory;
    }
    public void setMemory(String memory) {
        this.memory = memory;
    }
    public String getMerek() {
        return merek;
    }
    public void setMerek(String merek) {
        this.merek = merek;
    }
    public String getProcessor() {
        return processor;
    }
    public void setProcessor(String processor) {
        this.processor = processor;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
}

Berikut adalah isi dari kelas Item. Kelas ini merupakan POJO (Plain Old Java Object) untuk merepresentasikan setiap instans pada entity laptop dalam database. Di dalam badan kelas ini, kita dapat melihat atribut-atributnya, yakni kodeBarang, merek, processor, dan seterusnya sebagai atribut spesifikasi pada entity laptop dalam database. Selain atribut yang menyatakan spesifikasi, terdapat pula atribut custID untuk menyatakan customer ID mana yang memesan suatu instans item. Atribut custID merupakan representasi kolom customer_id pada tabel laptoptable dalam database mySQL yang terdapat pada server. Kolom customer_id diset sebagai foreign key yang menunjuk pada kolom customer_id pada tabel customer.

Di bagian deklarasi method kelas, kita mendapati sebagian besar method adalah getter dan setter kelas dari attribut kodeBarang, merek, hingga custID. Getter dan setter method merupakan penerapan salah satu konsep dasar pemrograman berorientasi objek, yakni enkapsulasi, yang method tersebut berfungsi sebagai pengakses atribut privat kelas dari luar kelas. Mungkin kita tidak perlu repot mendeklarasikan getter dan setter dan membuat akses atribut publik agar atribut dapat diakses dari luar kelas, namun pola desain kode dengan getter dan setter ini dapat membuat proses pengembangan program lebih mudah, karena jika kita ingin membuat kode pengaman tambahan sebelum suatu atribut diakses (misalkan ketika mengubah atribut harga, nilai dicek dulu agar tidak minus), kita tidak perlu menambahkan kode pengaman tambahan di luar kelas tersebut ketika mengakses atribut, sehingga tidak mengganggu kode program yang sudah jadi (dengan menyelipkan kode-kode pengaman yang dapat menimbulkan error) ketika kita ingin mengembangkan program.

Selain getter dan setter, dalam bagian deklarasi method kita juga mendapati lain, yakni method 4 method konstruktor yang di-overload, toArray(), method toString(), hashCode() , dan equals(). Penjelasan method-method tersebut adalah sebagai berikut :

  • Kelas memiliki method konstruktor yang memiliki parameter yang berbeda-beda, yakni tanpa paramater, ada yang berparamater kodeBarang, ada yang memiliki parameter yang berjumlah sama dengan jumlah attribut kelas, dan ada juga yang memiliki parameter yang sama dengan atribut kelas, kecuali custID tidak terdapat dalam parameter konstruktor. Overloading pada konstruktor kelas ini membuat fleksibilitas pemrogram pengguna kelas dalam meng-instance objek dan menginisialisasi instance variable-nya.
  • Pendeklarasian method equals yang diawali annotation @override ini merupakan method yang di-override dari method virtual equals() (setiap method dalam Java dideklarasikan secara virtual) dalam kelas induk dari semua kelas dalam bahasa java, yakni Object. Setiap kelas memiliki method equals() yang digunakan untuk membandingkan kesamaan antara suatu objek dengan objek yang lain. Jika method equals() tidak di-override, method equals() didefinisikan menurut definisi dalam kelas Object, yakni suatu objek akan dianggap sama dengan objek lain jika bereferensi sama atau menunjuk ke suatu alamat pada heap yang sama dan jika kedua objek memiliki hashcode yang sama. Namun, setelah method equals di-override, ukuran kesamaan objek tidak hanya karena menunjuk ke referensi yang sama. Dalam badan method, kita dapat melihat bahwa suatu objek dianggap sama dengan objek lainnya (ditandai dengan method equals mengembalikan nilai true) jika objek tidak memiliki referensi (berniliai null), memiliki kelas yang sama, atau memilki nilai atribut kodeBarang yang sama.
  • Method hashcode() berguna untuk membangkitkan kode-kode tertentu yang biasa dipakai dalam method equals() sebagai identitas dan pembeda antara objek satu dengan objek lainnya. Dalam kelas ini, method hashcode() di-override dari kelas induknya, sehingga hashcode yang dihasilkan tidak memiliki nilai unik pada setiap objek yang dibuat (berdasarkan definisi method hashcode() dalam kelas Object) melainkan hashcode dihasilkan berdasarkan nilai atribut kodeBarang suatu objek.
  • Method toString() juga merupakan method yang di-override dari kelas Object. Method ini membangkitkan nilai string sebagai representasi objek. Dalam hal ini, representasi dari setiap objek Item adalah kode barangnya.
  • Method toArray() berguna untuk menghasilkan array yang elemen-elemennya merupakan seluruh atribut kelas, mulai dari kodeBarang, merek, hingga custID. Dalam program ini, array ini akan digunakan sebagai input untuk memasukkan baris data ke dalam tabel pada user interface melalui method addRow(). Array ini bertipe Object yang merupakan kelas induk dari segala kelas, sehingga array dapat menampung semua tipe data referensi, termasuk String yang merupakan tipe data pada hampir semua atribut, dan Integer (Integer berbeda dengan int, Integer adalah tipe data referensi yang merupakan kelas wrapper dari tipe data primitif int) yang merupakan tipe data yang digunakan pada atribut harga dan custID (walaupun custID bertipe value int, namun JVM akan secara otomatis membungkus nilai custID ke dalam kelas wrapper Integer). Hal ini termasuk penggunaan dari konsep dasar pemrograman berbasis objek, yakni polimorfisme.

Pembahasan Kelas Admin

package waroeng_laptop.domain;
public class Admin {
    private String username;
    private String password;
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Admin other = (Admin) obj;
        if ((this.username == null) ? (other.username != null) : !this.username.equals(other.username)) {
            return false;
        }
        if ((this.password == null) ? (other.password != null) : !this.password.equals(other.password)) {
            return false;
        }
        return true;
    }
    @Override
    public int hashCode() {
        int hash = 5;
        hash = 29 * hash + (this.username != null ? this.username.hashCode() : 0);
        hash = 29 * hash + (this.password != null ? this.password.hashCode() : 0);
        return hash;
    }
    public Admin(String username, String password) {
        this.username = username;
        this.password = password;
    }
    public Admin() {
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
}

Berikut adalah pendeklarasian kelas Admin. Mirip pada kelas Customer, kelas Admin digunakan sebagai representasi dari entity Admin dalam database. Admin memiliki atribut username dan password beserta method getter dan setternya. Dalam bagian pendeklarasian method, terdapat override pada methode equals dan hashcode untuk mengubah ukuran kesamaan antara suatu objek dengan objek lainnya dalam satu kelas Admin. Isi method equals menjelaskan bahwa kedua objek dianggap sama jika kedua objek tidak bernilai null (tidak bereferensi), sama-sama di-instans dari kelas yang sama, dan memiliki nilai atribut username dan password yang sama.

Pembahasan Kelas Customer

package waroeng_laptop.domain;
import java.util.ArrayList;
public class Customer {
    private int custID;
    private String name;
    private String phone;
    private String address;
    private ArrayList<Item> shopingCart = new ArrayList<Item>();
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Customer other = (Customer) obj;
        if (this.custID == other.custID)
            return true;
        else {
            if ((this.name == null) ? (other.name != null) : !this.name.equals(other.name)) {
                return false;
            }
            if ((this.phone == null) ? (other.phone != null) : !this.phone.equals(other.phone)) {
                return false;
            }
            if ((this.address == null) ? (other.address != null) : !this.address.equals(other.address)) {
                return false;
            }
        }
        return true;
    }
    @Override
    public int hashCode() {
        int hash = 7;
        hash = 31 * hash + (this.name != null ? this.name.hashCode() : 0);
        hash = 31 * hash + (this.phone != null ? this.phone.hashCode() : 0);
        hash = 31 * hash + (this.address != null ? this.address.hashCode() : 0);
        return hash;
    }
    @Override
    public String toString() {
        return String.valueOf(custID);
    }
    public Customer() {
    }
    public Customer(int custID) {
        this.custID = custID;
    }
    public Customer(String name, String phone, String Address) {
        this.name = name;
        this.phone = phone;
        this.address = Address;
    }
    public Customer(int custID, String name, String phone, String Address) {
        this.custID = custID;
        this.name = name;
        this.phone = phone;
        this.address = Address;
    }
    public int getCustID() {
        return custID;
    }
    public void setCustID(int custID) {
        this.custID = custID;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String Address) {
        this.address = Address;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String telephoneNumber) {
        this.phone = telephoneNumber;
    }
    public void addToCart(Item item) {
        shopingCart.add(item);
    }
    public void removeFromCart (Item item) {
        shopingCart.remove(item);
    }
    public ArrayList<Item> getShopingCart() {
        return shopingCart;
    }
    public void setShopingCart(ArrayList<Item> shopingCart) {
        this.shopingCart = shopingCart;
    }
}

 

Seperti pada 2 kelas sebelumnya, kelas Customer merupakan POJO yang digunakan sebagai representasi entity customer pada database. Customer memiliki attribut seperti entity customer, yakni name, address, dan phone beserta method getter dan setternya. Dan dalam database, customer memiliki hubungan one to many dengan entity item. Maka, untuk mencoba menjembatani antara konsep relational database dengan OOP, kami membuat attribut tambahan bernama cart pada customer. Attribut cart bertipe arrayList digunakan untuk menampung objek-objek bertipe Item yang dipesan oleh customer. Untuk menambahkan atau menghapus laptop ke dalam daftar keranjang belanja, kita dapat menggunakan method addToCart dan removeToCart. Method addToCart dan removeToCart ini menggunakan method add dan remove pada ArrayList. Dan agar method remove dapat menghapus item yang sesuai dengan masukan parameternya, overriding pada method equals dan hashcode pada kelas Item perlu dilakukan, yang telah dilakukan pada deklarasi kelas. Method equals dan hashcode digunakan untuk mengecek apakah suatu objek dianggap sama dengan objek lainnya. Dan berdasarkan definisi method equals pada kelas Item, kita menganggap suatu objek item sama dengan objek item lainnya jika memiliki kode barang yang sama. Maka, ketika method remove dipanggil dengan masukan argumennya, arrayList akan menghapus objek di dalam listnya yang memiliki kode barang yang sama dengan kode barang yang dimiliki masukan argumen objeknya.

Selain itu, dalam kelas ini juga dilakukan overriding pada method equals dan hashcode, membuat suatu objek dianggap sama dengan objek lainnya dalam kelas Customer jika keduanya memiliki atribut custID yang sama atau memiliki nilai name, phone, dan address yang sama.

Penjelasan Kelas Manager

 

package waroeng_laptop.entityManager;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public abstract class Manager {
    protected Connection connection = null;
    public Manager (Connection connection) throws Exception {
        this.connection = connection;
        getList();
    }
    public Manager () throws Exception {
        Class.forName("com.mysql.jdbc.Driver"); //Me-load driver JDBC
        this.connection = DriverManager.getConnection(
               "jdbc:mysql://localhost/laptop",
               "root", //username
               "admin" //password
               );
        connection.setAutoCommit(false);
        getList();
    }
    public void commit() throws SQLException {
        connection.commit();
    }
    public void rollBack() throws SQLException {
        connection.rollback();
    }
    public void tutupKoneksi() throws SQLException {
        connection.close();
    }
    public Connection getConnection() {
        return connection;
    }
    public void setConnection(Connection connection) {
        this.connection = connection;
    }
    protected abstract void getList() throws Exception;
}

Ketika melakukan perancangan kelas-kelas dalam program ini, walaupun belum sempurna, kami mencoba memisahkan antara lapisan user interface dengan business logic dan pengakses database. Dan dalam kelas abstrak Manager ini yang merupakan kelas induk dari kelas ItemManager, AdminManager, dan CustomerManager, di dalamnya terdapat fungsi-fungsi untuk keperluan pengaksesan database dan beberapa bussiness logic pada kelas turunannya. Untuk Keperluan pengaksesan database, kelas membutuhkan objek connection (memiliki hubungan asosiatif) yang didefinisikan dalam package java.sql . Sebelum objek connection digunakan untuk mengakses database, terlebih dahulu kita harus meng-instance objek tersebut dengan bantuan method statik getConnection pada kelas DriverManager. Method getConnection akan mencoba membuat koneksi ke url database yang diberikan pada argumen method beserta username dan passwordnya, dengan menggunakan driver yang teregistrasi (Driver yang teregistrasi adalah JDBC mySQL yang diregistrasikan  dengan sintaks Class.forName (“com.mysql.jdbc.Driver”); ). Sebagai catatan, kami menggunakan database mySQL bernama laptop yang berada di localhost, dan server memiliki admin username bernama “root” dengan password “admin”. Maka, untuk menjalankan program ini, mySQL server harus terinstal dalam komputer dan database laptop harus dibuat, dengan sintaks seperti dalam file laptopDatabaseSample.sql yang kami lampirkan dalam makalah.

Inisialisasi objek koneksi dan pemanggilan method getList ini dilakukan ketika konstruktor yang tidak memiliki parameter dipanggil. Namun, kami juga menambahkan konstruktor lain dengan parameter koneksi yang memungkinkan kelas untuk mengambil koneksi yang sudah ada di luar kelas dan tidak perlu membuat koneksi baru. Dan method-method pada kelas Manager ini hanya sebagai interface untuk mengakses method-method dalam kelas Connection dari luar kelas Manager.

Setelah koneksi ke database tersambung, dalam konstruktor, koneksi disetel agar mode autocommit dimatikan, membuat setiap statemen SQL yang dibuat program tidak langsung dieksekusi ke server, melainkan ditampung dulu dalam semacam connection pool. Hal ini dapat memberikan beberapa keuntungan, antara lain kita dapat membatalkan operasi-operasi SQL yang akan dikirimkan, menjaga kekonsistenan data, dan tidak memerlukan bandwith koneksi yang banyak jika letak server berjauhan.

Selanjutnya, dilakukan pemanggilan method getList untuk mengambil data dalam database dan menyimpannya ke memori sementara pada klien komputer. Implementasi method getList ini berbeda-beda, tergantung tabel dalam database mana yang akan diambil dan disimpan. Maka, dalam kelas abstrak ini, kami membuatnya method tersebut tersebut abstrak dan mengharuskan pada kelas turunan Manager ini untuk mengimplementasikan method tersebut sesuai data dari database yang diambil.

Dalam kelas Manager, selain method getter dan setter, terdapat method-method lain untuk mengakses method pada objek connection dari luar kelas, seperti commit, rollBack, dan tutupKoneksi. Method commit akan memanggil method commit pada objek connection yang membuat statemen-statemen SQL yang telah ditampung dikirimkan dan dieksekusi ke server, sedangkan method rollBack memanggil method rollback pada objek connection membuat statement yang ditampung dihilangkan dan dibatalkan untuk dieksekusi ke server. Dan method tutupKoneksi memanggil method close pada objek connection yang melakukan penutupan koneksi ke database.

Penjelasan Kelas ItemManager, CustomerManager, dan AdminManager

 

Ketiga kelas ini merupakan turunan dari kelas abstrak Manager, sehingga ketiga kelas ini memiliki atribut dan method seperti kelas Manager, ditambah atribut dan method khusus yang hanya terdapat pada masing-masing kelas.

Kelas ItemManager memiliki atribut itemList yang berupa arrayList bertipe Item, yang digunakan untuk tempat menyimpan hasil query yang akan dilakukan database. Query ini dilakukan pada method getList, yang badannya sebagai berikut :

protected void getList() throws Exception {
        itemList = new ArrayList<Item>();
        //Membuat arrayList untuk menampung data-data dari server
        // Create a result set containing all data from my_table
        Statement stmt = connection.createStatement();
        ResultSet rs = stmt.executeQuery(
                "SELECT * FROM laptoptable");
        commit();
        // Fetch each row from the result set
        while (rs.next()) {
            // Get the data from the row using the column index
            Item item = new Item(
                rs.getString("Kode_Barang"),
                rs.getString("Merek"),
                rs.getString("Type"),
                rs.getString("Processor"),
                rs.getString("HDD"),
                rs.getString("RAM"),
                rs.getString("Layar"),
                rs.getInt("Harga"),
                rs.getInt("customer_ID")
            );
            itemList.add(item);
        }
}

Terlihat bahwa ketika method dipanggil, dilakukan query SQL “SELECT * FROM laptoptable” ke server dan statement langsung diteruskan ke server dengan perintah commit. Setelah query berhasil, dilakukan pembuatan objek bertipe Item dengan pengisian atributnya berdasarkan setiap baris pada hasil query yang berada dalam resultSet. Setiap objek item dimasukkan ke dalam itemList, sehingga setelah loop keluar (pembacaan row pada resulSet selesai) semua data pada tabel laptoptable di database dikopi ke dalam itemList.

Implementasi method getList pada kelas AdminManager juga hampir sama dengan method getList pada kelas itemManager ini. Namun, pada method getList pada kelas CustomerManager, implementasinya berbeda. Statemen query pada method getList di kelas CustomerManager berbeda dengan query pada method getList lainnya, yakni query merupakan left join antara tabel Customer dengan tabel laptoptable, sehingga dalam satu baris terdapat kolom-kolom yang berasal dari tabel customer dan ada yang berasal dari tabel laptoptable. Jika pada satu baris seorang customer tidak memesan barang apapun, maka kolom yang berasal dari laptoptable akan bernilai null. Dan jika seorang customer memesan lebih dari satu laptop, maka kolom-kolom dari customer tersebut akan tercetak lebih dari satu baris, sesuai dengan jumlah barang yang dipesan. Agar pengisian data dalam bentuk objek ke dalam array list dilakukan dengan benar, ditambahkan perintah-perintah berikut setiap loop pembacaan resultSet :

 

if (customerList.isEmpty()) {
    if (item.getKodeBarang()!=null)
      customer.addToCart(item);
    customerList.add(customer);
}
else
    if (customerList.get(customerList.size()-1).equals(customer))
        customerList.get(customerList.size()-1).addToCart(item);
    else {
        if (item.getKodeBarang()!=null)
            customer.addToCart(item);
        customerList.add(customer);
    }

 

Ketika customerList masih belum memiliki elemen, akan dilakukan perintah di bawah pernyataan if yang pertama, yakni jika customer memiliki barang yang dipesan, maka barang tersebut dimasukkan ke dalam keranjang belanja (cart) dari customer tersebut. Kemudian, objek customer dimasukkan ke dalam customerList. Kemudian, ketika customerList sudah memiliki elemen lebih dari satu, akan dilakukan perintah di bawah pernyataan else. Pada pernyataan-pernyataan di bawah else, terdapat perintah jika customer yang terbaca pada baris tersebut sama dengan baris yang pertama, maka item yang terbaca dimasukkan ke dalam cart customer sebelumnya. Hal ini dilakukan karena objek customer yang baru tidak perlu dimasukkan ke dalam list, karena customer dari pembacaan baris yang baru sama dengan customer pada baris sebelumnya. Namun, jika saat pembacaan baris selanjutnya, customer berbeda dengan baris sebelumnya, maka customer tersebut akan dimasukkan ke dalam customerList dan item yang dibaca pada baris yang sama dimasukkan ke dalam cart customer tersebut jika ada (nilai kolom tidak null). Dengan demikian, setelah loop pembacaan resultSet selesai, customerList akan mengandung semua pelanggan-pelanggan yang terdaftar dalam database, dan keranjang belanja (cart) pada setiap pelanggan akan berisi barang-barang yang akan dipesan oleh pelanggan tersebut.

Selain method tersebut, kelas ItemManager dan CustomerManager memiliki method addRow dan removeRow. Method addRow pada keduanya berfungsi untuk menambahkan baris baru ke dalam list dan database, sedangkan removeRow digunakan untuk menghapus data yang terdapat dalam list dan database. Kedua method tersebut akan mengembalikan nilai true jika eksekusi berhasil, dan mengembalikan nilai false jika eksekusi tidak berhasil.

Method-method khusus lainnya yang tidak terdapat pada kelas turunan Manager lainnya adalah method orderItem pada kelas CustomerManager dan isAccessGranted pada kelas AdminManager, yang keduanya berperan dalam keperluan business logic. Method isAccessGranted  digunakan ketika seseorang ingin login untuk mengecek apakah username dan password pada argumen yang dimasukkan cocok dalam database atau tidak. Sedangkan method orderItem  digunakan ketika seseorang pelanggan ingin memesan barang. Yang pertama kali yang dilakukan ketika method ini dipanggil adalah penghapusan item dalam itemList di itemManager. Selanjutnya, jika nama, alamat, dan nomor telepon pelanggan yang dimasukkan terdapat dalam list, item yang dimasukkan dalam argumen sebagai barang yang ingin dipesan disetel nilai custID nya dengan custumer ID yang sesuai dengan nama,alamat, dan telepon yang dimasukkan melalui argumen. Kemudian, item akan dimasukkan ke dalam cart customer pemesan barang. Jika nama, alamat, dan nomor telepon pelanggan tidak terdapat dalam customerList, cart customer tersebut juga dimasukkan item yang dipesan dan customerList akan dimasukkan data customer baru sesuai nama, alamat, nomor telepon yang dimasukkan argumen dan customer ID baru yang dihasilkan dari urutan customer ID terakhir dalam database. Dan hal terakhir yang dilakukan adalah memasukkan item yang atribut custID nya yang telah diubah ke dalam itemList, dan method akan mengeluarkan nilai balik berupa item yang dipesan oleh pelanggan.

 

Penjelasan kelas MenuUtama

 

Kelas yang merupakan turunan dari kelas JFrame ini berisi komponen-komponen dari framework java swing seperti tombol, tabel, dan sebagainya yang akan ditampilkan ke layar sebagai user interface anatara pengguna dengan komputer. Selain memiliki atribut-atribut berupa komponen dari java swing, kelas ini juga memiliki atribut itemManager, CustomerManager, dan AdminManager untuk keperluan business logic dan pengaksesan database.

Kelas ini mengandung fungsi utama main yang dipanggil pertama kali ketika program dijalankan. Hanya terdapat satu baris pada fungsi main, yakni meng-instans objek dari kelas menuUtama ini dan menampilkannya ke layar dengan method setVisible dari kelas JFrame. Dan pada saat objek dari kelas MenuUtama di-instans, method konstruktor kelas MenuUtama dipanggil. Dalam method konstruktor, objek itemManager dibuat, diikuti adminManager, dan customerManager dengan menggunakan koneksi yang telah dibuat oleh itemManager. Namun, jika salah satu atau lebih di antara objek ini gagal dibuat, suatu objek Exception akan ditangkap dan program akan mengeluarkan pesan error ke layar, bertuliskan, “Pengaksesan Database Gagal!”

Blok exception handling atau try-catch ini dan kebanyakan blok try-catch lainnya biasanya bersifat polimorfis, yakni penganggapan suatu objek yang berbeda tipe dengan tipe objek yang dibaca. Dalam kasus ini, ketika pembuatan koneksi database gagal, method konstruktor yang dipanggil melemparkan exception berjenis Exception (dideklarasikan dengan sintaks throws Exception). Sebenarnya, ketika method mengalami kegagalan pengaksesan database tidak mengeluarkan objek bertipe umum exception, namun biasanya mengeluarkan exception berjenis yang spesifik, yakni SQLException dan turunannya. Konstruktor tidak dideklarasikan untuk melempar exception berjenis SQLException, melainkan superclass dari seluruh tipe exception, Exception. Namun, pendeklarasian tipe yang berbeda dengan jenis exception yang dilempar ini tidak mengapa karena SQLException dapat dianggap sebagai tipe Exception , mengingat kelas SQLException merupakan turunan dari kelas Exception. Demikian pula, pada blok try-catch, kita tidak perlu melakukan catch pada setiap tipe exception yang mungkin keluar. Kita cukup melakukan catch exception bertipe umumnya, dan semua tipe exception akan ditangkap oleh perintah catch tersebut dan program akan mengeksekusi code exception handler nya.

Setelah membuat ketiga tersebut, dalam method konstruktor dilakukan pemanggilan method initComponents. Method ini akan meng-instans komponen-komponen dari framework java swing, seperti tabel, button, textfield, pane, dan sebagainya kemudian meletakkannya ke koordinat tertentu sedemikian rupa sehingga membentuk tampilan seperti gambar yang ditampilkan di bagian awal makalah ini:

 

 

Dalam method initComponents juga dilakukan registrasi interface ActionListener dengan meng-instans interface ActionListener tersebut dan langsung mengimplementasikan method dalam interfacenya, yakni actionPerformed, pada setiap tombol-tombol sehingga jika tombol-tombol tersebut ditekan, program akan otomatis melakukan aksi-aksi tertentu, sesuai dengan tombol yang ditekan.

Berikut ini adalah fungsi-fungsi yang dipanggil ketika sebuah tombol ditekan :

 

adminAddButtonActionPerformed. Fungsi ini akan dipanggil ketika tombol add ditekan (Bergambar  )Pertama-tama, dilakukan eksekusi perintah DefaultTableModel model = (DefaultTableModel) itemTable.getModel(); yakni pengambilan model dari itemTable dan mengubahnya ke tipe DefaultTableModel. Model adalah objek yang menyimpan data-data yang ditampilkan dengan baris dan kolom pada tabel, maka kita perlu mengambilnya dengan method getter getModel untuk menambahkan data ke dalam model. Namun, method getModel ini akan mengembalikan nilai balik bertipe TableModel yang merupakan superclass dari model lainnya, dan dalam TableModel ini belum terdapat method untuk menambahkan baris pada tabel. Maka, kita perlu ‘menganggap’ tabel model yang dikeluarkan dari method getModel ini menjadi model yang lebih spesifik, yakni DefaultTableModel, dengan sintaks (DefaultTableModel) dan mereferensikannya ke objek model bertipe DefaultTableModel, karena objek yang didefinisikan dalam kelas DefaultTableModel sudah memiliki method addRow untuk menambahkan baris ke tabel, yang kita dapat menggunakannya untuk keperluan penambahan data ke dalam tabel yang dilakukan pada perintah-perintah berikutnya. Hal ini termasuk penerapan prinsip polimorfisme, yakni kita menganggap objek dengan suatu tipe dengan tipe yang lain yang masih dalam satu pohon inheritansnya. Namun, terkadang penganggapan suatu objek bertipe umum menjadi objek beripe yang lebih khusus (turunan kelasnya) seperti yang dilakukan pengambilan table model ini, terkadang berbahaya, karena bisa saja suatu objek yang umum bukan termasuk dari kelas turunannya, atau dalam hal ini bisa saja model yang digunakan tabel bukan merupakan DefaultTableModel, sehingga jika tetap dipaksakan dianggap sebagai DefaultTableModel, program akan mengalami runtime error.

Selanjutnya, dilakukan penambahan data ke database dan itemList melalui method addRow pada objek itemManger yang dibentuk dari method statik getValue pada kelas AddItemDialog. Method getValue ini akan mengeluarkan nilai berupa objek yang mermiliki atribut seperti data-data yang dimasukkan pengguna secara lengkap dalam dialog AddItemDialog dan setelah pengguna menekan tombol OK. Jika pengguna tidak memasukkan nilai pada kolom customer ID, nilai atribut custID pada item akan 0 yang berarti barang tersebut belum dipesan oleh siapapun.Namun, jika pengguna tidak memasukkan data-data lain pada barang secara lengkap, objek item gagal dibentuk dan pengguna diminta untuk memasukkan data-data barang kembali secara benar. Selain itu, penambahan barang ke database juga akan gagal jika customer ID yang dimasukkan belum terdaftar dalam database. Kegagalan ini ditandai dengan dilemparnya Exception oleh method addRow pada objek itemManager., kemudian pada blok try-catch dalam method AddButtonActionPerformed, exception tersebut ditangkap sebagai SQLIntegrityConstraintException dan program akan menampilkan pesan error ke layar, “Customer ID yang dimasukkan tidak terdaftar dalam database”. Jika terdapat exception lain yang juga menandakan gagalnya pengaksesan database, program akan menangkap SQLException dan menampilkan pesan error bahwa pengaksesan database gagal. Dan jika terdapat exception lainnya, program menganggap bahwa exception yang ditangkap berjenis Exception dan program mencetak pesan error yang dihasilkan ke konsol.

Dan hal terakhir yang dilakukan method ini adalah penambahan data objek item ke tabel dengan method addRow pada objek model. Agar data dapat dimasukkan ke dalam tabel model, nilai-nilai atribut pada item harus diubah menjadi bentuk array, menggunakan method toArray, karena method addRow pada objek model memerlukan masukan argumen bertipe array object. Penggunaan array bertipe Object ini bersifat polimorfis, karena tipe data Object merupakan induk dari semua tipe data referensi sehingga dalam array bertipe objek kita dapat menyimpan elemen-elemen data yang bertipe data apapun.

loginButtonActionPerformed. Method ini dipanggil ketika login button yang bergambar          ( )  ditekan oleh pengguna. Dalam method ini, dilakukan pengecekan input username yang berasal dari adminNamaField dan input password yang berasal dari adminPasswordField dengan pemanggilan method isAccessGranted pada objek adminManager. Jika method isAccessGranted mengembalikan nilai boolean true, maka tombol-tombol yang ada pada tab admin dihidupkan atau dapat ditekan, dan pemilihan tab dimatikan. Jika pengguna ingin mengaktifkan pemilihan tab dan mematikan fungsi tombol-tombol pada tab admin, maka pengguna dapat menekan tombol logoutButton dan program akan memanggil method logoutButtonActionPerformed yang berisi perintah-perintah tersebut.

discardButtonActionPerformed. Method ini dipanggil ketika tombol discard yang bergambar ( ) ditekan. Ketika method bekerja, dilakukan pemanggilan method rollBack pada objek itemManager, mengakibatkan semua statemen SQL yang ditampung dalam connection pool dibatalkan, kemudian objek itemManager dan customerManager yang lama dibuang dan diganti dengan instans baru sehingga keadaan itemList dan customerList pada manager  akan sama dengan keadaan list sebelum dilakukan manipulasi-manipulasi oleh pengguna. Terakhir, isi tabel pada itemTable dipulihkan (refresh) dengan fungsi refreshTable. Fungsi refreshTable membuat model pada itemTable dibuang, digantikan dengan model baru bertipe DefaultTableModel dan model tersebut langsung diisi dengan data-data yang terdapat pada itemList, sehingga isi data-data pada tabel yang mungkin telah diubah oleh pengguna akan digantikan dengan data-data ketika belum terjadi manipulasi.

adminRemoveButtonActionPerformed. Method ini dipanggil ketika tombol remove yang bergambar ( )pada tab admin ditekan. Method ini bekerja mirip dengan kebalikan method adminAddButtonActionPerformed, yakni ketika method ini dipanggil, dilakukan penghapusan data item pada itemList di itemManager yang sama dengan baris pada tabel yang dipilih pengguna (menggunakan fungsi getItemOnSelectedRow )  sekaligus penghapusan baris pada database, dengan pemanggilan method deleteRow pada objek itemManager. Kemudian, dilakukan penghapusan baris yang dipilih pengguna pada tabel, dengan sintaks model.removeRow(itemTable.getSelectedRow());

orderButtonActionPerformed. Method ini dipanggil ketika tombol orderButton yang bergambar ( ) ditekan. Method ini pertama-tama akan melakukan pengambilan objek item dari baris yang dipilih pelanggan. Selanjutnya, program akan mengecek apakah barang yang dipilih sudah dipesan atau belum, dengan melihat nilai atribut custID pada item. Jika barang sudah dipesan, program akan memunculkan pesan peringatan bahwa barang yang dipilih sudah dipesan pelanggan lain. Apabila barang belum dipesan pelanggan lain,  dilakukan pembuatan objek customer yang attribut-attributnya berasal dari isi text field yang dimasukkan pengguna, dan pengecekan kembali apakah attribut nama, alamat, dan nomor telepon pada customer sudah berisi atau tidak. Kemudian, dilakukan pemanggilan method orderItem pada objek customerManager, membuat nilai custID pada item yang dipilih diisi dengan customer id pelanggan yang ingin membeli dan barang yang dipilih masuk ke dalam keranjang belanja pemesan. Terakhir, data dalam tabel di-update dengan menghapus baris barang yang dipesan dan menambahkan baris dengan data barang yang sama namun kolom “Dipesan oleh” sudah tidak nol lagi, yang menandakan bahwa barang tersebut telah dipesan.

aboutItemMouseReleased. Method ini dipanggil ketika menu “about” dipilih. Dalam badan methodnya, terdapat perintah membuat meng-instans objek dari kelas AboutBox dan membuat komponen-komponennya terlihat pada layar, menggunakan method setVisible. Kelas AboutBox ini merupakan turunan dari kelas JDialog dari package javax.swing . Kelas ini digunakan untuk menampilkan dialog berisi informasi about program. Ketika kelas diinstans, JVM akan memanggil konstruktor kelas :

public AboutBox(java.awt.Frame parent, boolean modal) {
              super(parent, modal);
            initComponents();
}

Dalam konstruktor, terdapat pemanggilan konstruktor kelas induknya dengan perintah super(parent,modal) yang menyetel parent dan modality dialog. Selanjutnya, method initComponents akan dipanggil. Method initComponents ini akan mengininisialisasi instance variable pada objek dari kelas AboutBox yang baru diinstans sebagai komponen-komponen yang akan ditampilkan ke layar, seperti frame, gambar, dan button. Gambar-gambar yang diambil berasal dari package waroeng_laptop.UI.gambar .

paymentButtonActionPerformed. Method ini dipanggil ketika tombol payment bergmbar ( ) dipilih. Method ini akan melakukan pembuatan dialog PaymentDialog dengan masukan argumen parent frame objek menuUtama ini, objek customer dengan nilai custID yang diinginkan pengguna, objek itemManager dan customerManager untuk keperluan pengakses database. Isi method tersebut adalah sebagai berikut :

try {
Customer selectedCustomer = new Customer(Integer.parseInt(adminCustIDField.getText()));
    new PaymentDialog(this,selectedCustomer,customerManager,itemManager).setVisible(true);
     refreshTable();
}
catch (NumberFormatException ex) {
     JOptionPane.showMessageDialog(this, "Pastikan field customer ID terisi dengan benar.", "Peringatan", JOptionPane.WARNING_MESSAGE);
}
catch (ArrayIndexOutOfBoundsException ex) {
    JOptionPane.showMessageDialog(this, "Customer ID tidak terdaftar dalam database.", "Peringatan", JOptionPane.WARNING_MESSAGE);
}
catch (Exception ex) {
    JOptionPane.showMessageDialog(this, "Customer tidak memiliki barang yang akan dibeli.", "Peringatan", JOptionPane.WARNING_MESSAGE);
}

Saat pembentukan dialog PaymentDialog, objek selectedCustomer dicocokkan ke elemen-elemen customerList pada customerManager. Jika customer tidak terdapat dalam customer list, exception berjenis ArrayIndexOutOfBoundsException akan ditangkap dan program akan mengeluarkan pesan bahwa customer Id yang dimasukkan tidak cocok dalam database. Exception lain yang mungkin ditangkap adalah NumberFormatException ketika customer yang dimasukkan tidak terdapat dalam itemList, dan exception berjenis Exception yang dilempar method konstruktor kelas PaymentDialog ketika customer tidak memiliki barang yang dipesan. Jika customer terdapat dalam customerList, label-label pada bagian customer diisi dengan data pada customer yang diinginkan dan tabel pada dialog diisi dengan daftar barang yang dipesan oleh customer tersebut. Ketika pengguna memasukkan nilai uang yang akan dibayarkan pada label dan menekan tombol bayar, setiap item yang dibeli customer pada itemList di itemManager akan dihapus dan isi keranjang belanja customer juga dihapus. Kemudian, dimunculkan sebuah dialog berisi ucapan terima kasih dan nilai kembalian uang yang dibayarkan.

exitButtonActionPerformed. Ketika tombol exit bergambar ( ) ditekan.  Method ini akan dipanggil. Dalam method terdapat pernyataan kondisional switch-case. Ekspresi yang digunakan dalam switch-case ini adalah nilai balik dari pemanggilan JoptionPane .showOptionDialog  .Option dialog dari Jframe ini akan mengembalikan nilai balik nol jika pengguna menekan tombol “yes”, nilai balik 1 untuk tombol “no”, dan nilai 2 untuk tombol “cancel”. Untuk ekspresi bernilai 0 yang berarti pengguna ingin menyimpan perubahan data ke database dan keluar dari program, dilakukan eksekusi pernyataan-pernyataan SQL dalam connection pool ke server dengan menggunakan method commit pada objek itemManager, kemudian dilakukan penutupan koneksi ke server dengan method tutupKoneksi. Untuk ekspresi bernilai 1 yang berarti pengguna ingin keluar dari program tanpa melakukan penyimpanan perubahan data dalam database, dilakukan pembatalan eksekusi-eksekusi perintah SQL dalam connection pool dengan method rollBack dan penutupan koneksi database. Jika ekspresi bernilai selain 1 dan 0, method tidak melakukan apa-apa dan pengguna dapat kembali masuk ke program.

Wallahu a’lam, semoga bermanfaat.

30 Responses to Contoh Aplikasi Java dengan JDBC

  1. sekolahseks berkata:

    Wah..Aku salut banget sama pemilik blog ini…
    Artikelnya bagus.
    Ngomong-omong, anda dapat bahan postingnya dari mana aja?

    Saya akan menyimpan alamat url/link anda.
    Aku akan sering-sering mampir kesini membaca tulisan anda.
    Saya tunggu up-datetan nya..

    Salam sukses
    http://sekolahseks.wordpress.com

    • fahim007 berkata:

      terima kasih atas dukungannya… kebanyakan artikel di sini merupakan tugas-tugas kuliah saya atau artikel orang2 lain. Referensinya banyak, bisa dari ebook, wikipedia, dll. Tapi kalo artikel2 yang berhubungan dengan islam, biasanya ngambil dari search.salafy.ws ato langsung kopas aja dari sana..semoga aku memang seperti yang Anda sampaikan.. dan semoga aku juga diberi keistiqomahan seperti yang Anda sampaikan pula…

  2. dendysetyo berkata:

    eitssss…. promosi aplikasi waroenglaptop niy bro… SMANGAT!!!
    GW DUKUNG 100% bro… hehehe

    • fahim007 berkata:

      hehe, ya bro, moga2 hasil kuliah kita g cuman bikin pinter kita aj, tapi juga bisa mbuat pinter orang seluruh indonesia, hehe..

      oya, thx juga dukungan 100 % nya, hehe..

  3. echo berkata:

    nice work!

    terus berkarya!

  4. maya fitria berkata:

    gimana sih cara bikin table??
    aku udah nyoba bikin,
    tapi pas di call di main class nya gga bisa…..
    ini untuk tugas yang deadline nya tanggal 4 ini
    nyuhuhuhu T_T
    aku berharap ada pencerahan dalam pembuatan tabel itu

    • fahim007 berkata:

      hmm.. ada pesan error2 gt g pas di-compile? bikin table kalo di netbeans bukannya langsung drag and drop jTable nya aja mbak?

  5. ndut berkata:

    mas ndak bisa di donlot..tolong perbaiki link nya mas..
    makasih…

  6. farez berkata:

    gini mas……saya dah coba waroeng laptopnya pake netbeans 6.1 ama jDK 1.6 n JRE 1.6……trus muncul pesen ini…….
    unsupported form file version:1.6 the form cannot be opened

    mohon pencerahan maklum nubie

  7. tyas purnama berkata:

    mas,,ini termasuk j2ee ga?
    soalnya saya masi bingung,,
    saya dapet tugas j2ee tg aplikasi penjualan
    mohon bantuannya

  8. tyas purnama berkata:

    mas,,saya ce lo..
    qo d panggil mas :(

    mas fahmi bisa minta tolong bikinin cara pembuatannya ga? (dari awal)
    tolong kirim melalui email saya(mav merepotkan)
    saya bener” masi bingung menggunakan net.beans..
    saya minta izin buat ngeggunain waroeng laptop mas fahmi sebagai inspirasi buat tugas saya.makasi y sebelumnya^^

    • fahim007 berkata:

      wah..maaf salah panggil.. kan wajar belum kenalan..saya juga bukan fahmi, tapi fahim.. :(

      hmm cara pembuatannya? liat aja source codenya kan sudah saya publish..kalo bingung mungkin saya bisa bantu jelaskan lagi..hehe, intinya kan programny ngakses database mySQL pake JDBC..nggak terlalu sulit sebenarnya.

      silakan kalo ini bs dijadiin inspirasi tugas mbak..senang bisa membantu..^^

  9. tyas purnama berkata:

    waa..saya jg salah manggil ne..maaf jg deh :)

    nah ntu pas d netbeansnya d bag categories ada banyak pilihan tuh.java,java web bla..blaaa..trus d projectsny jg ada pilihanny jg.jd saya pilih yg mana?

  10. boogil berkata:

    bro untuk databasenya filenya kok ga ada?

  11. maria berkata:

    mas yang penjelasan tentang pencarian kok ga ada ya?

  12. Verdy berkata:

    numpang download y gan…

  13. Verdy berkata:

    numpang download y…

  14. irmanf berkata:

    thank banget broo untuk pencariannya…

  15. ObatAntiRokok berkata:

    mantap berkarya

  16. jaka69 berkata:

    bang..source codenya ilang..
    Link Mati bank..
    tlg reupload lg bleh bang??

  17. Oke berkata:

    masih rusak tuh link nya gan !

  18. Aditya Darmawan berkata:

    Jazakallah brother.

    Sangat bermanfaat tutorialnya buat yang newbie di pulau Java.

    Sekali lagi… Jazakallah…

  19. cintamy berkata:

    link downloadnya sudah di hapus ya?? bisa reupload?

Tinggalkan Balasan ke fahim007 Batalkan balasan