Jan 1, 0001  

title: Java Dersleri 17 - JDBC API (Veritabanı Bağlantısı) link: http://orhanbalci.net/tr/?p=750 author: Orhan Balci description: post_id: 750 created: 2010/05/27 21:17:52 created_gmt: 2010/05/27 18:17:52 comment_status: open post_name: java-dersleri-17-jdbc-api status: publish post_type: post

Java Dersleri 17 - JDBC API (Veritabanı Bağlantısı)

[caption id=“attachment_844” align=“aligncenter” width=“600” caption=“Java Dersleri 17 JDBC”]Java Dersleri 17 JDBC[/caption] Bu makalede Java’nın veritabanı kabiliyetlerinden bahsedeceğim. Java’nın tüm veritabanlarına ulaşmak için kullandığı ortak bir API vardır. JDBC (Java Database Connectivity ) API uygulamamızı arka taraftaki veritabanı sisteminden soyutlamamıza olanak tanır. Bunu yapabilmek için elimizde bağlanmak isetdiğimiz veritabının JDBC sürücüsü olmalıdır. Örneğin HSQLDB bağlantısı yapmak istiyorsak bu veritabanı yönetim sistemine ait JDBC sürücüsünü içeren JAR dosyasını projemize eklemeliyiz. Daha sonra bu JAR dosyası içinde bulunan driver sınıfını proje içindeyken JVM’e yüklenmesini sağlamalıyız. [java] Class.forName(“org.hsqldb.jdbcDriver”); [/java] Yukarıdaki kod satırı HSQLDB sürücü sınıfını JVM’e yükler. Bu sürücüyü kullanarak veritabanına bağlantı elde etmek için ise : [java] hsqldbConnection = DriverManager.getConnection(“jdbc:hsqldb:file:”+ databaseName, userName, password); [/java] Buradaki ilk parametre bağlanmak istediğiniz veritabanı tipine göre değişecektir. Buradaki hsqldbConnection nesnesi java.sql.Connection arayüzünü gerçekler. Bu arayüzde veritabanı işlemleri yaparken kullanacağımız metodlar bulunur. Bağlantıyı sağladıktan sonra yapmak isteyeceğimiz ilk şey muhtemel bir SQL sorgusu çalıştırmak olacaktır. Bunun için Connection arayüzünün prepareStatement() metodlarını kullanabiliriz. [java] public ResultSet runSelectQuery(String sqlSorgu) throws SQLException { Statement s = hsqldbConnection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); return s.executeQuery(sqlSorgu); } [/java] Yukarıdaki metod bir sql sorgusu (SELECT) çalıştırarak sonucunu ResultSet nesnesi olarak dışarıya vermektedir. Burada Connection nesnemizden create statement() metoduyla bir Statement nesnesi oluşturduk. Bu nesneyi kullanarak da elimizdeki sql sorgusunu çalıştırdık. SELECT sorgusu bize sonuç döndüğü içn executeQuery() metodunu kullandık. Eğer sonuç dönmeyen UPDATE, DELETE tarzı sql sorgusu çalıştırmak isteseydik executeUpdate() metoduna başvurmalıydık. Burada kullanımı görelim : [java] public int runInsertUpdateQuery(String query) throws SQLException { Statement s = hsqldbConnection.createStatement(); return s.executeUpdate(query); } [/java] Temel olarak yukarıda anlattığım yöntemle veritabanında istediğiniz sorguyu çalıştırabilirsiniz. Bunun dışında veritabanındaki Stored Procedure’leri çalıştırmak isterseniz Connection arayüzünün prepareCall() metodu kullanılmalıdır. Bu metoda vereceğiniz parametre {? = call prosedürismi(?,?)} şeklinde veya {call prosedürismi(?,?)} şeklinde olabilir. Burada öenmli olan nokta çıktı veren prosedürlerde çağırım yapılmadan önce çıktı tiplerinin tanıtılmasıdır. Bir örnekle kullanımı görelim : [java] public void callProcedure(String procedure) throws SQLException { CallableStatement s =hsqldbConnection.prepareCall(“{ ? = yasi_ver(?) }“); s.registerOutParameter(1, Types.INTEGER); s.setString(2, “orhan”); s.execute(); int yas = s.getInt(1); } [/java] Bu örneğimizde veritabanında olduğunu farz ettiğimiz yasi_ver prosedürünü çalıştırdık. Bu prosedür parametre olarak String tipinde bir isim alıyor ver geriye o kişinin int tipinde yaşını dönüyor. Prosedürü çalıştırmadan önce registerOutParameter() metoduyla geri alacağımız değeri bildiriyoruz. JDBC ile ilgili olarak bilmemiz gereken bir diğer özellik ise arkadaki VTYS’den bağımsız olarak scaler fonksiyonları çağırabilme özelliğidir. Scalar fonksiyonlardan kasıt bize sayısal değer dönen COUNT() DATE_TIME() tarzı fonksiyonlardır. Her JDBC driveri bütün scalar fonksiyonları desteklemez. Kullandığınız driver’in desteklediği scalar fonksiyonları listelemek için : [java] hsqldbConnecion = (Connection) DriverManager.getConnection(“jdbc:hsqldb:file:” + databaseName, userName, password); hsqldbConnecion.setAutoCommit(true); DatabaseMetaData dbmd = hsqldbConnecion.getMetaData(); System.out.println(dbmd.getNumericFunctions()); [/java] Yukarıda gördüğümüz üzere Connection nesnemizden DataBaseMetaData’sını sorgulayıp oradan veritabanının desteklediği numeric fonksiyonların listesine ulaşabiliyoruz. Bu fonksiyonlardan herhangi birini çağırmak için ise : [java] Statement s = hsqldbConnecion.createStatement(); ResultSet rs = s.executeQuery(“{ABS(-3)}”); [/java] satırlarını kullanıyoruz. Burada ResultSet’lerin özelliklerine de değinmek istiyorum. Yaptığımız sorguların karşılığında Statement nesneleri bize ResultSet nesnesi döner. ResultSet nesnelerinin tamamı üzerinde istediğimiz şekilde gezinmemize olanak tanımazlar. JDBC sürücüleri genel olarak 3 tip ResultSet gezinimi desteklerler. Bunlar :

ResultSet.TYPE_FORWARD_ONLY : Bu ResultSet üzerinde kursör sadece ileri doğru gider. Sadece tek sefer okuma mümkündür. ResultSet.TYPE_SCROLL_INSENSITIVE : Bu ResultSet üzerinde kursör ileri geri gidebilir. Bu esnada veri tabanında tabloda meydana gelen değişiklikler ResultSet nesnesine yansımaz. ResultSet.TYPE_SCROLL_SENSITIVE : 2. tip ResultSet’ten farkı okuma esnasında tabloda meydana gelen değişikliklerin ResultSet nesnesine yansıtılmasıdır.

ResultSet’lerin diğer önemli bir özelliği de güncellenebilir olup olmamalarıdır. Bu özelliği yukarıdaki özellikle birlikte createStatement metoduna parametre olarak veriyoruz. Örneğin Result set üzerinde ileri geri gitmek ve istediğimiz satırı ResultSet üzerinde değiştirebilmek istiyorsak şu satırları kullanmalıyız: [java] Statement stmt = hsqldbConnecion.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATEABLE); ResultSet scrollingRS = stmt.executeQuery(“SELECT * FROM kullanicilar”); [/java] Referanslar: JDBC Hakkında Bilmediğiniz 5 Şey [ad#Yazi Ici Buyuk]