JDBC
JDBC
JDBC
Ifnu Bima
ifnu@artivisi.com http://ifnu.artivisi.com
Daftar Isi
Koneksi Database Dengan JDBC.................................................................................1
Mengenal JDBC....................................................................................................................1 Database Driver..................................................................................................................2 Membuat Koneksi................................................................................................................3 Mengambil dan Memanipulasi Data dari Database..............................................................4 Menggunakan PreparedStatement...................................................................................... Bat!" #$e!ution..................................................................................................................% Menangani &ransa!tion.....................................................................................................1' D() dan Servi!e Pattern...................................................................................................11
HALAMAN III
HALAMAN
2 | JDBC
7. JD&C 8est ,uite JD&C 8est ,uite membantu kita untuk mencara river mana yan% cocok i%unakan untuk me!akukan sebuah koneksi ke sumber ata tertentu. 8es yan% i!akukan ti ak memer!ukan resource besar ataupun tes yan% komprehensif, namun cukup tes1tes se erhana yan% memastikan fitur1fitur pentin% JD&C apat ber0a!an en%an !ancar. 4. JD&C19D&C &ri %e &ri%e ini menye iakan fasi!itas JD&C untuk me!akukan koneksi ke sumber ata men%%unakan 9D&C )9pen Data&ase Connectivity- river. ,eba%ai catatan, an a per!u me!oa river 9D&C i setiap komputer c!ient untuk apat men%%unakan bri %e ini. ,eba%ai konsekuensinya, cara ini hanya cocok i!akukan i !in%kun%an intranet imana isu insta!asi ti ak men0a i masa!ah. Den%an keempat komponen yan% ipunyainya, JD&C men0a i too!s yan% apat ian a!kan untuk me!akukan koneksi, men%ambi! ata an merubah ata ari berba%ai macam sumber ata. +o u! ini hanya akan membahas ua komponen pertama ari keempat komponen yan% ipunyai o!eh JD&C, yaitu JD&C "#$ an Driver+ana%er. ,umber ata yan% i%unakan a a!ah *e!ationa! Database.
Database Driver
JD&C memer!ukan atabase river untuk me!akukan koneksi ke suatu sumber ata. Database river ini bersifat spesifik untuk setiap 0enis sumber ata. Database river biasanya ibuat o!eh pihak pembuat sumber atanya, namun ti ak 0aran% 0u%a komunitas atau pihak keti%a menye iakan atabase river untuk sebuah sumber ata tertentu. #er!u ipahami seka!i !a%i bahwa atabase river bersifat spesifik untuk setiap 0enis sumber ata. +isa!nya, Database Driver +y,'! hanya bisa i%unakan untuk me!akukan koneksi ke atabase +y,'! an be%itu 0u%a atabase river untuk #ost%re ,./ 0u%a hanya bisa i%unakan untuk me!akukan koneksi ke atabase #ost%re ,./.
Membuat Koneksi
+e!akukan koneksi ke atabase me!ibatkan ua !an%kah: +e!oa river an membuat koneksi itu sen iri. Cara me!oa river san%at mu ah, pertama !etakkan fi!e 0ar atabase river ke a!am c!asspath. 2emu ian !oa river en%an menambahkan ko e berikut ini: Class.forName(com.mysql.jdbc.Driver); :ama c!ass atabase river untuk setiap D&+, berbe a, an a bisa menemukan nama c!ass tersebut a!am okumentasi river atabase yan% an a %unakan. Da!am contoh ini, nama c!ass atabase river ari +y,'! a a!ah com.mys'!.0 bc.Driver. +eman%%i! metho C!ass.for:ame secara otomatis membuat instance ari atabase river, c!ass Driver+ana%er secara otomatis 0u%a ipan%%i! untuk men%e!o!a c!ass atabase river ini. Ja i an a ti ak per!u men%%unakan statement new untuk membuat instance ari c!ass atabase river tersebut. /an%kah berikutnya a a!ah membuat koneksi ke atabase men%%unakan atabase river yan% su ah i!oa ta i. C!ass Driver+ana%er beker0a sama en%an interface Driver untuk men%e!o!a river1 river yan% i!oa o!eh ap!ikasi, 0a i a!am satu sesi an a bisa me!oa beberapa atabase river yan% berbe a. 2etika kita benar1benar me!akukan koneksi, JD&C 8est ,uite akan me!akukan seran%kaian tes untuk menentukan river mana yan% akan i%unakan. #arameter yan% i%unakan untuk menentukan river yan% sesuai a a!ah ;*/. "p!ikasi yan% akan me!akukan koneksi ke atabase menye iakan ;*/ pen%ena! ari server atabse tersebut. ,eba%ai contoh a a!ah ;*/ yan% i%unakan untuk me!akukan koneksi ke +y,'! :
HALAMAN
4 | JDBC
jdbc:mysql://[host]:[port]/[schema] contoh konkritnya : jdbc:mysql://localhost:3306/latihan ,etiap ven or D&+, akan menyertakan cara untuk menentukan ;*/ ini i a!am okumentasi. "n a tin%%a! membaca okumentasi tersebut tanpa harus khawatir ti ak menemukan informasi yan% an a per!ukan. +etho Driver+ana%er.%etConnection bertu%as untuk membuat koneksi: Connection conn = DriverManager.getConnection( jdbc:mysql://localhost:3306/latihan); Da!am kebanyakan kasus an a 0u%a harus memasukkan parameter username an passwor untuk apat me!akukan koneksi ke a!am atabase. +etho %etConnection menerima ;sername seba%ai parameter ke ua an paswor seba%ai parameter keti%a, sehin%%a ko e iatas apat irubah men0a i : Connection conn = DriverManager.getConnection( jdbc:mysql://localhost:3306/latihan, root,); Jika sa!ah satu ari river yan% i!oa berhasi! i%unakan untuk me!akukan koneksi en%an ;*/ tersebut, maka koneksi ke atabase berhasi! i!aksanakan. C!ass Connection akan meme%an% informasi koneksi ke atabase yan% i efinisikan o!eh ;*/ tersebut. ,ete!ah sukses me!akukan koneksi ke atabase, kita apat men%ambi! ata ari atabase men%%unakan perintah 'uery ataupun me!akukan perubahan terha ap atabase. ba%ian berikut ini akan meneran%kan ba%aimana cara men%ambi! an memanipu!asi ata ari atabase.
JD&C menye iakan ti%a tipe resu!t set untuk tu0uan berbe a: (. 8<#3=>9*?"*D=9:/< : resu!t set tersebut ti ak bisa ber0a!an mun ur, res!ut set hanya bisa ber0a!an ma0u ari baris pertama hin%%a baris terakhir. resu!t set hanya men%%ambarkan kea aan ata ketika 'uery i0a!ankan atau ketika ata iterima o!eh resu! set. Jika sete!ah itu a a perubahan ata a!am atabase, resu!t set ti ak akan iup ate a!ias ti ak a a perubahan a!am resu!t set tipe ini. 8<#3=,C*9//=$:,3:,$8$@3 : resu!t set apat ber0a!an ma0u mun ur. resu!t set apat ber0a!an ma0u ari row pertama hin%%a terakhir atau ber%erak bebas ber asarkan posisi re!atif atau abso!ute. 8<#3=,C*9//=,3:,$8$@3 : resu!t set apat ber0a!an ma0u mun ur. resu!t set apat ber0a!an ma0u ari row pertama hin%%a terakhir atau ber%erak bebas ber asarkan posisi re!atif atau abso!ute.
2.
7.
$nstance ari ob0ect bertipe *esu!t,et iper!ukan untuk menampun% hasi! kemba!ian ata ari atabase. ,ebe!um kita bisa mempero!eh instance ari *esu!t,et, kita harus membuat instance
HALAMAN
6 | JDBC
ari c!ass ,tatement. C!ass ,tatement mempunyai metho e6ecute.uery yan% i%unakan untuk men0a!ankan perintah 'uery a!am atabase kemu ian men%emba!ikan ata hasi! eksekusi 'uery ke a!am ob0ect *esu!t,et. &erikut ini a a!ah contoh ko e untuk membuat instance c!ass ,tatement, kemu ian men0a!ankan 'uery untuk men%ambi! ata ari atabase yan% hasi!nya ipe%an% o!eh *esu!t,et : Statement statement = conn.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); ResulSet rs = statement.executeQuery(select * from Customers); *esu!t,et akan me!etakkan kursornya )posisi pembacaan baris- i sebuah posisi sebe!um baris pertama. ;ntuk men%%erakkan kursor ma0u, mun ur, ke suatu posisi re!atif atau ke suatu posisi abso!ute tertentu, %unakan metho 1metho ari *esu!t,et: ne6t)- 11 men%arahkan kursor ma0u satu baris. previous)- 11 men%arahkan kursor mun ur satu baris. first)- 11 men%arahkan kursor ke baris pertama. !ast)- 11 men%arahkan kursor ke baris terakhir. before>irst)- 11 men%arahkan kursor ke sebe!um baris pertama. after/ast)- 11 men%arahkan kursor ke sete!ah baris terakhir. re!ative)int rows- 11 men%arahkan kursor re!atif ari posisinya yan% sekaran%. ,et ni!ai rows en%an ni!ai positif untuk ma0u, an ni!ai ne%atif untuk mun ur. abso!ute)int row:umber- A men%arahkan kursor ke posisi tertentu sesuai en%an ni!ai row:umber, an tentu sa0a ni!ainya harus positif.
Class.forName(com.mysql.jdbc.Driver); Connection conn = DriverManager.getConnection( jdbc:mysql://localhost:3306/latihan, root,); Statement statement = conn.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); ResulSet rs = statement.executeQuery(select * from Customers); while(rs.next()){ System.out.println(rs.getInt(id)); System.out.println(rs.getString(Nama)); } +etho e6ecute.uery hanya apat men0a!ankan perintah ,./ se!ect, %unakan metho e6ecute;p ate untuk men0a!ankan perintah insert, up ate an e!ete. Basi! ari eksekusi insert, up ate an e!ete ti ak men%emba!ikan resu!t set, tetapi men%emba!ikan sebuah ni!ai inte%er yan% merepresentasikan status hasi! eksekusi metho e6ecute;p ate. &erikut ini contoh insert, up ate an e!ete :
HALAMAN
8 | JDBC
result = statement.executeUpdate( "update Customers set nama ='roby' nama='andy'"); result = statement.executeUpdate( "delete Customers where nama='andy'");
where
+en%%unakan e6ecute.uery an e6ecute;p ate san%at mu ah an f!eksib!e, namun san%at ti ak efisien, #repare ,tatement menawarkan keun%%u!an a!am bentuk efisiensi.
Menggunakan PreparedStatement
+eman%%i! metho e6ecute;p ate beru!an%1u!an%, misa!nya me!akukan insert ratusan atau ribuan baris, san%at ti ak efisien. Ba! ini isebabkan karena D&+, harus memproses setiap 'uery yan% ikirimkan a!am beberapa !an%kah: memparsin% 'uery, men%compi!e 'uery an kemu ian baru men%eksekusi 'uery tersebut. #repare ,tatement menawarkan so!usi yan% !ebih baik a!am menan%ani kea aan tersebut. #repare ,tatement menyaratkan 'uery yan% akan ieksekusi i efinisikan ter!ebih ahu!u ketika #repare ,tatement ibuat. 2emu ian 'uery tersebut ikirimkan ke a!am atabase untuk icompi!e ter!ebih ahu!u sebe!um i%unakan. 2onsekuensinya, #repare ,tatement bukan hanya mempunyai 'uery, tetapi mempunyai 'uery yan% su ah icompi!e. 2etika #repare ,tatement i0a!ankan, D&+, ti ak per!u me!akukan kompi!asi u!an% terha ap 'uery yan% i0a!ankan #repare ,tatement. Ba! ini!ah yan% menyebabkan #repare ,tatement 0auh !ebih efisien iban in%kan men%%unakan metho ,tatement.e6ecute;p ate. &erikut ini contoh pembuatan #repare ,tatement men%%unakan c!ass Connection yan% te!ah ibuat sebe!umnya : PreparedStatement ps = conn.prepareStatement( update T_PERSON set name = ? where name = ?); #erhatikan tan a C yan% a a a!am 'uery iatas, tan a C isebut seba%ai parameter. 2ita bisa memberikan ni!ai yan% berbe a ke a!am parameter a!am setiap peman%%i!an #repare ,tatement. +etho set,trin%, set>!oat, set$nt an beberapa metho !ain
Batch Execution
+isa!nya kita in%in men%1insert seratus baris ata a!am sebuah !oop, kita bisa men%%unakan fasi!itas batc e6ecution ari #repare ,tatement. batch e6ecution men%umpu!kan semua eksekusi pro%ram yan% akan i!aksanakan, sete!ah semuanya terkumpu! batch e6ecution kemu ian men%irimkan kumpu!an
HALAMAN
10 | JDBC
eksekusi pro%ram secara bersamaan ke D&+, a!am satu kesatuan. +eto e ini san%at efisien karena men%uran%i overhea yan% iper!ukan pro%ram untuk berkomunikasi en%an D&+,. Da!am contoh i bawah ini kita akan men%%unakan batch e6ecution untuk me!akukan insert ata sebanyak seratus ka!i. PreparedStatement pInsert = conn.prepareStatement( "insert into Person(nama) values(?)"); for(int i=0;i<100;i++){ pInsert.setString(1,"user ke " + i); pInsert.addBatch(); } pInsert.executeBatch(); ,etiap ka!i iterasi, metho set,trin% ipan%%i! untuk men%isikan sebuah strin% ke a!am #repare ,tatement, kemu ian metho a &atch ipan%%i! untuk men%umpu!kan batch a!am satu wa ah. ,ete!ah iterasi se!esai, metho e6ecute&atch ipan%%i! untuk me!aksanakan semua keseratus instruksi insert secara berurut en%an seka!i sa0a me!aksanakan koneksi ke atabase.
Menangani Transaction
Dukun%an transaction o!eh JD&C ter%antun% en%an Databasenya, karena a a atabase yan% men ukun% transaction an a a pu!a atabase yan% ti ak men ukun% transaction. +y,./ men ukun% transaction 0ika kita men%%unakan $nnoD& seba%ai sistem tab!enya, ka!au kita men%%unakan +y$,"+ maka transaction ti ak i ukun%. 8ransaction merupakan konsep pentin% ari atabase. 8ransaction memastikan perubahan ata i!aksanakan en%an kai ah "C$D )"tomicity, Consistency, $so!ation, Durabi!ity-. 2ai ah ini memastikan semua proses perubahan ata ber0a!an secara benar, 0ika a a yan% sa!ah maka semua perubahan a!am satu kesatuan !o%ika harus ibata!kan )ro!!back-. +ari kita eva!uasi ko e iatas a%ar men%%unakan transaction, sehin%%a 0ika satu proses insert %a%a!, maka semua insert yan% i!aksanakan sebe!umnya akan ibata!kan :
HALAMAN
12 | JDBC
akses ata iterapkan, apakah men%%unakan JD&C murni atau Bibernate atau J#". /apisan !ainya hanya per!u tahu fun%siona!itas ari suatu metho i a!am D"9 c!ass, ti ak per!u tahu ba%imana metho tersebut iimp!ementasikan. C!ass D"9 akan mempunyai metho seperti save, e!ete, %et&y$ atau %et"!!. #raktek yan% !aFim i%unakan a a!ah satu buah 3ntity/8ab!e akan mempunyai satu buah c!ass D"9. Di bawah ini a a!ah contoh C!ass D"9 men%%unakan JD&C untuk tab!e 8=C"83G9*< :
HALAMAN
14 | JDBC
category.getName()); insertStatement.setString(2, category.getDescription()); int id = insertStatement.executeUpdate(); category.setId(id); } else { updateStatement.setString(1, category.getName()); updateStatement.setString(2, category.getDescription()); updateStatement.setInt(3, category.getId()); updateStatement.executeUpdate(); } } catch (SQLException ex) { }
public void delete(Category category) { try { deleteStatement.setInt(1, category.getId()); deleteStatement.executeUpdate(); } catch (SQLException ex) { } } public Category getById(Long id) { try { getByIdStatement.setLong(1, id); ResultSet rs = getByIdStatement.executeQuery(); //proses mapping dari relational ke object if (rs.next()) { Category category = new Category(); category.setId(rs.getInt("id")); category.setName(rs.getString("name")); category.setDescription( rs.getString("description")); return category; } } catch (SQLException ex) { } return null; } public List<Category> getAll() { try { List<Category> categories = new ArrayList<Category>();
} }
,ervice pattern i%unakan utamanya untuk menye erhanakan c!ass1c!ass D"9 yan% a a, misa!nya kita mempunyai H0 buah tab!e maka !aFimnya akan a a H0 buah c!ass D"9. C!ass D"9 tersebut per!u ise erhanakan, caranya a a!ah en%an men%e!ompokkan c!ass1c!ass D"9 a!am satu mo u! ap!ikasi ke c!ass ,ervice. +isa!nya D"9 yan% berhubun%an en%an user mana%ement ke a!am c!ass ;ser,ervice. 8ransaction iatur a!am c!ass ,ervice, praktek yan% !aFim i%unakan a a!ah satu metho a!am c!ass service a a!ah satu scoop transaction. Ja i ketika metho a!am service mu!ai ieksekusi transaction akan imu!ai )be%in-, ketika metho akan berakhir, transaction akan icommit. &erikut ini a a!ah contoh c!ass ,ervice :
HALAMAN
16 | JDBC
public class ServiceJdbc { private CategoryDaoJdbc categoryDao; private Connection connection; public void setDataSource(DataSource dataSource){ try { connection = dataSource.getConnection(); categoryDao = new CategoryDaoJdbc(); categoryDao.setConnection(connection); } catch (SQLException ex) { } } public void save(Category category){ try { connection.setAutoCommit(false); categoryDao.save(category); connection.commit(); connection.setAutoCommit(true); } catch (SQLException ex) { try{ connection.rollback(); }catch(SQLException e){ } } } public void delete(Category category){ try { connection.setAutoCommit(false); categoryDao.save(category); connection.commit(); connection.setAutoCommit(true); } catch (SQLException ex) { try{ connection.rollback(); }catch(SQLException e){ } } } public Category getGroup(Long id){ return categoryDao.getById(id); } public List<Category> getGroups(){
} }
,ete!ah c!ass D"9 an service berhasi! ba%aimana cara men%%unakannya : public class MainJdbc {
public static void main(String[] args) { MysqlDataSource dataSource = new MysqlDataSource(); dataSource.setUser("root"); dataSource.setPassword("admin"); dataSource.setDatabaseName("latihan"); dataSource.setServerName("localhost"); dataSource.setPortNumber(1527); ServiceJdbc service = new ServiceJdbc(); service.setDataSource(dataSource); Category category = new Category(); category.setName("administrator"); service.save(category); System.out.println("id : " + category.getId()); System.out.println("name : " + category.getName()); try { dataSource.getConnection().close(); } catch (SQLException ex) { } } } ,ete!ah men%ena! JD&C, kita akan membahas cara men%akses atabase yan% !ebih baik en%an man%%unakan J#". Den%an men%%unakan J#" ko e pro%ram yan% akan ibuat akan !ebih rin%kas an ter!ihat konsep 99# iban in% en%an JD&C murni. J#" a a!ah framework 9*+ untuk memetakan tabe! a!am atabase an c!ass a!am konsep 99#. Den%an men%%unakan J#" ko e pro%ram kita akan !ebih rapi an ter!ihat 99#.