Senin, 08 Desember 2025

Pertemuan 15 : Aplikasi CRUD JAVA

Pertemuan 15 - Java CRUD Database

Tanggal: 9 Desember 2025
Nama: Hosea Felix Sanjaya
NRP: 5025241177


a. Setup & Persiapan Environment

Sebelum menjalankan program, terdapat beberapa langkah konfigurasi yang harus dilakukan agar Java dapat berkomunikasi dengan database MySQL.

1. Download Library MySQL Connector

  • Kunjungi: MySQL Connector/J Download
  • Pilih menu Platform Independent.
  • Download file format .zip.
  • Ekstrak file zip tersebut dan ambil file mysql-connector-java-xx.jar.

2. Integrasi ke BlueJ

  • Buka BlueJ, kemudian navigasi ke menu: ToolsPreferencesLibraries.
  • Klik tombol Add dan pilih file .jar yang sudah diekstrak tadi.
  • Restart BlueJ agar library terbaca dengan sempurna.

3. Setup Database (XAMPP)

  • Jalankan aplikasi XAMPP.
  • Start module Apache dan MySQL.
  • Buka browser dan akses: localhost/phpmyadmin/.
  • Jalankan query SQL (dari file prep.sql) untuk membuat database bernama perpustakaan dan tabel buku.


Cuplikan Kode Login.java


import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Login {
    private final String USERNAME = "james3302";
    private final String PASSWORD = "pass";

    private JTextField txtUsername;
    private JPasswordField txtPassword;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Login().createAndShowGUI());
    }

    private void createAndShowGUI() {
        JFrame frame = new JFrame("Login");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.insets = new Insets(6, 6, 6, 6);

        c.gridx = 0;
        c.gridy = 0;
        c.anchor = GridBagConstraints.EAST;
        panel.add(new JLabel("Username:"), c);

        c.gridx = 1;
        c.anchor = GridBagConstraints.WEST;
        txtUsername = new JTextField(15);
        panel.add(txtUsername, c);

        c.gridx = 0;
        c.gridy = 1;
        c.anchor = GridBagConstraints.EAST;
        panel.add(new JLabel("Password:"), c);

        c.gridx = 1;
        c.anchor = GridBagConstraints.WEST;
        txtPassword = new JPasswordField(15); 
        panel.add(txtPassword, c);

        c.gridx = 0;
        c.gridy = 2;
        c.gridwidth = 2;
        c.anchor = GridBagConstraints.CENTER;
        JPanel btnPanel = new JPanel();
        JButton btnLogin = new JButton("Login");
        btnLogin.addActionListener(new LoginListener());
        JButton btnCancel = new JButton("Cancel");
        btnCancel.addActionListener(new CancelListener());
        btnPanel.add(btnLogin);
        btnPanel.add(btnCancel);
        panel.add(btnPanel, c);

        frame.getContentPane().add(panel);
        frame.pack();
        frame.setLocationRelativeTo(null); 
        frame.setVisible(true);
    }

    private class LoginListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            String enteredUser = txtUsername.getText();
            String enteredPass = new String(txtPassword.getPassword()); 

            String msg;
            if (USERNAME.equals(enteredUser) && PASSWORD.equals(enteredPass)) {
                msg = "Login Granted!";
            } else {
                msg = "Login Denied";
            }
            JOptionPane.showMessageDialog(null, msg);
        }
    }

    private class CancelListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            txtUsername.setText("");
            txtPassword.setText("");
            txtUsername.requestFocusInWindow();
        }
    }
}

Cuplikan Kode ImageViewer.java


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.File;

public class ImageViewer
{
    private static final String VERSION = "Version 1.0";
    private static final JFileChooser fileChooser = new JFileChooser(System.getProperty("user.dir"));

    private JFrame frame;
    private ImagePanel imagePanel;
    private JLabel filenameLabel;
    private JLabel statusLabel;
    private OFImage currentImage;

    public ImageViewer() { }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            ImageViewer viewer = new ImageViewer();
            viewer.createAndShowGUI();
        });
    }

    private void createAndShowGUI() {
        frame = new JFrame("ImageViewer");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        makeMenuBar(frame);

        Container contentPane = frame.getContentPane();
        contentPane.setLayout(new BorderLayout(6, 6));

        filenameLabel = new JLabel();
        contentPane.add(filenameLabel, BorderLayout.NORTH);

        imagePanel = new ImagePanel();
        contentPane.add(imagePanel, BorderLayout.CENTER);

        statusLabel = new JLabel(VERSION);
        contentPane.add(statusLabel, BorderLayout.SOUTH);

        showFilename(null);
        frame.pack();

        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        frame.setLocation(d.width/2 - frame.getWidth()/2, d.height/2 - frame.getHeight()/2);
        frame.setVisible(true);
    }

    private void openFile() {
        int returnVal = fileChooser.showOpenDialog(frame);
        if (returnVal != JFileChooser.APPROVE_OPTION) {
            return; 
        }
        File selectedFile = fileChooser.getSelectedFile();
        OFImage loaded = ImageFileManager.loadImage(selectedFile);
        if (loaded == null) {
            JOptionPane.showMessageDialog(frame,
                    "The file was not in a recognized image file format.",
                    "Image Load Error",
                    JOptionPane.ERROR_MESSAGE);
            return;
        }
        currentImage = loaded;
        imagePanel.setImage(currentImage);
        imagePanel.revalidate();
        showFilename(selectedFile.getPath());
        showStatus("File loaded.");
        frame.pack();
    }

    private void close() {
        currentImage = null;
        imagePanel.clearImage();
        imagePanel.revalidate();
        showFilename(null);
    }

    private void quit() {
        System.exit(0);
    }

    private void makeDarker() {
        if (currentImage != null) {
            currentImage.darker();
            imagePanel.repaint();
            showStatus("Applied: darker");
        } else {
            showStatus("No image loaded.");
        }
    }

    private void makeLighter() {
        if (currentImage != null) {
            currentImage.lighter();
            imagePanel.repaint();
            showStatus("Applied: lighter");
        } else {
            showStatus("No image loaded.");
        }
    }

    private void threshold() {
        if (currentImage != null) {
            currentImage.threshold();
            imagePanel.repaint();
            showStatus("Applied: threshold");
        } else {
            showStatus("No image loaded.");
        }
    }

    private void showAbout() {
        JOptionPane.showMessageDialog(frame,
                "ImageViewer\n" + VERSION,
                "About ImageViewer",
                JOptionPane.INFORMATION_MESSAGE);
    }

    private void showFilename(String filename) {
        if (filenameLabel == null) return;
        if (filename == null) {
            filenameLabel.setText("No file displayed.");
        } else {
            filenameLabel.setText("File: " + filename);
        }
    }

    private void showStatus(String text) {
        if (statusLabel == null) return;
        statusLabel.setText(text);
    }

    private void makeMenuBar(JFrame frame) {
        final int SHORTCUT_MASK = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();

        JMenuBar menubar = new JMenuBar();
        frame.setJMenuBar(menubar);

        JMenu menu;
        JMenuItem item;

        menu = new JMenu("File");
        menubar.add(menu);

        item = new JMenuItem("Open");
        item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, SHORTCUT_MASK));
        item.addActionListener(e -> openFile());
        menu.add(item);

        item = new JMenuItem("Close");
        item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, SHORTCUT_MASK));
        item.addActionListener(e -> close());
        menu.add(item);
        menu.addSeparator();

        item = new JMenuItem("Quit");
        item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, SHORTCUT_MASK));
        item.addActionListener(e -> quit());
        menu.add(item);

        menu = new JMenu("Filter");
        menubar.add(menu);

        item = new JMenuItem("Darker");
        item.addActionListener(e -> makeDarker());
        menu.add(item);

        item = new JMenuItem("Lighter");
        item.addActionListener(e -> makeLighter());
        menu.add(item);

        item = new JMenuItem("Threshold");
        item.addActionListener(e -> threshold());
        menu.add(item);

        menu = new JMenu("Help");
        menubar.add(menu);

        item = new JMenuItem("About ImageViewer...");
        item.addActionListener(e -> showAbout());
        menu.add(item);
    }
}

Cuplikan Kode ImagePanel.java


import java.awt.*;
import javax.swing.*;

public class ImagePanel extends JComponent
{
    private int width, height;
    private OFImage panelImage;

    private static final int DEFAULT_WIDTH = 360;
    private static final int DEFAULT_HEIGHT = 240;

    public ImagePanel() {
        width = DEFAULT_WIDTH;
        height = DEFAULT_HEIGHT;
        panelImage = null;
        setPreferredSize(new Dimension(width, height));
    }

    public void setImage(OFImage image) {
        if (image != null) {
            width = image.getWidth();
            height = image.getHeight();
            panelImage = image;
            setPreferredSize(new Dimension(width, height));
            revalidate();
            repaint();
        }
    }

    public void clearImage() {
        panelImage = null;
        width = DEFAULT_WIDTH;
        height = DEFAULT_HEIGHT;
        setPreferredSize(new Dimension(width, height));
        revalidate();
        repaint();
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(width, height);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        if (panelImage != null) {
            g.drawImage(panelImage, 0, 0, this);
        } else {
            g.setColor(Color.LIGHT_GRAY);
            g.fillRect(0, 0, getWidth(), getHeight());
        }
    }
} 

Cuplikan Kode ImageFileManager.java


import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;

public class ImageFileManager
{
    private static final String IMAGE_FORMAT = "jpg"; 

    public static OFImage loadImage(File imageFile) {
        try {
            BufferedImage img = ImageIO.read(imageFile);
            if (img == null) {
                return null;
            }
            BufferedImage copy = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_RGB);
            copy.getGraphics().drawImage(img, 0, 0, null);
            return new OFImage(copy);
        } catch (IOException e) {
            return null;
        }
    }

    public static void saveImage(OFImage image, File file) {
        try {
            ImageIO.write(image, IMAGE_FORMAT, file);
        } catch (IOException e) {
            // silently return as original design
        }
    }
}

Cuplikan Kode OFImage.java


import java.awt.*;
import java.awt.image.*;

public class OFImage extends BufferedImage
{
    public OFImage(int width, int height) {
        super(width, height, BufferedImage.TYPE_INT_RGB);
    }

    public OFImage(BufferedImage image) {
        super(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);
        Graphics2D g = this.createGraphics();
        g.drawImage(image, 0, 0, null);
        g.dispose();
    }

    public void setPixel(int x, int y, Color col) {
        int pixel = col.getRGB();
        setRGB(x, y, pixel);
    }

    public Color getPixel(int x, int y) {
        int pixel = getRGB(x, y);
        return new Color(pixel, false);
    }

    public void darker() {
        int h = getHeight();
        int w = getWidth();
        for (int y = 0; y < h; y++) {
            for (int x = 0; x < w; x++) {
                setPixel(x, y, getPixel(x, y).darker());
            }
        }
    }

    public void lighter() {
        int h = getHeight();
        int w = getWidth();
        for (int y = 0; y < h; y++) {
            for (int x = 0; x < w; x++) {
                setPixel(x, y, getPixel(x, y).brighter());
            }
        }
    }

    public void threshold() {
        int h = getHeight();
        int w = getWidth();
        for (int y = 0; y < h; y++) {
            for (int x = 0; x < w; x++) {
                Color c = getPixel(x, y);
                int brightness = (c.getRed() + c.getGreen() + c.getBlue()) / 3;
                if (brightness <= 85) {
                    setPixel(x, y, Color.BLACK);
                } else if (brightness <= 170) {
                    setPixel(x, y, Color.GRAY);
                } else {
                    setPixel(x, y, Color.WHITE);
                }
            }
        }
    }
}

b. Penjelasan Alur Program

Program ini merupakan aplikasi Console sederhana yang mengimplementasikan operasi CRUD (Create, Read, Update, Delete) menggunakan Java JDBC.

Alur Utama (Main Logic)

  1. Load Driver: Program pertama kali memuat driver JDBC agar bisa mengenali MySQL.
  2. Connection: Membuat objek koneksi yang menghubungkan aplikasi Java dengan database perpustakaan di localhost.
  3. Statement: Membuat objek Statement yang berfungsi sebagai pengirim perintah SQL.
  4. Menu Loop: Program akan terus berjalan menampilkan menu interaktif:
    • 1 → Insert Data
    • 2 → Show Data
    • 3 → Update Data
    • 4 → Delete Data
    • 0 → Keluar
  5. Termination: Saat user memilih keluar, koneksi database dan statement ditutup untuk membersihkan resource.

Fungsi Operasi CRUD

  • insertBuku(): Meminta input judul dan pengarang dari user, lalu menyimpannya ke tabel menggunakan query INSERT.
  • showData(): Mengambil seluruh data buku menggunakan query SELECT * FROM buku dan menampilkannya dalam format daftar.
  • updateBuku(): Memperbarui informasi buku (Judul/Pengarang) berdasarkan id_buku yang dipilih user.
  • deleteBuku(): Menghapus baris data buku secara permanen berdasarkan id_buku.

c. Dokumentasi Output

1. Input Data (Insert)


2. Update Data


3. Delete Data


Kesimpulan

  • Aplikasi ini mendemonstrasikan penggunaan JDBC (Java Database Connectivity) sebagai jembatan antara bahasa pemrograman Java dan database relasional (MySQL).
  • Penggunaan library eksternal (mysql-connector.jar) sangat krusial karena berisi driver yang diperlukan untuk protokol komunikasi database.
  • Pemisahan logika program ke dalam fungsi-fungsi spesifik (insert, update, delete) membuat kode lebih rapi dan mudah untuk di-maintenance.

Pertemuan 15 : Aplikasi CRUD JAVA

Pertemuan 15 - Java CRUD Database Tanggal: 9 Desember 2025 Nama: Hosea Felix Sanjaya NRP: 5025241177 a. Setup & Persiapan Envi...