19 Haziran 2015 Cuma

JDBC Örnekleri - Create,Select,Drop Database İşlemleri Nasıl Yapılır?

Bu örnek yazısında sizlere, JDBC kullanarak uygulamanızda database oluşturma işleminin nasıl yapılabileceği anlatılacaktır. Herşeyden önce database ortamının düzgün bir şekilde yapılandırıldığından emin olunuz.

Yapmamız gerekenleri kısaca anlatmak gerekirse, ilk olarak programda kullanmamız için gerekli olan paketleri import etmemiz gerekmektedir.

import java.sql.*

database ile bağlantı kurabilmeniz amacıyla driver' in register işleminin tamamlanması gerekmektedir.

Driver register işleminin tamamlanmasının ardından, DriverManager.getConnection()  methodunu kullanarak database server ile uygulama arasında bir bağlantı kurulması amacıyla connection nesnesinin oluşturulması gerekmektedir.

Database server ile ile bağlantı kurulduktan sonra, database oluşturabilmek amacıyla Statement nesnesine ihtiyaç duymaktasınız. 

Bütün bu işlemleri tamamladıktan sonra ise bütün açık olan bağlantıları kapatınız.  

Yazmış olduğumuz kod çalıştırdıktan sonra bu şekilde bir çıktı alıyorsak işlemi başarılı bir şekilde gerçekleştirmiş anlamına gelmektedir. MySQL' e bağlanarak da database' in gerçekten oluşturulduğunu görebiliriz. 





Database ' i oluşturduk. Şimdi ki örnekte ise oluşturulmuş bir database' e bağlanma işlemi nasıl sağlanır onu inceleyeceğiz. Yapmamız gereken adımlar yukarı da belirtilen adımlar ile aynıdır. Burada sadece önem arz eden durum bağlanmak istediğimiz database adını DB_URL ' e eklememiz gerekmektedir.
Örneğin database adına bağlı olarak şu şekilde olabilir:


static final String DB_URL = "jdbc:mysql://localhost/Students";





Son olarak ise oluşturulmuş olan bir "database" nasıl silinir bunu yapmaya çalışacağız. Burada bir uyarı da bulunmak istiyorum. Bu son derece ciddi bir işlemdir ve bu işlem sonucunda database ile ilgili bütün verilerinizi kaybedeceğinizi aklınızdan çıkarmayınız. 
İşlem basamakları yukarı da belirtilen adımlar ile aynıdır. Burada sadece önem arz eden durum silmek istediğimiz database adını DB_URL ' e eklememiz gerekmektedir. 

17 Haziran 2015 Çarşamba

JDBC - Statement Kavramı

Database ile bağlantı sağlandıktan sonra, artık database ile etkileşime girebiliriz. Bunun için, Statement, CallableStatement, and PreparedStatement arayüzleri sizlere database üzerinde SQL sorguları çalıştırabilmeniz ve bunun sonucunda verileri alabilmeniz amacıyla gerekli methodları sunar. Bunların yanı sıra sizlere Java ve SQL veri tipleri arasında ki farklılıklar için ayrıca bir köprü ortamı da sağlar. 


Statement Nesnesi

Bu yapıyı genel database işlemleri için kullanabilirsiniz. Runtime sırasında eğer static SQL sorguları kullanıyorsanız, bu yapı size yardımcı olacaktır. Ne yazık ki, Statement arayüzü, parametre kabul etmemektedir. 

Statement Nesnesinin Oluşturulması

Bir SQL sorgusunu çalıştırmak amacıyla Statement nesnesini kullanmadan önce, Connection nesnesinin createStatement( ) methodunu kullanarak, bir tane statement nesnesi oluşturmak zorundasınız.

Statement stmt = null;
try {
   stmt = conn.createStatement( );
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}

Statement nesnesini oluşturduktan sonra, SQL sorgusunu çalıştırmak için kullanabileceğiniz 3 farklı yöntem bulunmaktadır. 

boolean execute (String SQL)ResultSet nesnesi döndürüldüğü taktirde size true değer verecektir. öteki durumda ise, false değer verecektir. 

int executeUpdate (String SQL): bu method ise size çalıştırılan SQL sorgusundan sonra kaç tane satırın bundan etkilendiği değerini verecektir. Bu methodu kullandığınız SQL sorgusundan sonra kaç tane satır etkilendiğini öğrenmek amacıyla kullanabilirsiniz. 

ResultSet executeQuery (String SQL): bu methodu sadece SQL sorgusu sonucunda bir result set bekliyorsanız kullanabilirsiniz. Örneğin SELECT sorgusunda olduğu gibi.


Statement Nesnesinin Kapatılması

Connection nesnesine ait bağlantıyı kapatmanız gerektiği gibi, aynı nedenlerden dolayı statement nesnesine ait olan bağlantıyı da kapatmanız gerekmektedir. Basit bir close() metodu bu işlemi yapacaktır. 

Eğer ilk olarak connection nesnesine ait olan bağlantıyı kapatırsanız, bu aynı zamanda statement nesnesine ait olan bağlantıyı da kapatacaktır. Yine de düzgün bir sistem olması için, siz yine de statement nesnesine ait olan bağlantıyı kendiniz kapatınız.

Statement stmt = null;
try {
   stmt = conn.createStatement( );
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   stmt.close();
}

 PreparedStatement Nesnesi

PreparedStatement arayüzü Statement arayüzünü extend eder. Bu durumda PreparedStatement arayüzüne ekstra özellikler katar.

PreparedStatement Nesnesinin Oluşturulması


PreparedStatement pstmt = null;
try {
   String SQL = "Update Employees SET age = ? WHERE id = ?";
   pstmt = conn.prepareStatement(SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}
JDBC içerisinde yer alan parametreler ? sembolü ile temsil edilir. 

setXXX() methodu ise parametre olarak gönderilecek değerleri tutar. Burada yer alan XXX ifadesi ise parametre olarak gönderilecek değerin Java' da yer alan karşılığını temsil eder. Eğer burada değeri belirlemeyi unutacak olursanız, SQLException alacaksınız. 


PreparedStatement Kapatılması

Statement nesnesinin kapattığınız gibi, burada da PreparedStatement nesnesini kapatmanız gerekmektedir. 

PreparedStatement pstmt = null;
try {
   String SQL = "Update Employees SET age = ? WHERE id = ?";
   pstmt = conn.prepareStatement(SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   pstmt.close();
}


CallableStatement Nesnesi

Connection nesnesi Statement ve PreparedStatement nesnelerini oluşturduğu gibi, aynı zamanda CallableStatement nesnesini de oluşturabilir. Bu nesneyi database içerisinde oluşturduğunuz Stored Procedure yapılarını çağırmak amacıyla kullanabilirsiniz.

CallableStatement Nesnesinin Oluşturulması

Platform fark etmeden örneğin, aşağıda ki gibi Oracle database içerisinde oluşturulmuş bir StoredProcedure yapısının çağırılması için;

CREATE OR REPLACE PROCEDURE getEmpName 
   (EMP_ID IN NUMBER, EMP_FIRST OUT VARCHAR) AS
BEGIN
   SELECT first INTO EMP_FIRST
   FROM Employees
   WHERE ID = EMP_ID;
END;

veya aşağıda ki gibi MySQL database içerisinde oluşturulmuş bir StoredProcedure 

DELIMITER $$

DROP PROCEDURE IF EXISTS `EMP`.`getEmpName` $$
CREATE PROCEDURE `EMP`.`getEmpName` 
   (IN EMP_ID INT, OUT EMP_FIRST VARCHAR(255))
BEGIN
   SELECT first INTO EMP_FIRST
   FROM Employees
   WHERE ID = EMP_ID;
END $$

DELIMITER ;
burada IN, OUT, and INOUT olmak üzere üç tür parametre vardır. PreparedStatement nesnesi sadece IN parametresi kullanmaktadır. CallableStatement nesnesi ise 3' ünü birden kullanabilmektedir. 
CallableStatement cstmt = null;
try {
   String SQL = "{call getEmpName (?, ?)}";
   cstmt = conn.prepareCall (SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}

CallableStatement Nesnesini kapatılması


Bu işleminde diğer kapatma işlemlerden bir farkı bulunmamaktadır. 

CallableStatement cstmt = null;
try {
   String SQL = "{call getEmpName (?, ?)}";
   cstmt = conn.prepareCall (SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   cstmt.close();
}

15 Haziran 2015 Pazartesi

JDBC Database Bağlantısı Nasıl Kurulur?

Uygulamanız için doğru driver' i yükledikten sonra, JDBC kullanarak database bağlantısının kurulmasına sıra geldi. Bunun için yazmanız gereken kod yapısı oldukça basittir. Yapmanız gerekenler sırasıyla,


  • JDBC paketini import etmek.
  • JDBC driver' i register etmek.
  • Database bağlantı bilgilerinin düzenlenmesi
  • Database bağlantısının kurulması için gerekli olan connection nesnesinin oluşturulması


JDBC paketini import etmek

Standart  select, insert, update, and delete işlemlerini yapabilmeniz için import edilmesi gerekenler:

import java.sql.* ;  // for standard JDBC programs
import java.math.* ; // for BigDecimal and BigInteger support

Programınız içerisinde ilk önce belirlemiş olduğunuz driver için register olmanızdır. Bunu yapmanın iki yolu bulunmaktadır.

Class.forName()

Bir driver' ı register etmek için kullanılan en genel yöntem Java' nın Class.forName method' unu kullanmaktır. 

try {
   Class.forName("oracle.jdbc.driver.OracleDriver");
}
catch(ClassNotFoundException ex) {
   System.out.println("Error: unable to load driver class!");
   System.exit(1);
}

İkinci bir diğer yöntem ise  getInstance()  methodunun kullanılmasıdır. 

getInstance methodunun kullanılması


try {
   Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
}
catch(ClassNotFoundException ex) {
   System.out.println("Error: unable to load driver class!");
   System.exit(1);
catch(IllegalAccessException ex) {
   System.out.println("Error: access problem while loading!");
   System.exit(2);
catch(InstantiationException ex) {
   System.out.println("Error: unable to instantiate driver!");
   System.exit(3);
}

Database URL Formulation

Driver register ve yüklenme işlemleri tamamlandıktan sonra sıra geldi DriverManager.getConnection() methodunu kullanarak bir database bağlantısı oluşturmaya. Bu methodun 3 farklı şekilde overload hali bulunmaktadır. 


  • getConnection(String url)
  • getConnection(String url, Properties prop)
  • getConnection(String url, String user, String password)
Yukarıda da görebileceğiniz üzere her bir yöntem bir tane database URL istemektedir. 

RDBMSJDBC driver nameURL format
MySQLcom.mysql.jdbc.Driverjdbc:mysql://hostname/ databaseName
ORACLEoracle.jdbc.driver.OracleDriverjdbc:oracle:thin:@hostname:port Number:databaseName
DB2COM.ibm.db2.jdbc.net.DB2Driverjdbc:db2:hostname:port Number/databaseName
Sybasecom.sybase.jdbc.SybDriverjdbc:sybase:Tds:hostname: port Number/databaseName

Connection nesnesinin oluşturulması

Kullanıcı adı ve şifresiyle birlikte Database URL kullanılması

getConnection methodunun en yaygın kullanımı Database URL yanında kullanıcı adı ve şifresinin de methoda parametre olarak gönderilmesidir. 

String URL = "jdbc:oracle:thin:@amrood:1521:EMP";
String USER = "username";
String PASS = "password"
Connection conn = DriverManager.getConnection(URL, USER, PASS);


JDBC bağlantısının kapatılması

İşlemlerin sonucunda, her bir database session' a ait olan bağlantıların hepsinin kapatılması gerekmektedir. Bunun için yapmanız gereken finally kod bloğu içerisinde 

conn.close();

kod satırını kullanmanız olacaktır. 

Şimdi buraya kadar anlattıklarımızı bir örnek üzerinde toparlamak gerekirse;





12 Haziran 2015 Cuma

JDBC - Temel Kavramlar

JDBC Nedir?

JDBC, Java ile programlama dili ile veritabanları arasında bağlantı kurulmasını sağlayan database bağımsız yapıda olan standart Java API' lerinden bir tanesidir. Java Database Connectivity 'nin kısaltılmış halidir. JDBC kütüphanesi aşağıda genel olarak kullanılan veritabanı işlemlerinin yapılabilmesi için API' ler barındırır. 
 
  • Veritabanı bağlantısının kurulması 
  • SQL sorgularının oluşturulması
  • Oluşturulan bu sorguların kullanılması
  • Bu sorgular sonucunda elde edilen verilerin işlenmesi
Temel olarak, JDBC veritabanı işlemlerinin düzenlenmesini sağlayan arayüzler ve sınıflar bütünüdür. 

JDBC Mimarisi

JDBC API' si iki katmanlı veya üç katmanlı olmak üzere, database işlemlerinin düzenlemesini sağlar. Genel olarak iki katmanlı mimariden meydana gelir. 
JDBC API : bu yapı uygulama ile JDBC Driver arasında bağlantı kurar. 
JDBC Driver API: bu yapı ise JDBC Manager ile Driver arasında bağlantı kurar.


JDBC API' si bir tane driver manager ve farklı database yapıları ile bağlantı kurulmasını sağlayan özel bir driver' a sahiptir. 
JDBC driver manager database' e özel doğru driver' in kullanılması garanti altına alır. Driver manager aynı anda farklı tipte veritabanı yapılarına erişim yapısına sahiptir.


JDBC kavramlarını inceleyelim

Driver Manager

Bu sınıf bir dizi database driver' ini yönetir. Java uygulamasından gelen istek bağlantılarını uygun olan database driver kullanılarak eşleştirir. 

Driver

Bu arayüz database ile olan bağlantıyı düzenler. Ancak genel olarak bakıldığında nadiren driver nesnesiyle bir iletişim kuracaksınız. Onun yerine driver manager nesnesini kullanın. 

Connection

Database ile iletişimi sağlayan metotları barındıran bir arayüz. Burada yer alan connection nesnesi "communication context" temsil eder. Temel olarak database ile olan iletişim sadece connection nesnesi aracılığıyla gerçekleşir. 

Statement

Oluşturulan SQL sorgularının database ile etkileşiminin gerçekleştirilmesi amacıyla bu arayüzü kullanırsınız. 

ResultSet

Bu nesneler statement nesnesi kullanılarak oluşturulan SQL sorgularının sonucunda geri dönen verilerin tutulmasında kullanılır. 

SQLException

Bu sınıf database işlemleri sırasında meydana gelebilecek exception durumlarının toparlanmasını sağlar.


Bu yazı boyunca JDBC denince akla gelebilecek temel kavramları anlatmaya çalıştık.




22 Mayıs 2015 Cuma

Servlet Yaşam Döngüsü

Web container servlet ' e ait olan yaşam döngüsünü düzenler. Temel olarak bir servlet' in yaşam döngüsü 5 evreden meydana gelmektedir.


  1. Servlet sınıfı yüklenir.
  2. Servlet instance oluşturulur.
  3. init methodu çağırılır.
  4. service methodu çağırılır.
  5. destroy methodu çağırılır.


Şimdi gelin tek tek bu yaşam döngüsüne ait methodları inceleyelim.

init() methodu 

Bu method sadece bir defa çağırılmak üzerine tasarlanmıştır. Servlet ilk defa oluşturulduğunda çağırılır. Herbir client isteğinde tekrar tekrar çağırılmaz. 
Normal şartlar altında bir servlet kendisiyle ilgili olan URL çağırıldığı zaman oluşturulur. Yine de bu durumu kontrol ederek, server ilk çalıştırıldığı anda servlet' in oluşturulması sağlanabilir.

service() methodu

service() methodu asıl işlemin gerçekleştirildği ana method işlevi görür. Web server, client tarafından gelen isteği yakalamak ve buna uygun olarak client' a bir cevap döndürmek için bu methodu kullanır. 

Her bir defasında web ser servlet için bir istek alır ve server bunun için yeni bir thread oluşturur ve service() methodunu çağırır. Bundan sonra service() methodu HTTP istek tipini (GET, POST, PUT, DELETE vb. )kontrol eder ve duruma uygun olarak doGet, doPost, doPut, doDelete methodlarından uygun olanlarını çağırır. 

destroy()
destroy() methodu bir servlet' in hangi yaşam döngüsünün en son evresinde çağırılır. Bu method' un servlet' e database bağlantısının kapatılması, arka plan thread' lerinin durdurulması, cookie listesinin yazılması veya diğer temizleme işlemlerinin yapılmasını sağlar. 




21 Mayıs 2015 Perşembe

Servlet Hello World Örneği

Temel anlamda bir servlet oluşturmak için gerçekleştirmeniz gereken belli adımlar bulunmaktadır. Bu adımlar genel olarak belirlendiğinden dolayı herhangi bir server için geçerlidir. Buna rağmen bir servlet örneği 3 farklı yoldan gerçekleştirilebilir. Bunlar;


  1. Servlet interface' i implement edebilir ve kullanmaya başlayabilirsiniz.
  2. GenericServlet sınıfı extend edebilir ve  kullanmaya başlayabilirsiniz.
  3. HttpServlet sınıfı extend edebilir ve  kullanmaya başlayabilirsiniz.
Tanımlanan bu 3 farklı yöntemden en yaygın olarak kullanılanı HttpServlet sınıfını kullanmaktır. Sebebi ise sizlerin kullanımı için http request' lerine özgü olarak sunulan doGet(), doPost(), doHead() metotlarını sağlamasıdır. 

Proje yapısının oluşturulması



Servlet Oluşturulması

Servlet oluşturmanın 3 farklı yolu bulunmaktadır.  Bu örnekte tanımlanan 3 farklı yöntemden en yaygın olarak kullanılanı HttpServlet sınıfını kullanılmaktadır. Sebebi ise sizlerin kullanımı için http request' lerine özgü olarak sunulan doGet(), doPost(), doHead() metotlarını sağlamasıdır. 

web.xml dosyasının (deployment descriptor)

deployment descriptor dediğimiz şey bir xml dosyasıdır. İçerisinde Web Container' in kullanabileceği servlet hakkında ki bilgilerini barındırır. Web container bu bilgileri doğal olarak bir xml dosyasından parse ederek elde eder. 
Örnek bir tane web.xml dosyası bu şekilde tanımlanabilir.




web.xml dosyası içerisinde pek çok eleman bulunabilir. Bizim yukarıda ki örnekte kullandığımız elemanları kısa olarak anlatmak gerekirse; 

<web-app> uygulamanın tamamını temsil eder. 
<servlet> <web-app> tag' inin alt elemanıdır ve uygulamadaki servlet'i temsil eder. 
<servlet-name> <servlet> tag' inin alt elemanıdır ve uygulamada ki servlet' in adını temsil eder.
<servlet-mapping> <servlet> tag' inin alt elemanıdır ve uygulamada ki servlet' in map edilmesini sağlar.
<url-pattern> <servlet-mapping> tag' inin alt elemanıdır.

web.xml içerisine tanımladığımız bu ayarlamaları yazmış olduğumuz java sınıfı içerisinde de tanımlayabiliriz. 

@WebServlet(name = "DemoServlet", description = "DemoServlet", urlPatterns = "/DemoServlet")



Sanırım temel anlamda bir Servlet tanımlanması için bu yapı uygundur. 





20 Mayıs 2015 Çarşamba

Servlet Nedir?

Java Servlet' leri Web veya Application server üzerinde çalışan ve web tarayıcısından gelen bir istek ile bir başka HTTP istemcisi ve database veya başka bir uygulama arasında duran ara bir katman olarak düşünebilir.

Servlet' leri kullanarak kullanıcılardan form verilerini toplayabilir, database veya başka bir kaynaktan topladığınız verileri düzenleyebilir ve bunları kullanarak dinamik bir web sayfası oluşturabilirsiniz.

Bilindiği gibi Java Servlet' leri temel de Common Gateway Interface (CGI) yapısını uyarlamış öteki program veya yapılarla aynı işlevi görür. Ancak iş doğrudan bu iki yapıyı kıyaslama noktasına gelince görülür ki Servlet' lerin pek çok avantajı bulunmaktadır. 


  • Servlet tarafında performans açısından gözle görülür bir üstünlük söz konusudur. 
  • Servlet' ler için herbir client isteği için ayrı bir process oluşturulması gerekmemektedir. 
  • Servlet' ler Java dili ile yazıldığından dolayı platform bağımsız olarak çalışabilmektedirler. 
  • Java Security Manager server tarafında bulunan kaynakların korunmasına yönelik bir takım kısıtlamaların kullanımına zorladığından dolayı servlet' ler için güvenli bir yapı sağlarlar dememiz sanırım yanlış olmaz. 



Servlet Mimarisi

Servlet yapısı ile neleri yapabiliriz?


  • Client tarafından gönderilen veriyi okuyabilirsiniz. Bu senaryo içerisinde bu data bir içerisinde bir HTML form bulunduran bir web sayfası veya bir applet, ya da bir HTTP programı olabilir. 
  • Client tarafından gönderilen HTTP isteklerini okuyabilirsiniz. Bu senaryo içerisinde bu içerik cookie, media type, tarayıcı tarafından tanınan başka bir sıkıştırılmış başka bir format olabilir. 
  • Kaynak ne olursa olsun, elde edilen data' yı işlebilir ve buradan bir result elde edebilirsiniz. Bu senaryo içerisinde yer alan süreç database' den sorgulama yapma, veya başka bir web service ile iletişime geçme gibi adımları içerebilir. 
  • Client' e veri gönderebilirsiniz. Bu senaryo içerisinde ki bu içerik pek çok formatta bir dosya yapısı olarak karşımıza çıkabilir. Bu dosya yapıları HTML veya XML, binary veriler gibi pek çok farklı yapıda olabilir. 


Servlet package yapısını anlayalım

Java Servlet' ler temel de iki farklı package yapısı kullanılarak oluşturabilir. Bunlar javax.servlet ve javax.servlet.http. Bu package yapıları Java EE dünyasının standart yapılarıdır.