PBO 15

    muhammad rafi budi purnama

5025221307

PBO 15

CRUD

Tugas ini merupakan implementasi CRUD yang merupakan singkatan operasi Create, Read, Update dan Delete. Untuk mengerjakan tugas ini, kita membuat implementasinya dengan class diagram seperti gambar dibawah.


Sebelum mengimplementasikan kode dari CRUD, kita perlu melakukan konfigurasi tambahan yaitu Java Database Connectivity (JDBC) dengan cara mendownloadnya pada postgreSQL (karena pada kali ini implementasinya menggunakan PostgreSql). Setelah mendownload JDBC yang sesuai dengan versi java, kita perlu menambahkannya ke tools -> preferences -> libraries -> add .jar. selanjutnya kita bisa menambahkan tabel ke database dengan cara menuliskan script pada PGadmin seperti berikut.

CREATE DATABASE perpustakaan;

-- Buat tabel buku
CREATE TABLE buku (
    id SERIAL PRIMARY KEY,
    judul VARCHAR(200) NOT NULL,
    pengarang VARCHAR(100) NOT NULL,
    penerbit VARCHAR(100) NOT NULL,
    tahun INTEGER NOT NULL
);


Setelah kita menambahkan .jar ke BlueJ. kita bisa melanjutkan pemrograman dari aplikasi CRUD nya. Berikut implementasinya.

MainMenu.java
import java.sql.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.*;

public class MainMenu extends JFrame {
    private JTable table;
    private DefaultTableModel tableModel;
    private BukuDAO bukuDAO;
    
    private JTextField txtJudul, txtPengarang, txtPenerbit, txtTahun, txtCari;
    private JButton btnTambah, btnUpdate, btnHapus, btnClear, btnCari, btnRefresh;
    
    private int selectedId = -1;
    
    public MainMenu() {
        bukuDAO = new BukuDAO();
        initComponents();
        loadData();
    }
    
    private void initComponents() {
        setTitle("Sistem Manajemen Perpustakaan");
        setSize(1000, 600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setLayout(new BorderLayout(10, 10));
        
        // Panel Atas - Judul
        JPanel topPanel = new JPanel();
        topPanel.setBackground(new Color(41, 128, 185));
        topPanel.setPreferredSize(new Dimension(1000, 60));
        JLabel lblTitle = new JLabel("MANAJEMEN DATA BUKU");
        lblTitle.setFont(new Font("Arial", Font.BOLD, 24));
        lblTitle.setForeground(Color.WHITE);
        topPanel.add(lblTitle);
        
        // Panel Kiri - Form Input
        JPanel leftPanel = new JPanel();
        leftPanel.setLayout(new GridBagLayout());
        leftPanel.setBackground(new Color(236, 240, 241));
        leftPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
        leftPanel.setPreferredSize(new Dimension(350, 500));
        
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.insets = new Insets(5, 5, 5, 5);
        
        // Form Title
        JLabel formTitle = new JLabel("FORM DATA BUKU");
        formTitle.setFont(new Font("Arial", Font.BOLD, 16));
        gbc.gridx = 0; gbc.gridy = 0; gbc.gridwidth = 2;
        leftPanel.add(formTitle, gbc);
        
        gbc.gridwidth = 1;
        
        // Judul
        gbc.gridx = 0; gbc.gridy = 1;
        leftPanel.add(new JLabel("Judul:"), gbc);
        txtJudul = new JTextField(20);
        gbc.gridx = 1;
        leftPanel.add(txtJudul, gbc);
        
        // Pengarang
        gbc.gridx = 0; gbc.gridy = 2;
        leftPanel.add(new JLabel("Pengarang:"), gbc);
        txtPengarang = new JTextField(20);
        gbc.gridx = 1;
        leftPanel.add(txtPengarang, gbc);
        
        // Penerbit
        gbc.gridx = 0; gbc.gridy = 3;
        leftPanel.add(new JLabel("Penerbit:"), gbc);
        txtPenerbit = new JTextField(20);
        gbc.gridx = 1;
        leftPanel.add(txtPenerbit, gbc);
        
        // Tahun
        gbc.gridx = 0; gbc.gridy = 4;
        leftPanel.add(new JLabel("Tahun:"), gbc);
        txtTahun = new JTextField(20);
        gbc.gridx = 1;
        leftPanel.add(txtTahun, gbc);
        
        // Panel Tombol
        JPanel buttonPanel = new JPanel(new GridLayout(2, 2, 10, 10));
        buttonPanel.setBackground(new Color(236, 240, 241));
        
        btnTambah = new JButton("Tambah");
        btnTambah.setBackground(new Color(46, 204, 113));
        btnTambah.setForeground(Color.WHITE);
        btnTambah.setFocusPainted(false);
        btnTambah.addActionListener(e -> tambahBuku());
        
        btnUpdate = new JButton("Update");
        btnUpdate.setBackground(new Color(52, 152, 219));
        btnUpdate.setForeground(Color.WHITE);
        btnUpdate.setFocusPainted(false);
        btnUpdate.addActionListener(e -> updateBuku());
        
        btnHapus = new JButton("Hapus");
        btnHapus.setBackground(new Color(231, 76, 60));
        btnHapus.setForeground(Color.WHITE);
        btnHapus.setFocusPainted(false);
        btnHapus.addActionListener(e -> hapusBuku());
        
        btnClear = new JButton("Clear");
        btnClear.setBackground(new Color(149, 165, 166));
        btnClear.setForeground(Color.WHITE);
        btnClear.setFocusPainted(false);
        btnClear.addActionListener(e -> clearForm());
        
        buttonPanel.add(btnTambah);
        buttonPanel.add(btnUpdate);
        buttonPanel.add(btnHapus);
        buttonPanel.add(btnClear);
        
        gbc.gridx = 0; gbc.gridy = 5; gbc.gridwidth = 2;
        gbc.insets = new Insets(20, 5, 5, 5);
        leftPanel.add(buttonPanel, gbc);
        
        // Panel Tengah - Tabel
        JPanel centerPanel = new JPanel(new BorderLayout(5, 5));
        centerPanel.setBackground(Color.WHITE);
        centerPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        
        // Panel Pencarian
        JPanel searchPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        searchPanel.setBackground(Color.WHITE);
        searchPanel.add(new JLabel("Cari:"));
        txtCari = new JTextField(20);
        searchPanel.add(txtCari);
        
        btnCari = new JButton("Cari");
        btnCari.setBackground(new Color(52, 152, 219));
        btnCari.setForeground(Color.WHITE);
        btnCari.addActionListener(e -> cariBuku());
        searchPanel.add(btnCari);
        
        btnRefresh = new JButton("Refresh");
        btnRefresh.setBackground(new Color(149, 165, 166));
        btnRefresh.setForeground(Color.WHITE);
        btnRefresh.addActionListener(e -> loadData());
        searchPanel.add(btnRefresh);
        
        // Tabel
        tableModel = new DefaultTableModel();
        table = new JTable(tableModel);
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        table.getSelectionModel().addListSelectionListener(e -> {
            if (!e.getValueIsAdjusting()) {
                selectRow();
            }
        });
        
        JScrollPane scrollPane = new JScrollPane(table);
        
        centerPanel.add(searchPanel, BorderLayout.NORTH);
        centerPanel.add(scrollPane, BorderLayout.CENTER);
        
        // Tambahkan semua panel ke frame
        add(topPanel, BorderLayout.NORTH);
        add(leftPanel, BorderLayout.WEST);
        add(centerPanel, BorderLayout.CENTER);
    }
    
    private void loadData() {
        tableModel = bukuDAO.getAllBuku();
        table.setModel(tableModel);
        clearForm();
    }
    
    private void tambahBuku() {
        if (validateInput()) {
            Buku buku = new Buku();
            buku.setJudul(txtJudul.getText());
            buku.setPengarang(txtPengarang.getText());
            buku.setPenerbit(txtPenerbit.getText());
            buku.setTahun(Integer.parseInt(txtTahun.getText()));
            
            if (bukuDAO.tambahBuku(buku)) {
                JOptionPane.showMessageDialog(this, "Buku berhasil ditambahkan!");
                loadData();
            } else {
                JOptionPane.showMessageDialog(this, "Gagal menambahkan buku!", "Error", JOptionPane.ERROR_MESSAGE);
            }
        }
    }
    
    private void updateBuku() {
        if (selectedId == -1) {
            JOptionPane.showMessageDialog(this, "Pilih buku yang akan diupdate!", "Peringatan", JOptionPane.WARNING_MESSAGE);
            return;
        }
        
        if (validateInput()) {
            Buku buku = new Buku();
            buku.setId(selectedId);
            buku.setJudul(txtJudul.getText());
            buku.setPengarang(txtPengarang.getText());
            buku.setPenerbit(txtPenerbit.getText());
            buku.setTahun(Integer.parseInt(txtTahun.getText()));
            
            if (bukuDAO.updateBuku(buku)) {
                JOptionPane.showMessageDialog(this, "Buku berhasil diupdate!");
                loadData();
            } else {
                JOptionPane.showMessageDialog(this, "Gagal mengupdate buku!", "Error", JOptionPane.ERROR_MESSAGE);
            }
        }
    }
    
    private void hapusBuku() {
        if (selectedId == -1) {
            JOptionPane.showMessageDialog(this, "Pilih buku yang akan dihapus!", "Peringatan", JOptionPane.WARNING_MESSAGE);
            return;
        }
        
        int confirm = JOptionPane.showConfirmDialog(this, "Yakin ingin menghapus buku ini?", "Konfirmasi", JOptionPane.YES_NO_OPTION);
        
        if (confirm == JOptionPane.YES_OPTION) {
            if (bukuDAO.hapusBuku(selectedId)) {
                JOptionPane.showMessageDialog(this, "Buku berhasil dihapus!");
                loadData();
            } else {
                JOptionPane.showMessageDialog(this, "Gagal menghapus buku!", "Error", JOptionPane.ERROR_MESSAGE);
            }
        }
    }
    
    private void cariBuku() {
        String keyword = txtCari.getText().trim();
        if (keyword.isEmpty()) {
            loadData();
        } else {
            tableModel = bukuDAO.cariBuku(keyword);
            table.setModel(tableModel);
        }
    }
    
    private void selectRow() {
        int row = table.getSelectedRow();
        if (row != -1) {
            selectedId = (int) table.getValueAt(row, 0);
            txtJudul.setText((String) table.getValueAt(row, 1));
            txtPengarang.setText((String) table.getValueAt(row, 2));
            txtPenerbit.setText((String) table.getValueAt(row, 3));
            txtTahun.setText(String.valueOf(table.getValueAt(row, 4)));
        }
    }
    
    private void clearForm() {
        txtJudul.setText("");
        txtPengarang.setText("");
        txtPenerbit.setText("");
        txtTahun.setText("");
        txtCari.setText("");
        selectedId = -1;
        table.clearSelection();
    }
    
    private boolean validateInput() {
        if (txtJudul.getText().trim().isEmpty()) {
            JOptionPane.showMessageDialog(this, "Judul tidak boleh kosong!", "Peringatan", JOptionPane.WARNING_MESSAGE);
            return false;
        }
        if (txtPengarang.getText().trim().isEmpty()) {
            JOptionPane.showMessageDialog(this, "Pengarang tidak boleh kosong!", "Peringatan", JOptionPane.WARNING_MESSAGE);
            return false;
        }
        if (txtPenerbit.getText().trim().isEmpty()) {
            JOptionPane.showMessageDialog(this, "Penerbit tidak boleh kosong!", "Peringatan", JOptionPane.WARNING_MESSAGE);
            return false;
        }
        try {
            int tahun = Integer.parseInt(txtTahun.getText().trim());
            if (tahun < 1000 || tahun > 9999) {
                JOptionPane.showMessageDialog(this, "Tahun harus 4 digit!", "Peringatan", JOptionPane.WARNING_MESSAGE);
                return false;
            }
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(this, "Tahun harus berupa angka!", "Peringatan", JOptionPane.WARNING_MESSAGE);
            return false;
        }
        return true;
    }
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            new MainMenu().setVisible(true);
        });
    }
}

Database.java
import java.sql.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.*;

// File 1: Database.java - Koneksi Database
class Database {
    private static final String URL = "jdbc:postgresql://localhost:5432/pbo_perpustakaan";
    private static final String USER = "postgres";
    private static final String PASSWORD = "180204"; // Ganti dengan password Anda
    
    private static Connection connection = null;
    
    // Method untuk mendapatkan koneksi
    public static Connection getConnection() {
        try {
            if (connection == null || connection.isClosed()) {
                Class.forName("org.postgresql.Driver");
                connection = DriverManager.getConnection(URL, USER, PASSWORD);
                System.out.println("Koneksi database berhasil!");
            }
        } catch (ClassNotFoundException e) {
            System.out.println("Driver PostgreSQL tidak ditemukan!");
            JOptionPane.showMessageDialog(null, 
                "Driver PostgreSQL tidak ditemukan!\nPastikan postgresql.jar sudah ditambahkan ke BlueJ.", 
                "Error", JOptionPane.ERROR_MESSAGE);
        } catch (SQLException e) {
            System.out.println("Koneksi database gagal: " + e.getMessage());
            JOptionPane.showMessageDialog(null, 
                "Koneksi database gagal!\n" + e.getMessage(), 
                "Error", JOptionPane.ERROR_MESSAGE);
        }
        return connection;
    }
    
    // Method untuk menutup koneksi
    public static void closeConnection() {
        try {
            if (connection != null && !connection.isClosed()) {
                connection.close();
                System.out.println("Koneksi database ditutup.");
            }
        } catch (SQLException e) {
            System.out.println("Error menutup koneksi: " + e.getMessage());
        }
    }
}


BukuDAO.java
import java.sql.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.*;
class BukuDAO {
    
    // CREATE - Tambah Buku
    public boolean tambahBuku(Buku buku) {
        String sql = "INSERT INTO buku (judul, pengarang, penerbit, tahun) VALUES (?, ?, ?, ?)";
        
        try (Connection conn = Database.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            
            pstmt.setString(1, buku.getJudul());
            pstmt.setString(2, buku.getPengarang());
            pstmt.setString(3, buku.getPenerbit());
            pstmt.setInt(4, buku.getTahun());
            
            int result = pstmt.executeUpdate();
            return result > 0;
            
        } catch (SQLException e) {
            System.out.println("Error tambah buku: " + e.getMessage());
            return false;
        }
    }
    
    // READ - Ambil semua buku
    public DefaultTableModel getAllBuku() {
        DefaultTableModel model = new DefaultTableModel();
        model.addColumn("ID");
        model.addColumn("Judul");
        model.addColumn("Pengarang");
        model.addColumn("Penerbit");
        model.addColumn("Tahun");
        
        String sql = "SELECT * FROM buku ORDER BY id";
        
        try (Connection conn = Database.getConnection();
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery(sql)) {
            
            while (rs.next()) {
                Object[] row = {
                    rs.getInt("id"),
                    rs.getString("judul"),
                    rs.getString("pengarang"),
                    rs.getString("penerbit"),
                    rs.getInt("tahun")
                };
                model.addRow(row);
            }
            
        } catch (SQLException e) {
            System.out.println("Error ambil data: " + e.getMessage());
        }
        
        return model;
    }
    
    // UPDATE - Update buku
    public boolean updateBuku(Buku buku) {
        String sql = "UPDATE buku SET judul=?, pengarang=?, penerbit=?, tahun=? WHERE id=?";
        
        try (Connection conn = Database.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            
            pstmt.setString(1, buku.getJudul());
            pstmt.setString(2, buku.getPengarang());
            pstmt.setString(3, buku.getPenerbit());
            pstmt.setInt(4, buku.getTahun());
            pstmt.setInt(5, buku.getId());
            
            int result = pstmt.executeUpdate();
            return result > 0;
            
        } catch (SQLException e) {
            System.out.println("Error update buku: " + e.getMessage());
            return false;
        }
    }
    
    // DELETE - Hapus buku
    public boolean hapusBuku(int id) {
        String sql = "DELETE FROM buku WHERE id=?";
        
        try (Connection conn = Database.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            
            pstmt.setInt(1, id);
            int result = pstmt.executeUpdate();
            return result > 0;
            
        } catch (SQLException e) {
            System.out.println("Error hapus buku: " + e.getMessage());
            return false;
        }
    }
    
    // SEARCH - Cari buku berdasarkan judul
    public DefaultTableModel cariBuku(String keyword) {
        DefaultTableModel model = new DefaultTableModel();
        model.addColumn("ID");
        model.addColumn("Judul");
        model.addColumn("Pengarang");
        model.addColumn("Penerbit");
        model.addColumn("Tahun");
        
        String sql = "SELECT * FROM buku WHERE LOWER(judul) LIKE LOWER(?) OR LOWER(pengarang) LIKE LOWER(?)";
        
        try (Connection conn = Database.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            
            String searchPattern = "%" + keyword + "%";
            pstmt.setString(1, searchPattern);
            pstmt.setString(2, searchPattern);
            
            ResultSet rs = pstmt.executeQuery();
            
            while (rs.next()) {
                Object[] row = {
                    rs.getInt("id"),
                    rs.getString("judul"),
                    rs.getString("pengarang"),
                    rs.getString("penerbit"),
                    rs.getInt("tahun")
                };
                model.addRow(row);
            }
            
        } catch (SQLException e) {
            System.out.println("Error cari buku: " + e.getMessage());
        }
        
        return model;
    }
}

Buku.java

import java.sql.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.*;
class Buku {
    private int id;
    private String judul;
    private String pengarang;
    private String penerbit;
    private int tahun;
    
    public Buku() {}
    
    public Buku(int id, String judul, String pengarang, String penerbit, int tahun) {
        this.id = id;
        this.judul = judul;
        this.pengarang = pengarang;
        this.penerbit = penerbit;
        this.tahun = tahun;
    }
    
    // Getters and Setters
    public int getId() { return id; }
    public void setId(int id) { this.id = id; }
    
    public String getJudul() { return judul; }
    public void setJudul(String judul) { this.judul = judul; }
    
    public String getPengarang() { return pengarang; }
    public void setPengarang(String pengarang) { this.pengarang = pengarang; }
    
    public String getPenerbit() { return penerbit; }
    public void setPenerbit(String penerbit) { this.penerbit = penerbit; }
    
    public int getTahun() { return tahun; }
    public void setTahun(int tahun) { this.tahun = tahun; }
}



Setelah semua file .java dilakukan compile. Hasilnya bisa ditampilkan dengan cara menjalankan MainMenu. Gambar diatas merupakan hasil ketika program dijalankan.

Komentar

Postingan populer dari blog ini

TUGAS 2 : Jettpack compose : Hello, World!

Pertemuan 3 PPB (A) - Mengenal Composable Aplikasi Selamat Ulang Tahun

Pertemuan 5 - Aplikasi Kalkulator Sederhana