Java Database Connectivity (JDBC-1) Sumber : Core WebProgramming Pengarang : Marty Hall – Larry Brown Slide : Riyanto Sigit JDBC • JDBC adalah Application Programming Interface (API) yang dirancang untuk mengakses database universal berdasarkan SQL. • JDBC terdiri atas JDBC 1.0 API yang memberika fungsi-fungsi dasar untuk akses data. JDBC 2.0 API memberikan tambahan ke fungsi-fungsi dasar dengan kelebihankelebihan lain yang lebih mutakhir. JDBC API • • • JDBC adalah suatu nama trade mark, bukan sebuah singkatan. Tapi JDBC sering dikira singkatan dari Java Database Connectivity. JDBC API terdiri dari sejumlah class dan interface yang ditulis dalam bahasa Java yang menyediakan API standar sebagai alat bantu bagi pembuat program dan memberikan kemungkinan untuk menulis aplikasi database dengan menggunakan semua Java API. JDBC API memudahkan untuk mengirim statement SQL ke sistem database relasional dan mendukung bermacam-macam bahasa SQL. Keunggulan JDBC API adalah sebuah aplikasi dapat mengakses sembarang sumber data dan dapat berjalan pada sembarang platform yang mempunyai Java Virtual Machine(JVM) Sehingga kita tidak perlu menulis satu program untuk mengakses database Sybase, Oracle atau Access dan lain-lain. Kita cukup menulis satu program yang menggunakan JDBC API, dan program dapat mengirimkan statement SQL atau statement lain ke sumber data tertentu. Dengan aplikasi yang ditulis dalam bahasa Java seseorang tidak perlu khawatir untuk menulis aplikasi yang berbeda-beda agar dapat berjalan pada platform yang berbeda-beda. Apa yang dilakukan JDBC? • Membangun sebuah koneksi ke sumber data (data source). • Mengirim statement ke sumber data. • Memproses hasil dari statement tersebut Model 2-tier dan 3-tier • • • Untuk akses database, JDBC API mendukung baik model 2-tier maupun 3tier. Untuk model 2-tier, sebuah applet atau aplikasi java berbicara langsung ke database. Dalam hal ini diperlukan JDBC driver yang dapat berkomunikasi ke sumber data tersebut. Sebuah perintah atau statement dari user dikirim ke database dan hasil dari statement dikirim balik ke user. Database dapat terletak pada mesin yang sama atau berbeda dengan klien, yang disambungkan dengan jaringan. Jika letak database berbeda dengan mesin klien maka disebut dengan client/server. Mesin user disebut dengan client dan mesin dimana database berada disebut dengan server. Jaringan ini bisa berupa LAN atau internet. Dalam model 3-tier, user mengirimkan perintah ke sebuah middle tier. Selanjutnya middle tier mengirimkan perintah tersebut ke database. Database memproses perintah tersebut dan mengirim balik hasilnya ke middle tier. Kemudian middle tier mengirimkannya ke user. Keuntungan model 3-tier ini adalah mempermudah aplikasi untuk dideploy dan meningkatkan performansi. Tipe-tipe Driver JDBC • • • • JDBC-ODBC Bridge plus ODBC Driver Kombinasi ini menghasilkan akses JDBC melalui driver ODBC. Menjembatani antara aplikasi Java dengan Microsoft ODBC. Tipe driver ini paling cocok untuk jaringan korporat dimana instalasi klien bukan masalah besar, atau untuk aplikasi server yang ditulis dalam bahasa Java dalam arsitertur 3-tier. Native API party Java technology-enabled driver Tipe driver ini mengkonversi JDBC call ke dalam client API untyk Oracle, Sybase, Informix, DB2, dan DBMS yang lain. Tipe ini memerlukan kode binary yang spesifik terhadap sistem operasi yang di-load kedalam masingmasing klien. Pure Java Driver for Database Middleware (JDBC-Net). Model driver ini menerjemahkan JDBC call kedalam protokol middleware vendor, yang kemudian diterjemahkan ke protokol DBMS oleh server middleware. Middleware menyediakan konektifitas ke berbagai jenis database yang berbeda. Native-protocol Pure Java Driver Model driver ini mengkonversi JDBC call langsung kedalam protokol network yang digunakan oleh DBMS, mengijinkan direct call dari mesin klien ke server DBMS dan memberikan solusi praktis untuk akses internet. Tipe data JDBC Langkah-langkah menggunakan JDBC • • • • • • • Load driver Mendefinisikan koneksi URL Membuat koneksi Membuat obyek statement Mengeksekusi query Memproses result Menutup koneksi Load driver • Untuk mengaktifkan hubungan antar aplikasi dan database, maka sebuah Connection harus debentuk dengan menggunakan JDBC Driver. Connection dibentuk melalui satu class java.sql.DriverManager dan dua interface, yaitu java.sql.Driver dan java.sql.Connection. Class untuk JDBC diakses melalui java.sql.*. Driver adalah software yang menangani komunikasi ke database server. Berikut ini adalah contoh program jika yang kita gunakan adalah JDBC-ODBC driver. try { Class.forName(“sun.jdbc.odbc.JdbcDriver”); } catch (ClassNotFoundException ex) { System.err.println(“Driver Error”); ex.printStackTrace(); System.exit(1); } Load driver • Penggunaan Class akan throw ClassNotFoundException. Dokumentasi driver anda akan memberikan nama class yang digunakan. Contoh : • Oracle : Class.forName(“oracle.jdbc.OracleDriver”); • Sybase: Class.forName(“com.sybase.jdbc.SybDriver”); Mendefinisikan koneksi URL • Menspesifikasikan lokasi database server. Untuk mendefinisikan URL kita bisa menggunakan dokumentasi driver. Untuk penggunaan JDBC di applet maka database server harus berada pada node yang sama dengan letak applet dan menggunakan proxy server yang me “reroute” request database ke actual server. Berikut ini contoh mendefinisikan url: Membuat koneksi • Membuat koneksi bisa dilakukan dengan cara memanggil method getConnection() dari DriverManager dengan melewatkan URL sebagai argumen. Method getConnection() akan melempar SQLException. • Contoh: Membuat koneksi • Akses ke Driver dan DriverMAnager dapat menyebabkan Exception yang harus dikendalikan oleh program. Misal: try{ …… } catch(ClassNotFoundException ex) { System.err.println("Driver Error"); ex.printStackTrace(); System.exit(1); } catch(SQLException ex) { System.err.println("Tidak Berhasil Koneksi dengan Northwind"); System.exit(1); } Membuat obyek statement • Obyek Statement digunakan untuk mengirim query dan perintah ke database. Obyek statement dibuat dengan cara bekerjasama dengan class Connection. Untuk membuat obyek Statement maka kita harus memangil method createStatement() dari Connection. • Contoh: Statement statement = connection.createStatement(); Mengeksekusi query • Untuk mengeksekusi query kita bisa memanfaatkan objek Statement untuk memproses hasil query. Caranya adalah dengan memanggil method executeQuery() dari objek Statement. Method executeQuery() akan mengembalikan nilai yang bertipe ResulSet. • Contoh: String sql=“select col1, col2, col3 from sometable”; ResultSet rs=statement.executeQuery(sql); • Untuk memodifikasi database, gunakan statement.executeUpdate(sql); yang mendukung string sql UPDATE, INSERT INTO, DELETE Memproses result • • Untuk memproses result kita bisa menggunakan method next() pada objek ResultSet untuk mendapatkan result per satu baris. Selama data masih ada method next() akan mengembalikan nilai true dan jika sudah tidak ada akan mengembalikan nilai false. Contoh: String nrp; String nama; while (rs.next()){ nrp=rs.getString(1); nama=rs.getString(2); System.out.println("NRP : " +nrp); System.out.println("NAMA : " +nama); System.out.println("-------------"); } Memproses result • Kolom pertama mempunyai index 1 bukan 0. Objek ResultSet otomatis akan ditutup bila ada objek ResultSet baru. ResultSet memberikan bermacammacam method getXxx() dengan parameter indek kolom atau nama kolom dan mengembalikan data. Beberapa method yang ada pada ResultSet adalah sebagai berikut: – findColumn() untuk mendapatkan index (integer value) berdasarkan nama kolom. – getMetaData() untuk meretrieve informasi mengenai ResultSet, returns object ResultSetMetaData. – wasNull() untuk mengetahui apakah getXxx() menghasilkan SQL null. Menutup koneksi • Karena membuka koneksi adalah mahal, maka penundaan langkah terakhir ini hanya jika masih ada operasi database yang dilakukan. • Deklarasi untuk menutup koneksi harus didefinisikan secara eksplisit dengan cara sebagai berikut: connection.close(); Membuat Data Source • Berikut ini adalah langkah-langkah untuk mengakses tabel yang tersimpan pada database Acces dengan menggunakan ODBC • Click Start, Settings, Control Panel, Administrative Tools, Data Sources(ODBC), System DSN, dan pilih Add • Memilih driver Microsoft Access, Finish, ketikkan nama Data Source Name dan tekan Select untuk memilih nama dan lokasi database • Navigasi pada directory msoffice, pilih Northwind.mdb, tekan OK dan lanjutkan tekan OK pada window Program • Gunakan sun.jdbc.JdbcOdbcDriver sebagai nama class dari JDBC driver Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); • Gunakan “jdbc:odbc:Northwind” sebagai alamat database, dan gunakan empty string pada username dan password Connection con=DriverManager.getConnection(jdbc:odbc:Northwind,””,””); Percobaan 1 • Program yang mengakses dan menampilkan semua data pada kolom kedua dan ketiga pada tabel Employees pada database Northwind.mdb. Pada program ini database tidak berubah, karena hanya melakukan select query. • Buatlah juga data source untuk database Northwind.mdb import java.sql.*; public class NorthWind { private Connection con; NorthWind(){ con=null; } public ResultSet dbOpen() { String dbname="jdbc:odbc:Northwind"; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con=DriverManager.getConnection(dbname,"",""); if (con==null) System.err.println("Koneksi ke Database gagal"); else System.err.println("Koneksi ke Database Berhasil"); }catch(ClassNotFoundException ex) { System.err.println("Driver Error"); ex.printStackTrace(); System.exit(1); }catch(SQLException ex) { System.err.println("Tidak Berhasil Koneksi dengan Northwind"); System.exit(1); } ResultSet rs=null; Statement st; try { System.out.println("Employees\n" + "==========="); st=con.createStatement(); rs=st.executeQuery("SELECT * FROM employees"); }catch(SQLException ex){ ex.printStackTrace(); } return(rs); } public void showEmployee (ResultSet rs) throws SQLException { ResultSetMetaData rsData = rs.getMetaData(); String kolom3 = rsData.getColumnName(3); String kolom2 = rsData.getColumnName(2); while (rs.next()){ System.out.print(rs.getString(kolom3)+" "); System.out.println(rs.getString(kolom2)+" "); } } public void dbClose(){ try { con.close(); } catch(SQLException sqlex){ System.err.println("Error :Koneksi Database tidak Bisa diputus"); } } public static void main(String argv[]) throws Exception { NorthWind app=new NorthWind(); ResultSet rs; rs=app.dbOpen(); app.showEmployee(rs); app.dbClose(); } } Percobaan 2 • Program yang melakukan insert yang berarti melakukan update data dan menampilkan data pada database. Pada contoh ini digunakan method executeUpdate() untuk mengupdate database. import java.sql.*; public class Insert { private Connection con; Insert(){ con=null; } public void dbOpen() { String dbname="jdbc:odbc:Northwind"; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con=DriverManager.getConnection(dbname,"",""); if (con==null) System.err.println("Koneksi ke Database gagal"); else System.err.println("Koneksi ke Database Berhasil"); }catch(ClassNotFoundException ex) { System.err.println("Driver Error"); ex.printStackTrace(); System.exit(1); }catch(SQLException ex) { System.err.println("Tidak Berhasil Koneksi dengan Northwind"); System.exit(1); } } public ResultSet select(){ ResultSet rs = null; Statement st; try{ st = con.createStatement(); String sql1 = "SELECT * FROM SHIPPERS"; rs = st.executeQuery(sql1); }catch(SQLException ex) { System.err.println("Tidak Berhasil update Northwind"); System.exit(1); } return(rs); } public void insert(){ try{ Statement st = con.createStatement(); String sql2 = "INSERT INTO SHIPPERS (ShipperID, CompanyName, Phone) VALUES (4,'Federal Express','(031) 555-1111')"; st.executeUpdate(sql2); }catch(SQLException ex) { System.err.println("Tidak Berhasil update Northwind"); System.exit(1); } } public void showShippers(ResultSet rs){ try{ ResultSetMetaData rsData = rs.getMetaData(); String kolom1 = rsData.getColumnName(1); String kolom2 = rsData.getColumnName(2); String kolom3 = rsData.getColumnName(3); while (rs.next()){ System.out.print(rs.getString(kolom1)+" "); System.out.print(rs.getString(kolom2)+" "); System.out.println(rs.getString(kolom3)+" "); } }catch(SQLException ex) { System.err.println("Tidak Berhasil retrieve Northwind"); System.exit(1); } } public void dbClose(){ try { con.close(); }catch(SQLException sqlex){ System.err.println("Error :Koneksi Database tidak Bisa diputus"); } } public static void main(String argv[]) throws Exception { Insert app = new Insert(); ResultSet rs; app.dbOpen(); rs = app.select(); System.out.println("Data Shippers sebelum insert"); app.showShippers(rs); app.insert(); rs = app.select(); System.out.println("Data Shippers sesudah insert"); app.showShippers(rs); app.dbClose(); } } Percobaan 3 • Melakukan update data suatu record pada suatu tabel, dengan menggunakan query SET. import java.sql.*; public class Set { private Connection con; Set(){ con=null; } public void dbOpen() { String dbname="jdbc:odbc:Northwind"; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con=DriverManager.getConnection(dbname,"",""); if (con==null) System.err.println("Koneksi ke Database gagal"); else System.err.println("Koneksi ke Database Berhasil"); }catch(ClassNotFoundException ex) { System.err.println("Driver Error"); ex.printStackTrace(); System.exit(1); }catch(SQLException ex) { System.err.println("Tidak Berhasil Koneksi dengan Northwind"); System.exit(1); } } public ResultSet select(){ ResultSet rs = null; Statement st; try{ st = con.createStatement(); String sql1 = "SELECT * FROM SHIPPERS"; rs = st.executeQuery(sql1); }catch(SQLException ex) { System.err.println("Tidak Berhasil update Northwind"); System.exit(1); } return(rs); } public void set(){ try{ Statement st = con.createStatement(); String sql2 = "UPDATE SHIPPERS SET CompanyName = 'TIKI' WHERE ShipperID=1"; st.executeUpdate(sql2); }catch(SQLException ex) { System.err.println("Tidak Berhasil update Northwind"); System.exit(1); } } public void showShippers(ResultSet rs){ try{ ResultSetMetaData rsData = rs.getMetaData(); String kolom1 = rsData.getColumnName(1); String kolom2 = rsData.getColumnName(2); String kolom3 = rsData.getColumnName(3); while (rs.next()){ System.out.print(rs.getString(kolom1)+" "); System.out.print(rs.getString(kolom2)+" "); System.out.println(rs.getString(kolom3)+" "); } }catch(SQLException ex) { System.err.println("Tidak Berhasil retrieve Northwind"); System.exit(1); } } public void dbClose(){ try { con.close(); }catch(SQLException sqlex){ System.err.println("Error :Koneksi Database tidak Bisa diputus"); } } public static void main(String argv[]) throws Exception { Set app = new Set(); ResultSet rs; app.dbOpen(); rs = app.select(); System.out.println("Data Shippers sebelum set"); app.showShippers(rs); app.set(); rs = app.select(); System.out.println("Data Shippers sesudah set"); app.showShippers(rs); app.dbClose(); } } Soal Latihan 1. Buat sebuah program yang membuat tabel bernama BUKU dengan struktur tabel sebagai berikut: Nama kolom • Tipe data NAMA_BUKU VARCHAR ID_PENERBIT INTEGER HARGA REAL PENJUALAN INTEGER Panjang 40 Berikut ini adalah query untuk membuat tabel BUKU: CREATE TABLE BUKU (NAMA_BUKU VARCHAR(40), ID_PENERBIT INTEGER, HARGA REAL, PENJUALAN INTEGER) Karena query diatas melakukan update terhadap database maka gunakan method executeUpdate(). Jangan lupa menentukan database yang digunakan untuk menyimpan tabel buku terlebih dahulu! Soal Latihan 2. Setelah membuat tabel pada nomor 1 diatas. Buatlah program yang digunakan untuk mengusi tabel BUKU tersebut dengan data sebagai berikut: NAMA_BUKU ID_PENERBIT HARGA PENJUALAN E-Learning 101 25000 0 Jaringan Tanpa Hardisk 203 23000 0 Oracle9i 311 54000 0 Pemrograman Java 101 49000 0 3. Setelah nomor 1 dan 2 selesai. Tampilkan semua data tabel BUKU tersebut dengan menggunakan metode next dan getXxx. Gunakan method executeQuery(); 4. Misal toko buku ini berhasil menjual buku Pemrograman Java sebanyak 5 buah. Maka lakukan update tabel untuk mengubah kolom PENJUALAN yang sebelumnya 0 menjadi 5. Gunakan query sebagai berikut: UPDATE BUKU SET PENJUALAN = 5 WHERE NAMA_BUKU = ‘Pemrograman Java’