03 November 2017
Java & MySQL (2) - Menggunakan PreparedStatement

Melanjutkan tulisan sebelumnya tentang dasar koneksi java dan mysql, pada tulisan kali ini saya akan membahas tentang penggunaan objek PreparedStatement untuk eksekusi query SQL. Untuk lebih memahamkan pembaca, saya akan mencoba menggunakan satu studi kasus sederhana.

Membuat Database

Ketikkan kode SQL berikut, simpan dengan nama dbinventory.sql dan eksekusi menggunakan client MySQL melalui Command Prompt.

DROP DATABASE IF EXISTS dbinventory;
CREATE DATABASE dbinventory;
USE dbinventory;

CREATE TABLE parts (
  kode VARCHAR(12) NOT NULL,
  nama TEXT NOT NULL,
  jumlah INT NOT NULL DEFAULT 1,
  tgl_masuk TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  kondisi ENUM('baik','rusak') NOT NULL DEFAULT 'baik',
  PRIMARY KEY (kode)
);

Import Class

Class java yang perlu kita import adalah sebagai berikut :

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

Registrasi Driver & Koneksi Database

Seperti sebelumnya kita perlu meregistrasi driver dan mengkoneksikan aplikasi ke database

try {
  DriverManager.registerDriver(new com.mysql.jdbc.Driver());
  Connection koneksi = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/namadb", "root", "p455w0rd");
}
catch(SQLException exc) {
  System.err.println(exc.toString());
}

Membuat Objek PreparedStatement

Objek PreparedStatement dibentuk menggunakan metode prepareStatement() dari objek koneksi yang sudah dibentuk sebelumnya.

Metode prepareStatement() menggunakan satu parameter String yaitu query SQL yang akan dieksekusi.

Disini kita coba menambah data baru kedalam tabel parts.

try {
  DriverManager.registerDriver(new com.mysql.jdbc.Driver());
  Connection koneksi = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/namadb", "root", "p455w0rd");
  String sql = "INSERT INTO parts(kode, nama) VALUES (?, ?) ";
  PreparedStatement ps = koneksi.prepareStatement(sql);
}
catch(SQLException exc) {
  System.err.println(exc.toString());
}

Perhatikan penggunaan simbol tanda tanya (?) pada pernyataan SQL diatas. Simbol tersebut akan mewakili nilai kolom dari data baru yang akan kita masukkan ke dalam tabel parts. Simbol tanda tanya pertama akan mewakili nilai untuk kolom kode dan simbol tanda tanya kedua akan mewakili nilai untuk kolom nama. Untuk kolom lain akan menggunakan nilai default sebagaimana disebutkan dalam pembuatan tabel sebelumnya.

Pemberian Nilai dan Eksekusi Pernyataan SQL

Pemberian nilai kolom dilakukan dengan menggunakan metode setXxx(id, value) dari objek PreparedStatement :

  1. xxx digantikan oleh tipe data dari nilai yang akan dimasukkan. Jika semisal tipe data kolom tabel adalah CHAR, VARCHAR, atau TEXT, maka metode yang digunakan adalah setString(). Metode lain yang dapat digunakan adalah setInt(), setFloat(), setDouble(), setBlob(), dan seterusnya

  2. id adalah index parameter dengan tipe integer. Untuk tanda tanya pertama kita gunakan nilai 1, untuk tanda tanya kedua digunakan nilai 2, dst

  3. value adalah nilai dari kolom.

Eksekusi pernyataan SQL dilakukan dengan menggunakan metode executeUpdate().

Perhatikan potongan kode berikut :

String sql = "INSERT INTO parts(kode, nama) VALUES (?, ?) ";
PreparedStatement ps = koneksi.prepareStatement(sql);
ps.setString(1, "MBAS01AM4");                     // kolom kode
ps.setString(2, "ASUS ROG Strix X370-F Gaming");  // kolom nama
ps.executeUpdate();                               // eksekusi pernyataan sql
ps.close();

Untuk mengambil data dari tabel kita gunakan metode executeQuery(), sebagai contoh :

String sql = "SELECT * FROM parts WHERE jumlah < ?";
PreparedStatement ps = koneksi.prepareStatement(sql);
int jumlah = 5;
ps.setInt(1, jumlah);
ResultSet rs = ps.executeQuery();

Contoh Program

Sebagai contoh latihan perhatikan kode program berikut ini :

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.SQLException;
import java.util.Scanner;

public class PreparedStatementSample {

  private static final String url = "jdbc:mysql://127.0.0.1:3306/dbinventory";
  private static final String user = "root";
  private static final String password = "";

  public static void main(String[] args) {
    try {
      DriverManager.registerDriver(new com.mysql.jdbc.Driver());
      Connection c = DriverManager.getConnection(url, user, password);
      String sql = "INSERT INTO parts (kode, nama, jumlah) VALUES (?, ?, ?)";
      PreparedStatement pstmt = c.prepareStatement(sql);
      Statement stmt = c.createStatement();
      Scanner sc = new Scanner(System.in);
      while(true) {
        System.out.println("\nAplikasi Inventarisasi");
        System.out.println("[1] Tambah data");
        System.out.println("[2] Tampilkan data");
        System.out.println("[3] Keluar");
        System.out.print("Pilihan [1/2/3] : ");
        int pil = sc.nextInt();
        switch(pil) {
          case 1:
            tambahData(sc, pstmt);
            break;
          case 2:
            tampilkanData(stmt);
            break;
          case 3:
            System.out.println("\nTerima Kasih");
            System.exit(0);
            break;
        }
      }
    }
    catch(SQLException exc) {
      System.err.println(exc.toString());
    }
  }

  public static void tambahData(Scanner sc, PreparedStatement pstmt) throws SQLException {
    System.out.println("\nTambah data");
    System.out.print("Kode : ");
    String kode = sc.next();
    System.out.print("Nama : ");
    String nama = sc.next();
    System.out.print("Jumlah : ");
    int jumlah = sc.nextInt();
    pstmt.setString(1, kode);
    pstmt.setString(2, nama);
    pstmt.setInt(3, jumlah);
    pstmt.executeUpdate();
  }

  public static void tampilkanData(Statement stmt) throws SQLException {
    System.out.println("\nInventarisasi Saat Ini");
    ResultSet rs = stmt.executeQuery("select * from parts");
    int i = 1;
    while(rs.next()) {
      String kode = rs.getString("kode");
      String nama = rs.getString("nama");
      int jumlah = rs.getInt("jumlah");
      String fmt = "[%s] Kode: %-10s Nama: %-20s Jumlah: %-10s\n";
      System.out.printf(fmt, i, kode, nama, jumlah);
      i++;
    }
  }

}