Pemrograman Java Netbean IDE Konsep OOP DAO

Tulisan ini adalah dokumentasi pribadi sekaligus tutorial tentang pemrograman Java menggunakan NetBeans IDE dengan menerapkan konsep OOP (Object-Oriented Programming) dan pola desain DAO (Data Access Object). Meskipun menggunakan NetBeans yang mungkin terasa "jadul" bagi sebagian developer saat ini, pola DAO tetap menjadi standar emas dalam arsitektur aplikasi Java desktop untuk memisahkan logika bisnis dan akses database.

Artikel Pemrograman Java NetBeans IDE Konsep OOP DAO ini hanya catatan kecil tentang bagaimana menginput satu nama siswa ke dalam tbl_siswa, lengkap dengan file koneksi.java, Interface, Model, dan View. Saya telah menerapkan pemrograman NetBeans gaya lama, dan ternyata pola ini sangat membantu agar kode tidak terstruktur secara acak dan tidak memusingkan saat skala proyek membesar.

Pada directory proyek, saya membuat package-package yang dikhususkan untuk interface, model, view, dan implement seperti terlihat pada praktik pemrograman Java NetBeans IDE konsep OOP DAO saya berikut:

Struktur Package Directory Java NetBeans IDE DAO

Gambar 1: Gambar Stuktur Package Directory Pada Java Netbean Menggunakan Konsep DAO

Agar saya mudah memahaminya, saya membuatnya hanya dengan dua field di table database yang diberi nama tbl_siswa, yaitu field id_siswa, dan field nama_siswa.

Struktur Tabel Siswa MySQL untuk Java DAO

Gambar 2: Gambar struktur table siswa menggunakan mysql

Apa itu DAO (Data Access Object)?

DAO adalah singkatan dari Data Access Object, sebuah pola desain (design pattern) yang digunakan dalam pengembangan perangkat lunak untuk memisahkan logika bisnis atau aplikasi dari akses langsung ke data. Pola ini bertujuan untuk menciptakan abstraksi antara objek bisnis atau aplikasi dengan cara bagaimana data disimpan dan diakses dari database atau sumber data lainnya.

Tujuan dan Manfaat DAO

  • Abstraksi Koneksi Database: DAO memungkinkan aplikasi untuk berkomunikasi dengan database melalui operasi yang didefinisikan dalam DAO tanpa harus mengkhawatirkan detail koneksi dan komunikasi dengan database.
  • Memisahkan Logika Aplikasi: Dengan menggunakan DAO, logika bisnis (seperti operasi CRUD - Create, Read, Update, Delete) dapat dipisahkan dari detail implementasi akses data. Hal ini memudahkan perawatan dan pengembangan aplikasi.
  • Meningkatkan Pengujian: DAO memfasilitasi pengujian unit yang lebih baik karena logika bisnis dapat diuji tanpa ketergantungan pada sumber data aktual. Anda dapat membuat mock atau stub objek DAO untuk menguji logika bisnis tanpa terhubung ke database sebenarnya.
  • Fleksibilitas dan Penggantian Sumber Data: Aplikasi dapat lebih fleksibel dalam mengubah atau mengganti sumber data. Misalnya, jika Anda memutuskan untuk beralih dari database relasional ke NoSQL, Anda hanya perlu mengubah implementasi DAO tanpa mengubah logika aplikasi.

Komponen Utama DAO

  • Interface DAO: Mendefinisikan operasi umum yang dapat dilakukan pada objek data, seperti penyimpanan (insert), pengambilan (retrieve), update, dan penghapusan (delete).
  • Implementasi DAO: Kelas yang mengimplementasikan interface DAO dan bertanggung jawab untuk menjalankan operasi akses data sesuai dengan jenis sumber data yang digunakan.
  • Objek Bisnis (Model): Objek atau model data yang direpresentasikan oleh aplikasi atau sistem. DAO bertanggung jawab untuk melakukan operasi CRUD pada objek-objek ini.

Contoh Penggunaan DAO

Misalkan Anda memiliki aplikasi manajemen siswa di sekolah. Anda dapat memiliki kelas Siswa sebagai objek bisnis yang memiliki atribut seperti nama, usia, dan kelas. DAO untuk kelas Siswa akan menyediakan operasi untuk menyimpan, mengambil, mengupdate, dan menghapus data siswa dari database. Dengan demikian, aplikasi tidak perlu mengetahui detail bagaimana koneksi ke database dilakukan atau bagaimana operasi SQL diimplementasikan, yang semuanya diurus oleh DAO.

Penggunaan pola DAO membantu meningkatkan struktur, fleksibilitas, dan perawatan dari aplikasi. Ini adalah prinsip dasar dalam desain perangkat lunak modern yang membantu dalam manajemen kompleksitas aplikasi.

Implementasi Kode Java NetBeans (CRUD DAO)

Berikut adalah kode-kode dalam struktur package yang saya sebutkan sebelumnya.

1. File Implementasi DAO: SiswaDAOImpl.java

File di dalam directory Implement bernama SiswaDAOImpl.java. Berikut isinya:

package Implement;

import Interface.InterfaceSiswa;
import conf.koneksi;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import model.modelSiswa;

public class SiswaDAOImpl implements InterfaceSiswa {
    private Connection conn = new koneksi().connect();

    @Override
    public void tambahSiswa(modelSiswa siswa) {
        try {
            String sql = "INSERT INTO tbl_siswa (nama_siswa) values (?)";
            PreparedStatement st = conn.prepareStatement(sql);
            st.setString(1, siswa.getNamaSiswa());
            int rowTambah = st.executeUpdate();
            if (rowTambah > 0) {
                System.out.println("Data Berhasil di tambah");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void updateSiswa(modelSiswa siswa) {
        try {
            String sql = "UPDATE tbl_siswa set nama_siswa=? where id_siswa=?";
            PreparedStatement st = conn.prepareStatement(sql);
            st.setString(1, siswa.getNamaSiswa());
            st.setInt(2, siswa.getIdSiswa());
            int rowTambah = st.executeUpdate();
            if (rowTambah > 0) {
                System.out.println("Data Berhasil di update");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public List<modelSiswa> getAllSiswa() {
        List<modelSiswa> daftarSiswa = new ArrayList<>();
        String sql = "SELECT * FROM tbl_siswa";
        try {
            java.sql.Statement st = conn.createStatement();
            ResultSet rs = st.executeQuery(sql);

            while (rs.next()) {
                int idSiswa = rs.getInt("id_siswa");
                String namaSiswa = rs.getString("nama_siswa");
                modelSiswa siswa = new modelSiswa(idSiswa, namaSiswa);
                daftarSiswa.add(siswa);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return daftarSiswa;
    }

    @Override
    public void deleteSiswa(int idSiswa) {
        String sql = "DELETE FROM tbl_siswa WHERE id_siswa = ?";
        try (PreparedStatement st = conn.prepareStatement(sql)) {
            st.setInt(1, idSiswa);

            int rowsDeleted = st.executeUpdate();
            if (rowsDeleted > 0) {
                JOptionPane.showMessageDialog(null, "Data siswa berhasil dihapus.");
            }
        } catch (SQLException ex) {
            Logger.getLogger(SiswaDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

2. File Interface: InterfaceSiswa.java

File dalam package interface saya beri nama InterfaceSiswa.java. Pembuatan file ini menggunakan Java Interface bukan Java Class. Berikut filenya:

package Interface;

import java.util.List;
import model.modelSiswa;

/**
 *
 * @author HAPESINDO
 */
public interface InterfaceSiswa {
    void tambahSiswa(modelSiswa siswa);
    List<modelSiswa> getAllSiswa();
    void updateSiswa(modelSiswa siswa);
    void deleteSiswa(int idSiswa);
}

3. File Koneksi Database: koneksi.java

Directory conf berisi file koneksi.java. Berikut kodenya:

package conf;

import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;

public class koneksi {
    private Connection koneksi;
    
    public Connection connect() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(koneksi.class.getName()).log(Level.SEVERE, null, ex);
        }

        String url = "jdbc:mysql://localhost:3306/sekolahxyz";
        try {
            koneksi = DriverManager.getConnection(url, "root", "root");
        } catch (SQLException ex) {
            Logger.getLogger(koneksi.class.getName()).log(Level.SEVERE, null, ex);
        }
        return koneksi;
    }

    public PreparedStatement prepareStatement(String sql) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}

4. File Model: modelSiswa.java

Kemudian ada file model, yang isinya modelSiswa.java untuk merepresentasikan objek siswa:

package model;

public class modelSiswa {
    private int idSiswa;
    private String namaSiswa;

    public modelSiswa(int idSiswa, String namaSiswa) {
        this.idSiswa = idSiswa;
        this.namaSiswa = namaSiswa;
    }

    public int getIdSiswa() {
        return idSiswa;
    }

    public void setIdSiswa(int idSiswa) {
        this.idSiswa = idSiswa;
    }

    public String getNamaSiswa() {
        return namaSiswa;
    }

    public void setNamaSiswa(String namaSiswa) {
        this.namaSiswa = namaSiswa;
    }
}

5. File View: siswaView.java

Lalu ada file siswaView, bagian ini yang ditampilkan di layar (GUI). Catatan: Kode di bawah ini adalah gabungan dari kode generate otomatis NetBeans dan kode tambahan (logika CRUD) yang saya buat untuk menghubungkan tombol dan tabel.

package view;

import Implement.SiswaDAOImpl;
import Interface.InterfaceSiswa;
import conf.koneksi;
import java.sql.Connection;
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import model.modelSiswa;

public class siswaView extends javax.swing.JFrame {
    private Connection conn = new koneksi().connect();
    private InterfaceSiswa intSiswa;
    private DefaultTableModel tblModel;

    public siswaView() {
        initComponents();
        intSiswa = new SiswaDAOImpl();
        tampilDataSiswa();
    }

    // --- KODE TAMBAHAN UNTUK CRUD ---

    private void btnTambahSiswaActionPerformed(java.awt.event.ActionEvent evt) {
        String nama_siswa = txtNamaSiswa.getText();
        modelSiswa msiswa = new modelSiswa(0, nama_siswa);
        intSiswa.tambahSiswa(msiswa);
        tampilDataSiswa();
    }

    private void tblDataSiswaMouseClicked(java.awt.event.MouseEvent evt) {
        int bar = tblDataSiswa.getSelectedRow();
        String a = tblModel.getValueAt(bar, 0).toString();
        String b = tblModel.getValueAt(bar, 1).toString();
        txtNamaSiswa.setText(b);
    }

    private void btnUpdateActionPerformed(java.awt.event.ActionEvent evt) {
        int rowIndex = tblDataSiswa.getSelectedRow();
        if (rowIndex != -1) {
            int id = (int) tblDataSiswa.getValueAt(rowIndex, 0);
            String nama = txtNamaSiswa.getText();
            modelSiswa siswa = new modelSiswa(id, nama);
            intSiswa.updateSiswa(siswa);

            // Refresh data setelah update
            tampilDataSiswa();
            JOptionPane.showMessageDialog(this, "Data siswa berhasil diupdate.");
        } else {
            JOptionPane.showMessageDialog(this, "Pilih data siswa yang akan diupdate.");
        }
    }

    private void btnHapusActionPerformed(java.awt.event.ActionEvent evt) {
        int rowIndex = tblDataSiswa.getSelectedRow();
        if (rowIndex != -1) {
            int id = (int) tblDataSiswa.getValueAt(rowIndex, 0);
            intSiswa.deleteSiswa(id);

            // Refresh data setelah hapus
            tampilDataSiswa();
            JOptionPane.showMessageDialog(this, "Anda Yakin mau hapus.");
        } else {
            JOptionPane.showMessageDialog(this, "Pilih data siswa yang akan dihapus.");
        }
    }

    private void tampilDataSiswa() {
        tblModel = new DefaultTableModel();
        tblModel.addColumn("ID");
        tblModel.addColumn("NAMA SISWA");
        List<modelSiswa> daftarSiswa = intSiswa.getAllSiswa();
        for (modelSiswa siswa : daftarSiswa) {
            tblModel.addRow(new Object[]{siswa.getIdSiswa(), siswa.getNamaSiswa()});
        }
        tblDataSiswa.setModel(tblModel);
    }
}

Kode-kode Java NetBeans IDE di atas yang merupakan logika CRUD (seperti pemanggilan intSiswa, tampilDataSiswa, dan aksi tombol) merupakan kode tambahan dari bawaan generate NetBeans. Untuk frame saya gunakan 2 textfield, 1 table, dan button seperti terlihat dalam kode di atas.

Dengan memisahkan kode ke dalam package Interface, Model, View, dan Implement menggunakan pola DAO, aplikasi Java desktop Anda akan jauh lebih rapi, mudah di-maintain, dan siap untuk dikembangkan dalam skala yang lebih besar. Selamat mencoba!