Jika anda ingin mengakses ke database, Anda bisa menggunakan JDBC (Java
Database Connectivity). JDBC merupakan salah satu API (Application Programming
Interface) Java yang secara khusus ditujukan untuk menangani koneksi ke database.
Keunggulan antarmuka ini adalah memungkinkan programmer menulis sebuah
program yang dapat digunakan untuk mengakses database yang berbeda-beda;
misalnya Oracle, Access, dan MySQL.
Kode JSP
JDBC
Membuat Database
Dalam proyek aplikasi web, biasanya dalam database terdapat beberapa tabel,
dimana menurut aturan relational database menyatakan bahwa satu tabel dengan
tabel lainnya dapat dihubungkan oleh sebuah kunci unik atau primer (primary key).
Dalam contoh ini kita membutuhkan 4 buah tabel yang relasinya seperti pada
gambar berikut:
Tabel album Tabel album_artis
* id_album * id_album
judul album * nomor
tahun_rilis id_artis
* id_album * id_artis
* nomor nama
judul_lagu tahun_lahir
biodata
Buat database musik dengan 4 buah tabel dimana struktur dari masing-masing tabel
tersebut adalah sebagai berikut:
Tabel Artis
Tabel Album
Field Type Length Extra Primary
id_album varchar 25
judul_album varchar 25
tahun int 4
Tabel album_artis
Field Type Length Extra Primary
id_album varchar 25
nomor int 2
id_artis varchar 25
isi_album
Field Type Length Extra Primary
id_album varchar 25
nomor int 2
judul_lagu varchar 25
Interface Keterangan
Connection Mendefinisikan koneksi ke database.
Driver Mendefinisikan driver yang digunakan untuk melakukan
koneksi ke suatu database. Kelas yang
mengimplementasikan interface ini juga terdapat pada paket
java.sql dengan nama DriverManager.
Statement Mendefinisikan sejumlah metode yang berhubungan dengan
SQL.
ResultSet Interface yang mendefinisikan pengaksesan hasil pernyataan
SQL.
Berikut ini adalah contoh cara membentuk koneksi ke database MySQL dengan
menggunakan database musik.
<HTML>
<HEAD>
<TITLE>Tes Koneksi Database</TITLE>
</HEAD>
<BODY>
<%@ page import="java.sql.Connection,
java.sql.DriverManager" %>
<%
boolean ada_kesalahan = false;
try {
Class.forName("com.mysql.jdbc.Driver");
}
if (!ada_kesalahan) {
//Bentuk koneksi
Connection koneksi = null;
try {
koneksi = DriverManager.getConnection(
"jdbc:mysql://localhost/dbAlumni", "root", "telogodhog");
out.println("Koneksi berhasil");
}
catch (Exception ex) {
out.println("Kesalahan: " + ex);
}
}
%>
</BODY>
</HTML>
Keterangan:
Dokumen teskoneksi.jsp menggunakan interface Connection dan kelas
DriverManager. Oleh karena itu terdapat instruksi:
Pernyataan:
try {
Class.forName("com.mysql.jdbc.Driver");
}
catch (Exception ex) {
out.println("Kesalahan: " + ex);
ada_kesalahan = true;
}
digunakan untuk memuat driver MySQL (yaitu MySQL Connector/J). Jika terjadi
suatu eksepsi maka bagian berikut akan dijalankan
Pada pernyataan di atas, baris pertama akan menampilkan pesan kesalahan dan
baris berikutnya mengisi variabel ada_kesalahan yang bertipe boolean dengan nilai
true, yang menyatakan terjadi kesalahan.
Pernyataan:
Pernyataan:
try {
koneksi = DriverManager.getConnection(
"jdbc:mysql://localhost/dbAlumni", "root", "telogodhog");
out.println("Koneksi berhasil");
}
catch (Exception ex) {
out.println("Kesalahan: " + ex);
}
“jdbc:mysql://localhost/musik”
disebut dengan URL (Universal Resource Locator). Secara umum, penulisan sebuah
URL untuk JDBC adalah sebagai berikut:
jdbc:subprotokol:subnama
Pada contoh di atas, karena database server yang diakses adalah MySQL maka
subprotokol diisi dengan MySQL. Misalnya:
//localhost/musik
out.println(“Kesalahan: ” + ex);
<HTML>
<HEAD>
<TITLE>Tes Database</TITLE>
</HEAD>
<BODY>
<%@ page import="java.sql.Connection,
java.sql.DriverManager,
java.sql.Statement,
java.sql.ResultSet" %>
<%
boolean ada_kesalahan = false;
try {
Class.forName("com.mysql.jdbc.Driver");
}
catch (Exception ex) {
out.println("Kesalahan: " + ex);
ada_kesalahan = true;
}
if (!ada_kesalahan) {
//Bentuk koneksi
Connection koneksi = null;
try {
koneksi = DriverManager.getConnection(
"jdbc:mysql://localhost/musik",
"root", "telogodhog");
}
catch (Exception ex) {
out.println("Kesalahan: " + ex);
ada_kesalahan = true;
}
if (!ada_kesalahan) {
ResultSet hasilQuery = null;
try {
Statement stm = koneksi.createStatement();
hasilQuery = stm.executeQuery("SELECT id_artis, nama, tahun_lahir " +
"FROM artis " + "ORDER BY nama");
}
catch (Exception ex) {
out.println("Kesalahan: " + ex);
ada_kesalahan = true;
}
if (!ada_kesalahan) {
out.println("<TABLE BORDER=\"1\">");
out.println(
"<TR><TH>ID</TH><TH>NAMA</TH>" +
"<TH>TAHUN LAHIR</TH></TR>");
try {
while (hasilQuery.next()) {
String id =
hasilQuery.getString("id_artis");
String nama =
hasilQuery.getString("nama");
String tahun =
hasilQuery.getString("tahun_lahir");
out.println("<TR><TD>" + id +
"</TD><TD>" + nama +
"</TD><TD>" + tahun +
"</TD></TR>");
}
}
catch (Exception ex) {
out.println("Kesalahan: " + ex);
}
out.println("</TABLE>");
}
}
}
%>
</BODY>
</HTML>
Penjelasan:
Pada dokumen tesdb.jsp, pernyataan:
digunakan untuk membuat variabel stm yang merujuk ke objek Statement dan
variabel ini merujuk ke hasil dari createStatement() (objek yang digunakan untuk
melakukan query). Kemudian:
Pernyataan SQL tersebut digunakan untuk memperoleh data id_artis, nama, dan
tahun_lahir yang terdapat pada tabel artis dan hasilnya diurutkan berdasarkan
nama. Hasilnya akan dirujuk oleh variabel hasilQuery.
Jika salah satu dari kedua pernyataan di atas menimbulkan eksepsi, maka bagian
berikut akan dijalankan:
catch (Exception ex) {
out.println("Kesalahan: " + ex);
ada_kesalahan = true;
}
while (hasilQuery.next()) {
digunakan untuk melakukan pengulangan selama data yang belum dibaca pada hasil
query masih ada. Jika masih ada maka akan dilakukan langkah seperti berikut:
<HTML>
<HEAD>
<TITLE>Info Album</TITLE>
</HEAD>
<BODY>
<%
boolean ada_kesalahan = false;
String arg_id_album = request.getParameter("id");
if (arg_id_album == null) {
out.println("Tidak ada kode album yang diberikan");
ada_kesalahan = true;
}
if (!ada_kesalahan) {
try {
Class.forName("com.mysql.jdbc.Driver");
}
catch (Exception ex) {
out.println("Kesalahan: " + ex);
ada_kesalahan = true;
}
}
if (!ada_kesalahan) {
//bentuk koneksi
Connection koneksi = null;
try {
koneksi = DriverManager.getConnection(
"jdbc:mysql://localhost/musik",
"root", "telogodhog");
}
if (!ada_kesalahan) {
ResultSet hasilQuery = null;
try {
Statement stm = koneksi.createStatement();
String strQuery = "SELECT * FROM album " +
"WHERE id_album = \'" +
arg_id_album + "\'";
hasilQuery = stm.executeQuery(strQuery);
}
catch (Exception ex) {
out.println("Kesalahan: " + ex);
ada_kesalahan = true;
}
try {
if (!hasilQuery.next()) {
out.println("Tak ada yang memenuhi");
ada_kesalahan = true;
}
}
catch (Exception ex) {
out.println("Kesalahan: " + ex);
ada_kesalahan = true;
}
if (!ada_kesalahan) {
//tampilkan gambar
//String berkasFoto =
// getServletContext().getRealPath("/")+
// "/image/" +
// arg_id_album.toLowerCase() + ".jpg";
//tampilkan info
String judul =
hasilQuery.getString("judul_album");
String tahun =
hasilQuery.getString("tahun_rilis");
hasilQuery = stm.executeQuery(strQuery);
int nomor =
hasilQuery.getInt("nomor");
out.println("<TR><TD>" + nomor +
"</TD><TD>" + judul_lagu +
"</TD></TR>");
}
}
catch (Exception ex) {
out.println("Kesalahan: " + ex);
ada_kesalahan = true;
}
out.println("</TABLE>");
}
}
}
%>
</BODY>
</HTML>
Penjelasan:
digunakan untuk memperoleh isi parameter dengan nama id. Isi parameter ini
digunakan untuk melakukan query terhadap database.
Pernyataan:
String strQuery = "SELECT * FROM album " +
"WHERE id_album = \'" +
arg_id_album + "\'";
Pernyataan:
digunakan untuk menampilkan foto melalui tag HTTP bernama IMG lengkap dengan
dengan nama direktori tempat foto berada. Metode toLowerCase() digunakan untuk
mengkonversi ke huruf kecil.
Pernyataan:
http://localhost:8080/latihan/infoalbum.jsp?id=melayang
<HTML>
<HEAD>
<TITLE>Info Artis</TITLE>
</HEAD>
<BODY>
if (!ada_kesalahan) {
try {
Class.forName("com.mysql.jdbc.Driver");
}
catch (Exception ex) {
out.println("Kesalahan: " + ex);
ada_kesalahan = true;
}
}
if (!ada_kesalahan) {
//bentuk koneksi
Connection koneksi = null;
try {
koneksi = DriverManager.getConnection(
"jdbc:mysql://localhost/musik",
"root", "telogodhog");
}
if (!ada_kesalahan) {
ResultSet hasilQuery = null;
try {
Statement stm = koneksi.createStatement();
String strQuery = "SELECT * FROM artis " +
"WHERE id_artis = \'" +
arg_id_artis + "\'";
hasilQuery = stm.executeQuery(strQuery);
}
catch (Exception ex) {
out.println("Kesalahan: " + ex);
ada_kesalahan = true;
}
try {
if (!hasilQuery.next()) {
out.println("Tak ada yang memenuhi");
ada_kesalahan = true;
}
}
if (!ada_kesalahan) {
//tampilkan gambar
//String berkasFoto =
// getServletContext().getRealPath("/")+
// "/image/" +
// arg_id_album.toLowerCase() + ".jpg";
//tampilkan info
String id_artis =
hasilQuery.getString("id_artis");
String nama =
hasilQuery.getString("nama");
String tahun =
hasilQuery.getString("tahun_lahir");
Clob keterangan =
hasilQuery.getClob("biodata");
if (keterangan != null)
out.println("<B>Riwayat Singkat:</B><BR>" +
keterangan.getSubString(1,
(int)keterangan.length()) +
"<BR><BR>");
else
out.println("<B>Riwayat Singkat:</B><BR>" +
"Tidak tercatat<BR><BR>");
out.println("<B>Album:</B><BR>");
hasilQuery = stm.executeQuery(strQuery);
while (hasilQuery.next()) {
String id_album =
hasilQuery.getString("a.id_album");
String judul_album =
hasilQuery.getString("a.judul_album");
String tahun_rilis =
hasilQuery.getString("a.tahun_rilis");
out.println(
"<A HREF = \"infoalbum.jsp?id=" +
id_album + "\" TARGET = \"dinamis\">" +
judul_album +
"</A> (" + tahun_rilis + ")<BR>");
}
}
catch (Exception ex) {
out.println("Kesalahan: " + ex);
ada_kesalahan = true;
}
}
}
}
%>
</BODY>
</HTML>
Penjelasan:
digunakan untuk memperoleh isi parameter dengan nama id. Isi parameter ini
digunakan untuk melakukan query terhadap database.
Pernyataan:
Pernyataan:
Clob keterangan =
hasilQuery.getClob("biodata");
digunakan untuk memperoleh field biodata yang bertipe text (teks yang sangat
panjang). Hasilnya diletakkan pada variabel bernama keterangan yang bertipe Clob
(tipe untuk mengakses data bertipe text).
Selanjutnya, data pada variabel keterangan ditampilkan melalui:
keterangan.getSubString(1,
(int)keterangan.length())
Pernyataan:
String strQuery =
"SELECT a.* " +
"FROM album a, album_artis b " +
"WHERE a.id_album = b.id_album AND " +
"b.id_artis = \'" +
arg_id_artis + "\'" +
" ORDER BY a.tahun_rilis";
digunakan untuk membentuk string query yang digunakan untuk mengakses data
pada data album yang merupakan data dari artis yang sesuai dengan parameter id.
Pernyataan:
out.println(
"<A HREF = \"infoalbum.jsp?id=" +
id_album + "\" TARGET = \"dinamis\">" +
judul_album +
"</A> (" + tahun_rilis + ")<BR>");
Dokumen berikut digunakan untuk menampilkan semua nama artis dan menyertakan
link ke dokumen infoartis.jsp.
<HTML>
<HEAD>
<TITLE>Daftar Artis</TITLE>
</HEAD>
<BODY>
<%
boolean ada_kesalahan = false;
if (!ada_kesalahan) {
try {
Class.forName("com.mysql.jdbc.Driver");
}
catch (Exception ex) {
out.println("Kesalahan: " + ex);
ada_kesalahan = true;
}
}
if (!ada_kesalahan) {
//bentuk koneksi
Connection koneksi = null;
try {
koneksi = DriverManager.getConnection(
"jdbc:mysql://localhost/musik",
"root", "telogodhog");
}
if (!ada_kesalahan) {
ResultSet hasilQuery = null;
try {
Statement stm = koneksi.createStatement();
hasilQuery = stm.executeQuery("SELECT id_artis, nama FROM artis "
+
"ORDER BY nama");
}
String nama =
hasilQuery.getString("nama");
out.println(
"<A HREF = \"infoartis.jsp?id=" +
id_artis +
"\" TARGET = \"dinamis\">" +
nama + "</A><BR>");
}
}
catch (Exception ex) {
out.println("Kesalahan: " + ex);
}
}
}
}
%>
</BODY>
</HTML>
Pembuatan Frame
<HTML>
<HEAD>
<TITLE>Informasi Group Band Indonesia</TITLE>
</HEAD>
<FRAMESET ROWS = "30%, *">
<FRAME SRC = "judul.htm" SCROLLING = "NO">
<FRAMESET BORDER = "0" COLS = "30%, *">
<FRAME SRC = "daftarartis.jsp">
<FRAME SRC = "petunjuk.htm" NAME = "dinamis">
</FRAMESET>
</FRAMESET>
</HTML>
Penjelasan:
Dokumen di atas membentuk tiga buah area (frame). Bagian atas, menyita ruang
sebesar 30%, akan ditempati oleh dokumen judul.htm. Bagian bawahnya dibagi dua
secara vertikal. Bagian kiri akan ditempati oleh daftarartis.jsp dan bagian kanan
ditempati oleh petunjuk.htm. Bagian kiri menempati ruang sebesar 30% dan
sisanya untuk frame bagian kanan. Atribut SCROLLING = “NO” digunakan untuk
membuat frame bagian atas tidak dilengkapi dengan batang penggeser. Atribut
NAME = “dinamis” dipakai untuk menyatakan bahwa frame yang ditempati
petunjuk.htm diberi nama “dinamis”. Nama inilah yang dirujuk oleh TARGET =
“dinamis” pada dokumen daftarartis.jsp dan infoartis.jsp. Artinya frame tersebut
akan dijadikan lokasi untuk menampilkan dokumen yang disebut pada tag <A>.
Sebelum mencoba file info.htm, lengkapi dulu dengan dua dokumen berikut.
<HTML>
<HEAD><TITLE></TITLE></HEAD>
<BODY>
<CENTER><H3>Group Band Indonesia</H3></CENTER>
<CENTER>
<IMG SRC = "band.jpg">
</CENTER>
</BODY>
</HTML>
Penjelasan:
<CENTER>
Silakan klik pada nama-nama
yang tertera di samping untuk
memperoleh info masing-masing artis
</CENTER>
</BODY>
</HTML>