jdbc sorgusu için yayınlar alaka düzeyine göre sıralanmış olarak gösteriliyor. Tarihe göre sırala Tüm yayınları göster
jdbc sorgusu için yayınlar alaka düzeyine göre sıralanmış olarak gösteriliyor. Tarihe göre sırala Tüm yayınları göster

JDBC, Veritabanları, Classpath Falan Filan

JDBC Uygulama arabirimi (API) herhangi bir tablosal veriye, özellikle ilişkisel veritabanlarında (RDMS) veriye erişmek için kullanılan Java API'sidir. JDBC aşağıdaki üç programlama etkinliğini yöneten java uygulamaları yazmamızda yardımcı olur:
  1. Bir veritabanı bağlanma
  2. Veritabanına sorgular ve güncelleme cümleleri gönderme
  3. Sorgumuza cevap olarak gelen sonuçları alma ve işleme
Aşağıdaki basit kod parçacığı yukarıdaki üç adımı gerçekleştiren basit bir örneği göstermektedir:

// ilgili veritabanina bir baglanti yaratiyoruz
Connection con = DriverManager.getConnection("jdbc:myDriver:wombat", "myLogin","myPassword");
//sorguyu calistiracagimiz Statement yaratiyoruz 
Statement stmt = con.createStatement();
// sorguyu calistiralim, sonuclar ResultSet tipinde olacaktir
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1"); 
// elde ettigimiz sonuclari dolasip gelen her bir satirin verilerine ulasalim 
while (rs.next()) {
 int x = rs.getInt("a");
 String s = rs.getString("b");
 float f = rs.getFloat("c");
}

Bu basit kod parçacığı DriverManager yardımıyla parametrelerle belirlenmiş olan veritabanına bir bağlantı yaratıyor, bağlantı için giriş yapıyor. SQL sorgumuzu veritabanına taşıyacak olan Statement nesne örneği oluşturuyor. ResultSet nesnesini sorgumuzu çalıştırarak yaratıyor. Basit bir while döngüsü içerisinde sorgu sonuçlarını teker teker alıp işliyor.

JDBC kullanımı yukarıdaki adımlar doğrultusunda oldukça kolaydır. Bu kolaylığı çoğu kişi için zorlu bir hale getiren kısım bağlantı alma kısmıdır. Bağlantıyı sorunsuz bir şekilde aldıktan sonra bu bağlantı üzerinde Statement ve PreparedStatement kullanarak sorgu çalıştırmanın herhangi bir zorluğu yoktur.

Kullanılan veritabanına göre bağlantı alma kısmı çok az değişiklik gösterir. Bağlantısını alacağımız veritabanıyla ilgili olarak o veritabanının hangi sürücüsünü kullanacağımızı, hangi veritabanına bağlanacağımızı ve hangi kullanıcı adı ve şifresini kullanacağımızı belirtmemiz gerekir. Bu bilgileri doğru bir şekilde verdikten sonra bağlantı almada herhangi bir sorun çıkmayacaktır. Bu noktada acemi kullanıcıların en çok zorlandıkları kısım ilgili veritabanının JDBC sürücülerine ulaşmak ve bu sürücüleri kullanmaktır. Aşağıda sık kullanılan veritabanları ve ilgili JDBC sürücülerine erişmek üzere bağlantı adresleri vardır:

MySQL tarafından sunulan ve JDBC gerçekleştirimi sunan doğal Java sürücüsünün adı Connector/J'dir. Şu adresten indirilebilir.

Microsoft SQL Server için kullanılan JDBC sürücüsü adresinden indirilebilir.

Oracle için gereken JDBC sürücüleri adresinden indirilebilir

PostgreSQL için gereken JDBC sürücüleri adresinden indirilebilir.

Java DB, Java ile birlikte dağıtılan ve verileri dosya biçiminde saklayan eski adı Derby olan veritabanı, ayrıntılı bilgi için tıklayın.

Bunların dışında herhangi bir veritabanı kullanılıyorsa google arama motorunda Veritabani Yönetim Sistemi adı ile birlikte JDBC Driver anahtar kelimeleri birlikte kullanılarak ("MySQL JDBC Driver" şeklinde mesela) sürücüleri varsa erişmek mümkündür. Bu yukarıdaki sürücülere ek olarak farklı firmaların ücretli ve ücretsiz sunabildiği farklı JDBC sürücü çözümleri de vardır. Bu çözümlerden uygun olanı seçmek tamamen programcının ve firmanın tercihine kalmıştır.

Sürücünün sorunsuz elde edildiğini varsayarak, Eclipse üzerinde MySQL veritabanına bağlanan oldukça basit bir veritabanı kullanan örnek proje anlatmaya çalışayım.

Yaptığım bu örnek projede kullandığımız veritabanında Deneme isminde tek bir tablo ve bu tablonun da Saha isminde tek bir sahası var. Yazacağım oldukça basit örnek bu sahaya o anki zamanı (System.currentTimeMillis() ile alınan) yazacak ve tablodaki tüm verileri çeken bir sorgu çalıştırıp, o verileri ekrana yazacak.

Bu projenin asıl can alıcı kısmı DBConnectionManager sınıfıdır. Bu sınıf veritabanı bağlantıları için bir bağlantı havuzu oluşturmakta ve gerektikçe bu havuzdan bir bağlantıyı kullanıcının isteği doğrultusunda döndürmektedir. Bağlantı havuzu kullanımının temel gerekçesi, her seferinde bağlantı oluşturmak için gereken işlem ve bağlantı (veritabanın ağ üzerinde başka noktada olduğu durumlarda özellikle) süresini en aza indirmek için hali hazırda açık bağlantılar saklamaktır. Bu bahsedilen sınıfı İnternet üzerinden bulup, biraz değiştirirek şu anki haline getirdim. Sınıfın burada bahsedeceğim en önemli kısmı init() metodudur.

/**
* Ozellikleri yukleyip, degerleri kullanarak yeni bir nesne yaratir
*/
private void init() {
 if (dbp == null)
  dbp = DBParametersReader.readParameters();
 loadDriver(dbp);
 createPool(dbp);
}

DBParametersReader sınıfının parametre dosyasından okuduğu parametreleri yerel bir değişken olarak saklamaktadır (dbp). Daha sonra loadDriver yardımıyla kullanılacak olan sürücü yüklenmektedir. Bu sınıfın önemli bir özelliği parametre dosyasında tanımlı olan herhangi bir sürücüyü kullanabilmesidir. Bu sürücünün ilgili kütüphanesinin elbette classpathte olması gereklidir. Evet ilk defa classpath ifadesi geçti. Çoğu acemi kullanıcının bu ifadeden kaynaklı sorunlarla uğraştığını tahmin edebiliyorum. Kütüphanelerin classpathte olmasını özel olarak anlatacağım. Konumuza geri dönelim. Bu sürücü bilgisini ve parametre dosyasında diğer bilgileri kullanarak sürücü sınıfı yüklendikten sonra (loadDriver) bağlantı havuzumuz oluşturulmaktadır (createPool).

private void loadDriver(DBParameters dbp) {
 try {
  Driver driver = (Driver) Class.forName(dbp.dbDriver).newInstance();
  DriverManager.registerDriver(driver);
  log("Registered JDBC driver " + dbp.dbDriver);
 } catch (Exception e) {
  log("Can't register JDBC driver: " + dbp.dbDriver + ", Exception: " + e);
 }
}

Sürücü yükleme kodunun yaptığı işlem bağlantı almada kullanılacak olan sürücü sınıfının bulunabilmesi için sisteme kaydedilmesidir. Kaydetme işlemi tamamlandıktan sonra bağlantılar bu sürücü sınıfı yardımıyla yaratılacaktır. Bizim yazmış olduğumuz DBConnectionManager sınıfının içerisinde her ne kadar havuz oluşturabilmek için oldukça karmaşık yazılmış olsa da aşağıdaki basit kodlar yardımıyla da bağlantı alınabilmektedir. Aşağıdaki kod parçası veritabanı sürücüsünü yükleme, bağlantı yaratma, bağlantı üzerinde sorgu çalıştırma işlemlerinin oldukça kolay olduğunu gösteren bir örnektir. Örneği inceleyelim ve örnekte varolan önemli noktaları değerlendirelim:

try {
 Driver driver = (Driver) Class.forName("com.mysql.jdbc.Driver").newInstance();
 DriverManager.registerDriver(driver);
 Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/vt", "root", "tekrei");
 // veritabanina kayit ekleme
 PreparedStatement ps = con.prepareStatement("INSERT INTO Deneme (Saha) VALUES ("+System.currentTimeMillis()+")");
 ps.execute();
 //Veritabanindan kayit cekme
 ps = con.prepareStatement("SELECT * FROM Deneme");
 // cektigimiz kayitlar ResultSet nesnesi seklinde bize donuyor
 ResultSet rs = ps.executeQuery();  
 // rs nesnesinde kayitlarin hepsini dolasip
 while(rs.next()){
  // sahalari ekrana yaziyoruz
  System.out.println(rs.getString("Saha"));
 }
} catch (Exception e) {
 e.printStackTrace();
}

Sürücü yükleme Class.forName("com.mysql.jdbc.Driver").newInstance() ve DriverManager.registerDriver(driver) satırlarıyla yapılmaktadır. Bu satırların ilkinde MySQL tarafından sunulmuş olan ve sınıf yolu com.mysql.jdbc.Driver olan sürücüyü kullanacağımızı sisteme belirtmiş oluyoruz. Daha sonra sürücü hatasız bir şekilde yüklenirse (Java bildiğinizi varsayarak, hata durumunda istisna olarak yakalanacağını hatırlatmak isterim) DriverManager yardımıyla bir bağlantı yaratıyoruz (Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/vt")). Bu satırda dikkat edilmesi gereken, URL dediğimiz bilginin bağlanılacak olan veritabanına dair bilgiler içeriyor olduğudur. localhost veritabanı sunucunu, 3306 bağlantı portunu ve vt veritabanın ismini belirtmektedir. Bu URL bilgileri kullanılan JDBC sürücüsüne göre değişiklik gösterecektir. JDBC sürücüsünün nasıl belgelerinde veya rehberlerinde bu bilgileri bulmak mümkündür (Bu yazının sonuna önemli olanları eklenmiştir). Ondan sonraki satırlar sırasıyla bir SQL INSERT işlemi ve SQL SELECT işlemi çalıştırılmaktadır.

Şimdiye kadar yazdıklarımla, bazı konuların ayrıntısına girmesem de, basitçe bir MySQL veritabanına bağlanmayı rahatça yapabilirsiniz. Önerim benim aşağıda bağlantısını gönderdiğim örnek projeyi inceleyerek, oradaki, DBConnectionManager, DBParameters ve DBParametersReader sınıflarını kullanarak sadece vt.properties dosyasını değiştirerek farklı veritabanları için bağlantı havuzu destekli bir yapı kullanabilirsiniz. Bütün bu sınıfların nasıl kullanıldığına dair bilgiler yorumlar şeklinde mevcut. Yapmanız gereken projenize bu sınıfları eklemek ve vt.properties dosyasını kullandığınız veritabanı, JDBC sürücüsü bilgilerine göre değiştirmek.

Gelelim eksik kalan konulara, en azından eksik bıraktığımı düşündüğüm konulara. Kolay olandan başlayalım.

Her veritabanı sürücüsü için farklı URL ve Driver bilgilerinin olduğunu söylemiştim. vt.properties dosyasında bu farklı bilgiler kullanılmalıdır. Aşağıdaki her veritabanı türü için en temel sürücü ve URL bilgilerine örnekler göreceksiniz. Bu bilgiler yetersiz gelirse ilgili JDBC sürücüsünün rehberinden veya nasıl kullanıldığını anlatan belgelerden yararlanarak edinebilirsiniz:

MySQL zaten anlatıldı ancak temel olarak sürücü için com.mysql.jdbc.Driver sınıfı ve URL olarak jdbc:mysql://localhost:3306/vt şeklinde kullanmak gerekir. Bu URL'de değiştirmeniz gereken sadece sunucu adresi (localhost), farklı bir port kullandıysanız port (3306) ve veritabanı (vt) ismidir.

(Bununla ilgili olarak MySQL connector belgesinde "If you are going to use the driver with the JDBC DriverManager, you would use "com.mysql.jdbc.Driver" as the class that implements java.sql.Driver." şeklinde bir ifade yer alır, bu sınıfı kullanmamızın nedeni budur :D Ayrıca URL ile ilgili biçimlendirme hakkında connector belgesinden yararlanılmaktadır. Bu bilgilere hangi veritabanı için olursa olsun bir google araması, olmadı ilgili sürücü belgesi yardımıyla ulaşabilirsiniz :) Aramaya inanmalısınız ;) )

Oracle:
 Sürücü = oracle.jdbc.driver.OracleDriver
 URL = jdbc:oracle:thin:@oracle:1521:orcl

(Oracle tarafından sunulan oldukça farklı seçenekler var, bu yüzden oracle'ın bu konularla ilgili belgelerini okumak ve farklı kaynakları incelemek şarttır :D )

PostgreSQL:
 Sürücü = org.postgresql.Driver
 URL = jdbc:postgresql://host:port/database

SQL Server:
 Sürücü = com.microsoft.sqlserver.jdbc.SQLServerDriver
 URL = jdbc:sqlserver://[serverName[\instanceName][:portNumber]][;property=value[;property=value]]

Java DB:
 Sürücü: org.apache.derby.jdbc.EmbeddedDriver
 URL: jdbc:derby:[propertyList]


Bu örnekler temel olarak ilgili veritabanlarına bağlanmanıza yetecektir. Ama önerim yukarıdaki çözümlere ek olarak internet üzerinde basit aramalarla ayrıntılı yazıları incelemenizdir (Örnek arama sorguları "Oracle JDBC Example" "MySQL how to use JDBC" vb.)

Bir başka önemli konu, herkesin kafasını yeterince karıştıran bir konu. CLASSPATH nedir, nasıl ayarlanır.

CLASSPATH kavramı şu noktadan çıkmaktadır. Java ile standart olarak dağıtılmayan, Java SDK'nın bir parçası olmayan kütüphanelerin sunduğu hizmetlere ve sınıflara erişebilmek için bu kütüphaneleri Java'nın çalışma ve derleme zamanında erişilebilir kılmak gerekiyor. Bunu da bu kütüphane dosyalarını (genellikle JAR oluyor bunlar) classpath içerisine yerleştirmek veya classpath ayarlarına bu kütüphanelerin bulunduğu konumu eklemek gerekiyor.

Bunu Eclipse projesi veya Netbeans projesinde yapmak kolaydır. Örneğin proje dizininiz içerisinde bir mysql.jar dosyasını projenizin kullanabilmesi için yapmanız gereken sadece Project Properties -> Java Build Path -> Libraries sekmesinde Add Jars seçeneğiyle ilgili jarı eklemektir. Netbeans içinde böyle bir menü yardımıyla rahatça yapılacaktır.


Kullanıcıları zorlayan kısmı, herhangi bir IDE kullanmadan bu kütüphanelerin "classpath"e nasıl eklendiğidir. Bunun iki yolu vardır. Birinci yol, pek tavsiye etmediğim ama işleri oldukça kolaylaştırdığı söylenen sistem classpathine bu kütüphanelerin eklenmesidir. Windowsta mesela ortam değişkenleri arasında CLASSPATH adında bir değişken ekleyip, bu değişkenin değerini ".;C:\SurucuDizini\SurucuJari.jar" şeklinde değiştirebiliriz. Böylece classpath tanımlamış oluruz. Ancak benim önerdiğim yöntem derleme ve çalıştırma yaparken bu kendimize özel classpath bilgilerini argüman olarak komutlara eklemektir.

javac -classpath c:\SurucuDizini\SurucuJari.jar AnaProgram.java

java -classpath c:\SurucuDizini\SurucuJari.jar AnaProgram

şeklinde kullanmanızdır. Elbette bu şekilde kullandığınız zaman projelerinizi ileride dağıttığınızda bu kütüphane jarlarını da beraber dağıtmanız ve kullanıcıları classpath ayarlarından kurtarmak için ilgili betik dosyalarını (linux için sh, windows için bat dosyalarını) kullanıcılara sunmanız gereklidir. Aşağıda örnek iki betik dosyasını görebilirsiniz:

calistir.sh

#!/bin/bash

java -classpath .:kumanifest.jar:./lib/derby.jar:./lib/toplink-essentials.jar:./lib/swingx.jar:./lib/nimrodlf.jar:./lib/commons-beanutils.jar:./lib/commons-collections.jar:./lib/commons-digester.jar:./lib/commons-javaflow.jar:./lib/commons-logging.jar:./lib/GUIAraclar.jar:./lib/itext.jar:./lib/jasperreports.jar:./lib/jr-bsh-compiler.jar:./lib/mysql.jar:./lib/poi.jar net.kodveus.kumanifest.MainFrame

calistir.bat

java -classpath .;kumanifest.jar;./lib/derby.jar;./lib/toplink-essentials.jar;./lib/swingx.jar;./lib/nimrodlf.jar;./lib/commons-beanutils.jar;./lib/commons-collections.jar;./lib/commons-digester.jar;./lib/commons-javaflow.jar;./lib/commons-logging.jar;./lib/GUIAraclar.jar;./lib/itext.jar;./lib/jasperreports.jar;./lib/jr-bsh-compiler.jar;./lib/mysql.jar;./lib/poi.jar net.kodveus.kumanifest.MainFrame

Gördüğünüz gibi -classpath argümanı yardımıyla kullandığım tüm kütüphaneleri, lib dizini altında kullanıcıya sunduğum kütüphaneler bunlar, classpath içerisine eklemiş oluyorum. Ve son olarak paket bilgisiyle birlikte çalıştırılacak ana sınıfı veriyorum. Ve kullanıcının classpath ayarlamasına gerek kalmadan uygulamayı çalıştırmasını sağlamış oluyorum.

Umarım buraya kadar yazdıklarım anlaşılmaktadır. 2-3 saat sürecinde ortaya çıkarılan oldukça uzun bir yazı oldu. Anlaşılmayan, hatalı olduğunu düşündüğünüz noktaları belirtirseniz, düzeltmeleri ve açıklamaları yapmaya çalışırım.

(Biterken Radiohead - Creep akustik sürüm çalıyordu)

Örnekler

(Projeyi kullanabilmek için veritabanı yaratmanız ve içerisinde projede kullanılan bir sahalı bir tabloyu eklemeniz gereklidir. Yazı kapsamında olmadığı için nasıl yapıldığı anlatılmamıştır. MySQL Workbench veya SquirrelSQL kullanarak veritabanınıza erişip bu işlemleri kolayca yapabilirsiniz.)
Kaynaklar:

Trail: JDBC(TM) Database Access
Using JDBC with MySQL, Getting Started
SQL Tutorial
The PostgreSQL JDBC Interface
SQL Server 2005 JDBC Driver Documentation
Oracle JDBC Drivers release 11.1.0.7.0 - Production README

Using Java Database Connectivity (JDBC) with Oracle
Managing the Java classpath (Windows)
How Classes are Found
Using Java DB in Desktop Applications

JDBC Programlama için 5 Öneri

Java ile veritabanı erişimi için JDBC kullanmayı daha önce anlatmıştım. Bu anlatım yeni başlayanlar için bazı basit ve temel bilgileri içeriyordu. JDBC'yi artık sıklıkla kullandığınızı düşünelim, ve bir günlük yazısında karşılaştığım önemli önerileri paylaşalım:

1. Bağlantıları kapatın: Ne olursa olsun, hata ile karşılaşsanız bile sql bağlantılarını kapatın, kapatmayı unutmayın. Bu pratiği unuttuğunuzda programınızın hiç beklemediğiniz sorunlarla karşılaştığını görebilirsiniz. Elbette bu pratik yerine kullanılabilecek başka bir çözüm de bağlantı havuzu kullanımıdır. Böylece izin verilen bağlantı sayısını ve bunların kontrolünü sağlayabilirsiniz.

Kod Örneği:

Connection con;
try {
  con = …
} finally {
  try { if(con!=null) {con.close();}}
  catch (Exception e1) {}
}

2. Standart "Statement" yerine "PreparedStatement" kullanın: PreparedStatement kullanımı size bir çok avantaj sağlayacaktır (sağlıklı sorgular, düzenli girdi/çıktı şeklinde sorgular, başarım artışı). Bu yüzden sağlıklı bir şekilde PreparedStatement kullanmak gereklidir:

Örnek:
Statement statement = con.createStatement();
statement.executeQuery(“SELECT name FROM widgets WHERE type = ‘WidgetB’”);

Yerine:
final String widgetType = “WidgetB”;
Statement pStatement = con.prepareStatement(“SELECT name FROM widgets WHERE type = ?”);
pStatement.setString(1,widgetType);
pStatement.executeQuery();

3. Veritabanı platformu değişimlerine hazırlıklı olmak: Her zaman kullanıcıların isteği veya kendi kararınızla veritabanı değiştirebilirsiniz. Buna her zaman hazırlıklı olmanız gerekir. Yarın öbür gün MySQL kullandığınız bir program için PostgreSQL kullanmaya karar verebilirsiniz (Bkz: En sondaki yorumum)

4. Hiç bir zaman veritabanı sistemine özgü kütüphanedeki sınıfları kullanmayın: OracleCallableStatement cst = (OracleCallableStatement)conn.prepareCall şeklinde bir kullanım yaptığınızda bilin ki eğer Oracle'dan vazgeçmek zorunda kalırsanız kodu da aynı şekilde değiştirmeniz gerekecektir. Bu yüzden sadece JDBC tarafından sağlanan ve Java ile her zaman dağıtılan genel sınıfları kullanın.

5. Veritabanı stored procedure'leri kullanmayın: Yaşadığım özel sektör deneyimlerinden ve kişisel projelerimden yola çıkarak söyleyebilirim ki, en nefret ettiğim şey stored procedure kullanımıdır. Sizi veritabanı sistemine mahkum eder, değiştirmek zordur uzmanlık ister. Projenize özgü ve Java ile yapabileceğiniz hiç bir şeyi stored procedure ile yapmayın.

6. JSP içerisinde JDBC kodu kullanmayın: Bu herkesin bilmesi gereken bir şeydir. Dinamik web dosyalarınızın içerisine (PHP olsun, JDBC olsun) veritabanı sorgularını koymamak gerekir. Bunun için soyutlama yaparak başka sınıfları sorumlu tutup, işleri o sınıfta yapmanız makbul olan yoldur (Araştırınız: MVC, Üç katmanlı mimari, vb.).

Ek yorumum: Yukarıdaki zorluklardan bir kısmından kurtulmak istiyorsanız kalıcı katman kullanmaya çalışmalısınız. Başlangıç için

Java DB (Derby)

Gömülü veritabanları (Derby, HSQLDB, SQLite, Perst,....) hakkında birşeyler duymuşsunuzdur (Karşılaştırma). Java 1.6 ile birlikte kullanımları (Java DB sayesinde) kolaylaşan ve artan bu veritabanları ufak yazılımlarınızdaki küçük veritabanı ihtiyacınızı çok rahat bir şekilde karşılayacaktır. Ayrıca testlerinizi yazarken Mock (sahte) veritabanı olarak kullanabilrsiniz.

Uygun bir veritabanı yöneticisi yardımıyla daha gelişmiş (MySQL, PostgreSQL,Oracle,vb.) bir veritabanına geçmeniz (eğer standart SQL yazıyorsanız) iyice kolaylaşacaktır. Hani geçmenize bile aslında gerek olmayacaktır ya çok kullanıcılı, çok örnekli yazılımlar için bu ihtiyacınız olabilir.

Kurulum oldukça basit, sadece derby.jar dosyası olarak dağıtılan kütüphaneyi projenizin "classpath"ine eklemeniz yeterli. Daha sonra yapacaklarınız standart veritabanı bağlantısında yaptıklarınızdan farklı değil. JDBC sürücüsü olarak "org.apache.derby.jdbc.EmbeddedDriver", JDBC url'si olarak "jdbc:derby:kumanifest;create=true" kullanılmaktadır. "create=true" eklentisi eğer veritabanı yoksa yaratılmasını sağlamaktadır. Bundan sonra yapılacakların normal bir JDBC bağlantısında yapılanlardan bir farkı yoktur. Bu konuda iyi örneklerden biri şu yazıda anlatılmaktadır.

Java 6 Yenilikleri

Uzun bir aradan sonra teknik bir konuda yazmaya karar verdim. Yazacağım bu yazıda Java 6 (Kod adı Mustang :) ) ile birlikte gelen yeniliklerden kısaca bahsetmeyi düşünüyorum. Yazı kendi cümlelerimden oluşacağı gibi biraz da çeviri olacaktır.

Öncelikle başlıklar halinde Java 6 ile birlikte gelen yeni özellikleri görelim(Parantez içerisindeki JSR ifadeleri "Java Specification Request" anlamına geliyor ve ilgili özelliğin tanımlandığı belirtim dosya numarasını gösteriyor):
Genel olarak başlıkları gördükten sonra kısaca ne yenilikler getirildiğinden bahsedelim.

Web Servisleri:Web servis istemcileri geliştirmek için kullanımı kolay bir uygulama geliştirme arayüzü sunulmaktadır. (Bkz)
Betik Kullanımı:Java kodunuz içerisinde betik kodu kullanıp ikisini bir arada kullanabiliyorsunuz (Bkz). Bir çok betik dilini ekleyerek genişletebiliyorsunuz (Bkz). Bu bayağı tartışılan bir konuydu. Çoğu insan çok kolay işleri bir betik dili ile yaparak Java'ya eklemeyi önemli olarak görüyor.
JDBC 4.0: Güncel JDBC uygulama geliştirme arayüzü bu sürümle birlikte dağıtılıyor (Bkz). Daha önce bu günlükte bahsettiğim Java DB birlikte dağıtılarak gömülü veritabanı kullanımı destekleniyor (Bkz).
Yeni Masaüstü Özellikleri: Swingworker, JTable sıralama, GroupLayout ve daha fazla yeni özellik bu sürümde eklenmiştir (Bkz).
İzleme ve Yönetim: Tüm izleme ve yönetim araçları (Bkz) gereksinim durumunda eklenecek hale getirildi. Ve yeni bir araç olan jhat eklendi.
Derleyici Erişimi: Program içerisinden javac derleyicisini kontrol edebiliyorsunuz.
Eklenebilir ("pluggable") açıklayıcı bilgiler ("annotation"):Kendi açıklayıcı bilgilerinizi tanımlayarak uygulamanız içerisinde kullanıp işleyebiliyorsunuz.
Masaüstü Konuşlandırma: Swing artık daha güzel görünüp, daha hızlı çalışıyor. Çalışma zamanı ve uygulama kurulumu yenilendi.
Güvenlik: PKI, Java GSS, Kerberos ve LDAP gibi servislerle bütünleştirme desteği geldi.
Başarım ve Kalite: İstemci ve sunucuda iki basamağa kadar başarım artışı sağlandı.

Yukarıdaki özellikler genel olarak Java 6 ile gelen yenilikleri içeriyor. Özelde ne yenilikler var, onları da kod örnekleriyle bir günlük yazısından faydalanarak Türkçeleştiriyorum.

I/O'daki değişiklikler

Şifreleri ekranda göstermeden okuma: Java SE 6 ile terminalden ekranda görünmeden (özellikle şifre okumak için çok iyi) girdi alabilme özelliği sağlanmış durumda. Bunu java.io.Console ile yapabiliyorsunuz:
import java.io.Console;
...
char[] password = System.console().readPassword("password: ");
// sifreyi kullan
...
// sifreyi temizle
java.util.Arrays.fill(password, '\0');
Belirtilmesi gereken bir kaç özellik:
  • System.console() standart giriş veya standart çıkış terminal değilse null döndürür.
  • readPassword() bir dizi döndürür, böylece yukarıda gösterildiği şekilde null haline getirebilirsiniz.
  • readPassword() terminalin karakter kümesini kullanır. Bu Charset.defaultCharset() olmayabilir.
Kritik mesaj kutusu gösterimi: Windows'ta bir hata oluştuğunda ekranda kritik hata mesajı çıkabiliyor. Örneğin disket sürücüye eriştiğinizde bu hata mesajı çıkabilir ve rahatsız edici olabilir. Yeni sürümde bu önleniyor.
    new File("A:\\tmp.txt").exists();
Şeklinde bir kod çalıştığı zaman herhangi bir mesaj çıkmadan eğer A sürücüsünde disket yoksa exists() false döndürüyor.

Disk alanının bulunması: java.io.File içerisinde eklenen aşağıdaki metodlar disk alanı ile ilgili bilgiye erişmenizi sağlıyor:
Dikkat edilmesi gereken nokta bu metodların döndürdüğü değerler, yaklaşık değerlerdir. Arka plandaki işleri dikkate almamaktadırlar.

Konuyla ilgili bir kaç not:
  • getUsableSpace() sadece Microsoft Windows için quota'ları hesaba alıyor.
  • Her metod sonucu long olarak döndürüyor. Dönüş değeri erişim haklarıyla ilgili bir bilgi taşımıyor. Alana yazma izni olmayabilir.
  • 0 dönmesi disk bölümünün olmadığı veya alan olmadığı anlamına gelir.
Erişim kontrolleri:java.io.File içerisinde gelen diğer üç yeni metod erişim kontrollerini ayarlamak için kullanılabilir:
İşlemlerin başarılı olması durumunda metodlar true döndürür.

Microsoft Windows aygıtları artık dosya olarak görülmüyor: CON, NUL ve LPT gibi Windows aygıtları File.isFile() sorgusunda artık false döndürüyor.

File.toURL kullanımdan kaldırılıyor: Dosya isminden doğrudan URL oluşturmak saçma URL'lerin ortaya çıkmasına neden olabiliyor. Bu nedenle toURL metodu yerine
    URL u = File.toURI(dosyaAdi).toURL()
şeklinde bir kullanım yapılması gerekiyor.

Microsoft Windows için uzun yol ismi: Windows için artık 260 karakterlik (bu platformun sınırı) dosya yolu ismi kullanılabiliyor.

Diğer Dosya Sistemi Değişiklikleri:
  • File.length() pagefile.sys gibi özel dosyalar için 0 döndürüyor. (Bkz)
  • File.createNewFile() varolan bir dizin için yanlışlıkla IOException atarken artık false döndürüyor. (Bkz)
  • File.listFiles() bağlanmış nfs dizinleri için artık doğru sonuçlar döndürüyor. (Bkz)
  • File.deleteOnExit() yapılan dosyalar kapanma esnasında doğru çalışması için listeye atılarak çıkarken tek tek siliniyor. (Bkz)
Koleksiyonlardaki Yenilikler
jar ve zip değişiklikleri
  • Açılan jar dosyasındaki dosyaların zaman bilgisi olarak açılma zamanı yerine diğer araçlardaki gibi dosyaların zamanı kullanılmaya başlandı.
  • Açık zip dosyalarının sayısındaki 2036 üst sınırı kaldırıldı. Artık platformun destekleyebildiği sayıda zip dosyası açık olabiliyor.
  • Bir zip dosyasındaki girdi (dosya) sayısı sınırı dosyadaki girdi sayısı sahasının 2 byte olması yüzünden 64k oluyordu. Bu yüzden bu saha gözardı edilerek bu sınır kaldırıldı.
  • Microsoft Windows için uzun isimlendirme zip dosyaları için de gerçekleştirildi.
Buraya kadar yazdıklarım genel olarak yeniliklerdi. Aşağıdaki bağlantılar ve o bağlantılar içerisindeki diğer bağlantılar yardımıyla daha ayrıntılı bilgilere erişebilirsiniz.

Kaynaklar ve Ayrıntılı Bilgiler için Bağlantılar:
Java SE 6
What's New in Java SE 6.0
Java SE 6 Key Features
Java SE 6: Top Ten
Introduction to Java 6.0 New Features, Part I

Java geliştiricilerinin bilmesi gereken 10 şey

Bir yazıda bütün Java geliştiricilerinin bilmesi gereken 10 şey yazılmış. Bu tarz yazılar, 10 şey, 20 şey, hiç bir şey gibi şeyler çok çıkıyor biliyorum. Yine de paylaşmak istedim. Üzerinde tartışabiliriz, yanlarına yazdıklarımın bir kısmı kendi düşüncelerimdir.

  1. Java'nın ve Nesne Yönelimli Programlamanın hemellerini hatırlayın: Hatırlayın yerine hiç unutmayın demek daha doğru olur sanırım. Buna karşı çıkacak birini de düşünmüyorum.
  2. Teknoloji kümenizi bilin: Evet, hızlı yazılım geliştirmek, tekerleği tekrar tekrar tasarlamamak, uygun hedef uygun ortam ve teknoloji kullanabilmek için Java'yı, sanal makinelerini, farklı teknolojileri, kütüphaneleri bilmek yararlı olacaktır.
  3. Farklı J2EE anaçatıyla denemeler yapın: Spring, EJB, vb. farklı J2EE teknolojileriyle denemeler yapıp, uygun olanı seçmeniz iyi olacaktır.
  4. Bir betik dili öğrenin: Mutlaka Java içerisinde kullanabileceğiniz hatta başka zamanlarda da kullanabileceğiniz bir betik dilini öğrenin (bence Python öğrenin :D )
  5. Web servislerini nasıl geliştireceğinizi öğrenin: Web servisleri yükselen trend olduğu söylenen ve IBM, Sun gibi büyük firmalar tarafından "pompalanan" şeyler. Gerçekten iyice öğrenin, kullanım gerektiren zamanlarda kullanın.
  6. Multithread kavramlarını ve uygulamanızda ne zaman kullanmanı gerektiğini öğrenin.
  7. JDBC ve JPA ile veritabanı geliştirme: Buna açıklama gerekmez sanırım :)
  8. AJAX ve İstemci tarafında çalışan bir betik dilini (JavaScript) öğrenin.
  9. Java'nın rakiplerini öğrenin (.NET, Ruby, vb.) ve en iyi IDE hangisidir tartışmalarından uzak durun.
  10. Ant (hatta MAVEN) öğrenin, Tomcat vb. bir uygulama sunucusunu kavrayın.
Ağırlıklı olarak web tabanlı veya J2EE uygulamalar için belirlenmiş bu maddeleri dikkate almak yararlı olacaktır :)

SQuirreL SQL

Ücretli ve başarılı bir uygulama olan DbVisualizer programı Derby veritabanı için aradığımız çözümü sunuyordu ama, lisans problemi yüzünden alternatif bulmaya uğraştık. Önce Eclipse eklentisi olan "Database development" çalışma alanını kullandık. İşe yaradı, ama ancak temel işleri yapabiliyorduk.

Bugünse yeni bir yazılım buldum. SQuirreL SQL , aralarında Derby ve Informix gibi birçok JDBC uyumlu veritabanını (sürücülerini /lib klasörüne siz ekliyorsunuz) destekleyen bir SQL istemcisi.

Bu arada bu yazılımın kurulumu, Emre'nin de daha önceden yazmış olduğu izPack ile hazırlanmış.

Veritabanındaki tablolardan Java sınıfı oluşturmak

Bir ara en çok sıkıntıyı herhangi bir kalıcı katman çatısı kullanmadığım bir projede veritabanındaki tabloların veri sınıflarını yazarken yaşamıştım. Tablolar her değiştiğinde bu veri sınıflarını da değiştirmek gerekiyordu. Bu nedenle işimi kolaylaştırması amacıyla veritabanındaki tabloyu java sınıfına çeviren bir proje gerçekleştirdim. Kullanmak isteyenler için çalıştırılabilir jar ve kaynak kodlarını burada paylaşmaya karar verdim. Çalıştırmak için bağlanacağınız veritabanının jdbc sürücülerine ihtiyaç duyacaksınız. Mysql, ODBC ve Oracle sürücüleriyle çalıştırabileceğinizi düşünüyorum. Daha fazla veritabanı için DBManager sınıfını değiştirebilirsiniz.

Jar'ı sürücü ile beraber çalıştırmak için:
java -classpath surucu.jar -jar DB2POJO.jar

komutunu kullanabilirsiniz.