Days
Hours
Minutes
Seconds

Promo Grand Opening

15% OFF

Khusus Pelanggan Baru

  • Home /
  • Blog /
  • Java /
  • Tutorial Java #14: CRUD Java Lanjutan (PreparedStatement dan Transaksi)

Tutorial Java #14: CRUD Java Lanjutan (PreparedStatement dan Transaksi)

Tentu, ini artikel tentang Tutorial Java #14: CRUD Java Lanjutan.


 

 

Dalam tutorial sebelumnya, kita telah mempelajari dasar-dasar operasi CRUD (Create, Read, Update, Delete) menggunakan JDBC di Java. Namun, untuk aplikasi yang lebih kuat dan aman, ada beberapa praktik terbaik yang harus kita terapkan. Dua konsep krusial yang akan kita bahas di sini adalah:

  1. PreparedStatement untuk mencegah SQL Injection.
  2. Transaksi untuk memastikan integritas data.

 

1. Mengapa Menggunakan PreparedStatement?

 

Statement yang kita gunakan sebelumnya mengirimkan perintah SQL langsung ke database dalam bentuk string. Ini rentan terhadap serangan SQL Injection, di mana pengguna jahat memasukkan kode SQL berbahaya melalui input form.

PreparedStatement mengatasi masalah ini dengan mengirimkan query yang telah dipra-kompilasi ke database terlebih dahulu. Nilai input kemudian dikirimkan secara terpisah, sehingga database tidak pernah menginterpretasikannya sebagai bagian dari perintah SQL.

Contoh Perbandingan:

Rentan (Menggunakan Statement):

Java

String userInput = "admin' OR '1'='1"; // Contoh input berbahaya
String sql = "SELECT * FROM users WHERE username = '" + userInput + "'";
// Query yang dieksekusi: SELECT * FROM users WHERE username = 'admin' OR '1'='1'
// Ini akan selalu true dan melewati autentikasi

Aman (Menggunakan PreparedStatement):

Java

String userInput = "admin' OR '1'='1";
String sql = "SELECT * FROM users WHERE username = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, userInput);
// Database hanya melihat: SELECT * FROM users WHERE username = 'admin'' OR ''1''=''1'
// Ini dianggap sebagai satu string, bukan kode, sehingga aman

 

Langkah-langkah Menggunakan PreparedStatement

 

  1. Buat objek PreparedStatement dengan query yang berisi ? sebagai placeholder untuk nilai.
  2. Gunakan metode setXXX() (seperti setString(), setInt()) untuk mengisi placeholder dengan nilai yang aman.
  3. Jalankan query dengan executeUpdate() atau executeQuery().

Berikut adalah versi perbaikan dari fungsi CRUD kita dari tutorial sebelumnya, kini menggunakan PreparedStatement secara penuh:

CREATE (INSERT):

Java

public void tambahMahasiswa(Connection conn, String nama, String nim, String jurusan) throws SQLException {
    String sql = "INSERT INTO mahasiswa (nama, nim, jurusan) VALUES (?, ?, ?)";
    try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
        pstmt.setString(1, nama);
        pstmt.setString(2, nim);
        pstmt.setString(3, jurusan);
        pstmt.executeUpdate();
    }
}

READ (SELECT dengan Kondisi):

Java

public void cariMahasiswaByNim(Connection conn, String nim) throws SQLException {
    String sql = "SELECT id, nama, nim, jurusan FROM mahasiswa WHERE nim = ?";
    try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
        pstmt.setString(1, nim);
        try (ResultSet rs = pstmt.executeQuery()) {
            if (rs.next()) {
                // Proses hasil
            }
        }
    }
}

UPDATE:

Java

public void perbaruiMahasiswa(Connection conn, String nim, String namaBaru, String jurusanBaru) throws SQLException {
    String sql = "UPDATE mahasiswa SET nama = ?, jurusan = ? WHERE nim = ?";
    try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
        pstmt.setString(1, namaBaru);
        pstmt.setString(2, jurusanBaru);
        pstmt.setString(3, nim);
        pstmt.executeUpdate();
    }
}

 

2. Mengelola Transaksi (Transaksi JDBC)

 

Transaksi adalah serangkaian satu atau lebih operasi database yang diperlakukan sebagai satu unit tunggal. Ini berarti semua operasi dalam transaksi harus berhasil (disebut commit) atau jika salah satu gagal, semuanya harus dibatalkan (disebut rollback). Konsep ini memastikan integritas data.

Bayangkan Anda memindahkan uang dari satu rekening ke rekening lain. Ini terdiri dari dua operasi: pengurangan dari rekening A dan penambahan ke rekening B. Jika salah satu operasi gagal, Anda tidak ingin yang lain berhasil. Transaksi memastikan bahwa kedua operasi ini terjadi secara bersamaan atau tidak sama sekali.

Langkah-langkah Menggunakan Transaksi:

  1. Matikan auto-commit dengan conn.setAutoCommit(false);.
  2. Jalankan serangkaian perintah SQL.
  3. Jika semua berhasil, panggil conn.commit();.
  4. Jika terjadi kesalahan, tangkap pengecualian (SQLException) dan panggil conn.rollback(); untuk mengembalikan semua perubahan.
  5. Pastikan untuk selalu mengaktifkan kembali auto-commit di blok finally.

Contoh Program Transaksi Sederhana:

Java

public void transferSaldo(Connection conn, int idPengirim, int idPenerima, double jumlah) throws SQLException {
    String sqlKurangi = "UPDATE rekening SET saldo = saldo - ? WHERE id = ?";
    String sqlTambah = "UPDATE rekening SET saldo = saldo + ? WHERE id = ?";

    try {
        conn.setAutoCommit(false); // Matikan auto-commit

        // Operasi 1: Mengurangi saldo pengirim
        try (PreparedStatement pstmtKurangi = conn.prepareStatement(sqlKurangi)) {
            pstmtKurangi.setDouble(1, jumlah);
            pstmtKurangi.setInt(2, idPengirim);
            pstmtKuragi.executeUpdate();
        }

        // Operasi 2: Menambah saldo penerima
        try (PreparedStatement pstmtTambah = conn.prepareStatement(sqlTambah)) {
            pstmtTambah.setDouble(1, jumlah);
            pstmtTambah.setInt(2, idenPenerima);
            pstmtTambah.executeUpdate();
        }

        conn.commit(); // Semua operasi berhasil, simpan perubahan
        System.out.println("Transaksi berhasil!");

    } catch (SQLException e) {
        conn.rollback(); // Jika ada yang gagal, batalkan semua perubahan
        System.out.println("Transaksi gagal! Perubahan dibatalkan.");
        throw e; // Lemparkan pengecualian agar ditangani di tempat lain
    } finally {
        conn.setAutoCommit(true); // Selalu aktifkan kembali
    }
}

 

Kesimpulan

 

Dengan mengadopsi PreparedStatement dan transaksi, kode JDBC Anda akan menjadi jauh lebih aman dan dapat diandalkan. PreparedStatement adalah benteng pertahanan terhadap SQL Injection, sementara transaksi menjamin integritas data dengan memastikan bahwa serangkaian operasi diperlakukan sebagai satu unit atomik. Menguasai konsep-konsep ini adalah langkah penting untuk membangun aplikasi Java yang siap untuk lingkungan produksi.

Wawasan Terbaru

Gemini_Generated_Image_wfw5uwwfw5uwwfw5
Mengenal Dunia Grafis: Dari Piksel Hingga Vektor, Kekuatan Visual di Era Digital
Gemini_Generated_Image_b6dimfb6dimfb6di
Mengenal Foundation: Kerangka Kerja Front-End Profesional untuk Web Responsif
Gemini_Generated_Image_sx3ztpsx3ztpsx3z
CSS
Mempercantik Website dengan CSS: Seniman di Balik Tampilan Web 🎨
Gemini_Generated_Image_e013qke013qke013
Mengenal HTML: Fondasi dari Setiap Halaman Website 🌐
Gemini_Generated_Image_ldki4nldki4nldki
Menyelami Dunia Coding: Seni Berbicara dengan Komputer
Gemini_Generated_Image_dpvliydpvliydpvl
Menguasai GIT: Fondasi Penting dalam Dunia Pengembangan Perangkat Lunak
Gemini_Generated_Image_sqcib9sqcib9sqci
Tutorial Python #12: Mengenal Jenis-jenis Operator dalam Python
Gemini_Generated_Image_o1bw3do1bw3do1bw
Memahami Tipe Data Dictionary dalam Python
Gemini_Generated_Image_ko4ixfko4ixfko4i
Mengenal Tipe Data Set dalam Python
Gemini_Generated_Image_1xop7m1xop7m1xop
Tuple dalam Python: Pengenalan dan Tutorial

Wawasan Serupa

Gemini_Generated_Image_u9yhx3u9yhx3u9yh
Gemini_Generated_Image_3ubmyt3ubmyt3ubm
Gemini_Generated_Image_ygm1bmygm1bmygm1
Gemini_Generated_Image_llan5yllan5yllan

Ceritakan Detail Proyekmu

Mulai dari 30K aja, solusi IT kamu langsung jalan tanpa drama.

Kata Mereka Tentang Solusi Coding

Dipercaya oleh lebih dari 200++ client untuk menyelesaikan proyeknya dengan total 250++ proyek dari berbagai jenis proyek