Web Programming Ver 2.0 2006 Teknik Akses Data JDBC Agar dapat menggunakan pernyataan sql di program java, kita harus menyertakan paket java.sql. Setelah sebuah database dan tabel dibuat, komponen J2EE dapat mengirimkan perintah ke DBMS untuk menyimpan, mengambil, update, manipulasi dan menghapus data. Langkah –langkah untuk menggunakan JDBC sebagai berikut : 1. Masukkan paket java.sql 2. Register driver yang sesuai 3. Koneksi ke databse 4. Buat pernyataan/statement 5. Eksekusi statement 6. Ambil hasil/result 7. Tutup statement dan koneksi Microsoft merupakan perusahaan pertama yang membuat suatu cara agar pengaksesan berbagai data menjadi sangat mudah menggunakan Open Database Connection (ODBC). JDBC API berisi 2 paket yaitu java.sql yang merupakan bagian dari J2SE dan javax.sql yang merupakan perluasan dari java.sql untuk aplikasi J2EE untuk dapat berinteraksi dengan Java Naming and Directory Interface (JNDI). Koneksi di SQL Server 2005 Untuk menggunakan database yang sudah ada di dalam CD, Anda attach file database melalui menu Attach Database di Enterprise Manager SQL Server 2005. Pastikan nama database yang anda buat ialah java. Menempelkan file database Java_Data.MDF Widodo Budiharto D2637 Web Programming Ver 2.0 2006 java_Data.MDF ditempelkan ke Server Server 2005 Untuk membuat koneksi ke Microsoft SQL Server 2005 di java umumnya kita menggunakan ODBC. Anda dapat membuat ODBC melalui DataSources ODBC di dalam Administrative tools sebagai berikut : ODBC Data Source Anda dapat memilih database yang anda inginkan seperti yang tersedia di gambar atas. Sebagai contoh jika ingin membuat koeksi ke sql server, anda pilih Data Source tersebut lalu beri nama serta Widodo Budiharto D2637 Web Programming Ver 2.0 2006 tentukan nama servernya. Jika anda ingin koeksi ke Ms Access, pilih driver Microsoft Access Driver (*.mdb) lalu beri nama data source serta nama file .mdb . Perlu diperhatikan untuk letak file .mdb disarankan jangan masuk terlalu banyak ke dalam direktori karena sering error, jadi kalau bisa di root direktori. Membuat data source Sql Server Memberi nama DSN dan seting database Berbagai objek untuk Query Data Setelah koneksi ke database dibuka, komponen J2EE dibuat dan mengirm sebuah query untuk mengakses data di dalam database. Objek-objek untuk query ada 3 yaitu Statement yang melakukan query dengan cepat, PreparedStatement yang digunakan untuk mengeksekusi query yang dikompilasi ( yang membutuhkan input menggunakan tanda ?) dan CallableStatement untuk mengeksekusi stored procedure. Objek Statement Objek Statement digunakan ketika komponen J2EE harus mengeksekusi dengan cepat sebuah query tanpa harus menggunakan query yang harus dikompilasi / stored procedure Contoh : String url=”jdbc:odbc:Kopi”; Widodo Budiharto D2637 Web Programming Ver 2.0 2006 String userID=”sa”; String password=””; Statement DataRequest; ResultSet Results; Connection Db; try { String query=”select * from customers”; DataRequest =Db.createStatement(); Results=DataRequest.executeQuery(query); DataRequest.close(); } Jika anda ingin melakukan joining tabel, gunakan contoh berikut : String query = "select SUPPLIERS.SUP_NAME, COFFEES.COF_NAME " + "from COFFEES, SUPPLIERS " + "where SUPPLIERS.SUP_NAME like 'Acme, Inc.' and " + "SUPPLIERS.SUP_ID = COFFEES.SUP_ID"; Statement stmt; try { Class.forName("myDriver.ClassName"); } catch(java.lang.ClassNotFoundException e) { System.err.print("ClassNotFoundException: "); System.err.println(e.getMessage()); } try { con = DriverManager.getConnection (url, "sa", ""); stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(query); System.out.println("Supplier, Coffee:"); while (rs.next()) { String supName = rs.getString(1); String cofName = rs.getString(2); System.out.println(" " + supName + ", " + cofName); } Perlu diingat bahwa method executeUpdate() digunakan hanya untuk aksi insert, update, delete dan Data Definition Language. Objek PreparedStatement Sebuah query SQL dapat diprecompilasi dan dieksekusi menggunakan objek PreparedStatement. Tanda Tanya (?) dapat digunakan sebagai tempat untuk memasukkan nilai. Contoh : try { String query=”Select * from Customers where CustNumber=?”; PreparedStatement pstatement=Db.preparedStatement(query); pstatement.setString(1,”123”); Results=pstatement.executeQuery(); pstatement.close(); Objek CallableStatement Objek CallabelStatement digunakan untuk memanggil stored prosedure dari objek J2EE. Stored procedure ialah sekumpulan sintaks sql yang mempunyai 1 buah nama dan dapat dipanggil. Widodo Budiharto D2637 Web Programming Ver 2.0 2006 Contoh : String ordernumber; try { String query=”{CALL StoredProcSaya (?)}”; CallableStatement cstatement =Db.prepareCall(query); sstatement.registerOutParameter(1,Types.VARCHAR(); sstatement.execute(); ordernumber=cstatement.getString(1); cstatement.close(); ResultSet Scrollable Objek ResultSet berisi method untuk mengkopi data dari ResultSet ke objek koleksi java atau variable untuk pemrosesan lebih lanjut. ResultSet menggunakan cursor virtual untuk menunjuk sebuah baris dari table virtual. Setlah cursor virtual menunjuk ke sebuah baris, method getxxx() digunakan untuk mengkpi data dari baris ke sebuah koleksi, objek atau variable. Method next() digunakan untuk memindahkan pointer virtual ke baris pertama pada ResultSet. Jika ada data pada baris tersebut, next() akan mengembalikan nilai true. Nilai true tersebut akan menyebabkan program masuk ke do…while pada blok try dimana method getString dipanggil untuk mengakses data pada kolom bertipe string. Contoh : do { FirstName=Results.getString(1); LastName=Results.getString(2); Printrow=FistName + “” + LastName; System.out.println (printrow); } while (Results.next()); DataRequest.close(); Ada 6 method dari objek ResultSet yang digunakan untuk memposisikan cursor vitutal yaitu first(), last(), previous(), absolute(), relative() dan getRow(). Objek Statement yang dibuat menggunakan createStatement() dari Objek Connection harus disetup untuk menangani scrollable ResultSet dengan mempassing method createStatement() menggunakan salah satu dari 3 konstanta yaitu TYPE_FORWARD_ONLY( baca data arah maju saja), TYPE_SCROLL_INSENSITIVE (tidak sensitif terhadap perubahan data) dan TYPE_SCROLL_SENSITIVE. Contoh : try{ String query =”select FirstName, LastName from Customers” DataRequest =Db.createStatement(TYPE_SCROLL_INSENSITIVE); Results =DataRequest.executeQuery (query); } Update dan Delete ResultSet Setelah method executeQuery() dipanggil, method updatexxx() dapat digunakan untuk mengubah nilai dari suatu kolom data. Contoh : try { String query=”select * from customers where FirstName=’Ratna’ and LastName=’Budiharto’”; DataRequest =Db.createStatement (ResultSet.CONCUR_UPDATABLE); Results =DataRequest.executeQuery (query); …. Widodo Budiharto D2637 Web Programming Ver 2.0 2006 try { Results.updateString (“LastName”,”Budiharto”); Results.updateRow(); //menghapus 1 row saat ini Results.deleteRow(0); DataRequest.close(); Contoh Aplikasi JDBC Contoh berikut ialah membuat tabel, memasukkan data ke tabel, menampilkan dan mengupdate data di tabel tersebut dan memanggil data menggunakan stored procedure. Tabel yang dibuat bernama coffees dengan nama ODBC Kopi. Anda terlebih dahulu harus membuat sebuah projek dengan nama AplikasiJava. package aplikasijava; import java.sql.*;//paket untuk sql public class CreateCoffees { public static void main(String args[]) { //nama odbc ialah Kopi String url = "jdbc:odbc:Kopi"; Connection con; //Buat objek Conection String createString; //membuat tabel coffees createString = "create table coffees " + "(COF_NAME VARCHAR(32), " +"SUP_ID INTEGER, " + "PRICE FLOAT, " +"SALES INTEGER, " + "TOTAL INTEGER)"; Statement stmt; try { //meload driver jdbc Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch(java.lang.ClassNotFoundException e) { System.err.print("ClassNotFoundException: "); System.err.println(e.getMessage()); } try { //membuat koneksi dengan username sa dan password kosong (karena default sql) con = DriverManager.getConnection(url, "sa", "password_anda"); stmt = con.createStatement(); stmt.executeUpdate(createString); //eksekusi string tersebut stmt.executeUpdate("insert into coffees " + " values ('colombian',101,7.99,0,0)");//masukkan data stmt.executeUpdate("insert into coffees " + " values ('java',102,8.99,0,0)"); //menampilkan data cof_name dan price //menggunakan executeQuery karena menjalankan select statement, bukan update/delete ResultSet rs=stmt.executeQuery ("Select cof_name, price from coffees"); //eksekusi query System.out.println ("@@@@ Menampilkan data pertama kali @@@@");//Menampilkan data while (rs.next()) { String s=rs.getString ("Cof_name");//Pastikan tipe data sesuai float n =rs.getFloat ("price"); Widodo Budiharto D2637 Web Programming Ver 2.0 2006 System.out.println (s + " " + n); } //mengupdate tabel coffess dengan syarat cof_name nya ialah 'colombian' String updateString ="Update coffees" + " set sales=75 " + "where cof_name like 'colombian'"; //menggunakan executeUpdate karena mengupdate data stmt.executeUpdate (updateString); //menampilkan data yang telah diupdate ResultSet rs2=stmt.executeQuery ("Select cof_name, sales, price from coffees"); System.out.println ("@@@ Menampilkan data yang telah diupdate @@@"); while (rs2.next()) { String s2=rs2.getString ("Cof_name"); int b2=rs2.getInt ("sales"); float n2 =rs2.getFloat ("price"); System.out.println (s2 + " " + b2 + " " + n2); } //menampilkan yang telah diupdate untuk cof_name yang 'colombian’; String query1 = " select cof_name, sales from coffees" + " where cof_name like 'colombian'"; ResultSet rs1 =stmt.executeQuery (query1); System.out.println ("@@@@@Menampilkan data yang telah diupdate untuk colombian@@@@@"); while (rs1.next()) { String s1 =rs1.getString ("cof_name"); int n1 =rs1.getInt ("sales"); System.out.println (n1 + " pounds of " + s1 + " sold this week"); } //Update menggunakan commit PreparedStatement updateTotal = con.prepareStatement ( "update coffees set TOTAL = TOTAL + ? where cof_name like ?"); updateTotal.setInt (1,50); updateTotal.setString (2,"colombian"); updateTotal.executeUpdate(); con.commit(); //con.setAutoCommit(true); //menampilkan yang telah diupdate menggunakan commit String query5 = " select cof_name, total from coffees" + " where cof_name like 'colombian'"; ResultSet rs7 =stmt.executeQuery (query5); System.out.println ("@@@Menampilkan data yang telah diupdate untuk colombian menggunakan commit@@@"); while (rs7.next()) { String s7 =rs7.getString ("cof_name"); int n7 =rs7.getInt ("total"); System.out.println (n7 + " total " + s7 + " sold this week"); } //Stored procedure System.out.println ("@@@@ Berikut contoh penggunaan dan pemanggilan Stored Procedure @@@@"); //Buat stored procedure String c = "create procedure SHOWS " + "as select sup_id, cof_name from coffees "; Statement stmt3=con.createStatement(); stmt.executeUpdate(c); //Panggil stored procedure menggunakan call CallableStatement cs = con.prepareCall ("{ call SHOWS }"); ResultSet rs4 =cs.executeQuery(); while (rs4.next()) { Widodo Budiharto D2637 Web Programming Ver 2.0 2006 int s4=rs4.getInt("sup_id"); String s5=rs4.getString ("cof_name"); System.out.println(s4 + " mensuplai kopi " + s5); } stmt.close(); con.close(); } catch(SQLException ex) { System.err.println("SQLException: " + ex.getMessage()); }}} Program di atas dapat dijelaskan sebagai berikut : import java.sql.* Java membutuhkan paket tersebut untuk mengenal sintaks –sintaks sql seperti select statement dan segala sesuatu yang berhubungan dengan database. String createString; //membuat tabel coffees createString = "create table coffees " + "(COF_NAME VARCHAR(32), " +"SUP_ID INTEGER, " + "PRICE FLOAT, " +"SALES INTEGER, " + "TOTAL INTEGER)"; Program diatas akan membuat sebuah table coffess dimana string /informasi perintah pembuatan tabel tersebut disimpan di dalam sebuah variable bernama createString. try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch(java.lang.ClassNotFoundException e) { System.err.print("ClassNotFoundException: "); System.err.println(e.getMessage()); } Program di atas akan mecoba mencocokkan nama kelas untuk driver jdbc pada java, yang berada di dalam blok try..catch untuk antisipasi jika ada error, dibuang ke bagian catch yang akan menampilkan pesan error menggunakan kelas ClassNotFoundException . String url = "jdbc:odbc:Kopi"; con = DriverManager.getConnection(url, "sa", "password_anda"); stmt = con.createStatement(); Nama dari ODBC di atas ialah Kopi, lalu objek koneksi con akan diset koneksinya dimana alamatnya ialah url, dengan username sa tanpa password. Lalu objek stmt akan menampung hasil pembuatan statement dari objek con. stmt.executeUpdate(createString); //eksekusi string tersebut stmt.executeUpdate("insert into coffees " + " values ('colombian',101,7.99,0,0 stmt.executeUpdate("insert into coffees " + " values ('java',102,8.99,0,0)"); //menampilkan data cof_name dan price Widodo Budiharto D2637 Web Programming Ver 2.0 2006 //menggunakan executeQuery karena menjalankan select statement, bukan update/delete ResultSet rs=stmt.executeQuery ("Select cof_name, price from coffees"); //eksekusi query System.out.println ("@@@@ Menampilkan data pertama kali @@@@"); while (rs.next()) { String s=rs.getString ("Cof_name");//Pastikan tipe data sesuai float n =rs.getFloat ("price"); System.out.println (s + " " + n); } Widodo Budiharto D2637