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
:
xxx
digantikan oleh tipe data dari nilai yang akan dimasukkan. Jika semisal tipe data kolom tabel adalahCHAR
,VARCHAR
, atauTEXT
, maka metode yang digunakan adalahsetString()
. Metode lain yang dapat digunakan adalahsetInt()
,setFloat()
,setDouble()
,setBlob()
, dan seterusnyaid
adalah index parameter dengan tipe integer. Untuk tanda tanya pertama kita gunakan nilai 1, untuk tanda tanya kedua digunakan nilai 2, dstvalue
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++;
}
}
}