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:
Tools→Preferences→Libraries. - Klik tombol Add dan pilih file
.jaryang 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 bernamaperpustakaandan tabelbuku.
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)
- Load Driver: Program pertama kali memuat driver JDBC agar bisa mengenali MySQL.
- Connection: Membuat objek koneksi yang menghubungkan aplikasi Java dengan database
perpustakaandi localhost. - Statement: Membuat objek Statement yang berfungsi sebagai pengirim perintah SQL.
- Menu Loop: Program akan terus berjalan menampilkan menu interaktif:
1→ Insert Data2→ Show Data3→ Update Data4→ Delete Data0→ Keluar
- 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 bukudan menampilkannya dalam format daftar. - updateBuku(): Memperbarui informasi buku (Judul/Pengarang) berdasarkan
id_bukuyang 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.



Tidak ada komentar:
Posting Komentar