www.fatihkabakci.com

Personal Website and Computer Science TUR EN

JDBC(JAVA VERITABANI BAGLANABILIRLIGI)

Last update: 3/24/2015 12:58:00 AM

Yazan:Fatih KABAKCI

Java bir kez yaz her yerde çalıştır(write once run anywhere) prensibini veritabanı işlemleri içinde uyarlamak için JDBC(Java Database Connectivity - Java Veritabanı Bağlanabilirliği) kavramını ortaya çıkarmıştır . JDBC, veritabanı işlemlerini platform ve üründen bağımsız olacak şekilde çalışır. Bunun anlamı, Java ile yazdığınız veritabanı kodlarının, farklı DBMS(Database Management System - Veritabanı Yönetim Sistemi) ürünlerinde de aynı şekilde çalışacağıdır. Örneğin bir MySql veritabanına bağlantı yapan Java programı ile bir Sql Server veritabanına bağlantı yapan Java programının kodları tamamen aynıdır. Tek fark programda bağlantı için kullanılan sürücüler olacaktır. Ancak kod anlamında, yazılan şey hep aynıdır.

JDBC Sürücü Tipleri

JDBC, 4 farklı sürücü tipi ile tanımlanmıştır. JDBC sürücüleri için JDBC Sürücü Tipleri adlı yazıya bakınız.

JDBC API, standart Java kütüphanesi olan java.sql dahil, J2EE uygulamalarında kullanılan javax.sql kütüphanelerinden oluşur. JDBC teknolojisi ile Java programlarınız üzerinden veritabanı işlemlerinizi kolaylıkla yapabilirsiniz. JDBC ile bir veritabanına bağlanmak, çeşitli sorgular yapmak, sorgu sonuçlarını işlemek gibi bir takım temel ifadeler temel arabirimler tarafından yürütülür. Bunlar arasında veritabanı bağlantı işlemlerinden sorumlu Connection arabirimi, sorgu ifadelerini sarmalayan(encapsulation) Statement arabirimi ve sorgu sonuçlarını işleyen ResultSet arabirimi bulunur. Yazının devamında her biri anlatılacaktır.

JDBC Veritabanı İşlemleri

JDBC API ile bir veritabanı işlemleri genel olarak aşağıdaki 5 adımdan oluşur.

1. Bağlantı oluşturmak
2. Bir sorgu ifadesi oluşturmak
3. Sorguyu çalıştırmak
4. Var ise dönen sonuçları işlemek
5. Bağlantıyı kapatmak

Not: Yukarıdaki adımların öncesinde sisteminiz üzerinde JRE, JDK olmakla birlikte bir JDBC sürücüsünün olması gerekmektedir. Projenizde sürücü konfigurasyonunu doğru yaptığınızdan emin olmak için Eclipse JDBC Sürücü Konfigurasyonu adlı yazıya bakınız.

Örnek Veritabanı AdventureWorksDW2008R2

Bir veritabanının temel kullanım amacı veri sorgulayarak dönen sonuçları analiz etmektir. Bu yazıda da örnek olarak Microsoft tarafından örnek olarak verilen AdventureWorksDB veritabanı kullanılacaktır. Bu veritabanını Microsoft' un http://msftdbprodsamples.codeplex.com/releases/view/105902 indirebilirsiniz. MySql kullananlar içinde aynı şekilde https://launchpad.net/test-db/ employees veritabanı örnek olarak kullanılabilir. Oracle, DB2, JDB gibi farklı veritabanı yönetim sistemlerini kullananlar benzer şekilde sağlayıcıların resmi sitelerinden örnek veritabanlarını(sample databases) ücretsiz olarak elde edebilirler. Bu yazıda örnek olarak Microsoft tarafındaki AdventureWorksDB veritabanı kullanılacaktır. Ancak yazının başında da değinildiği gibi, kodlar değişmeyeceğinden farklı DBMS kullanan kullanıcıların endişe etmesine gerek yoktur. Farklı DBMS bağlantıları için değişen tek şey, sürücü ve sürücü url ifadeleridir. Bu ifadeler de sağlayıcılar tarafından verilmektedir. Yazıda örnek olarak popüler veritabanları için URL bağlantı ifadeleri verilecektir.

Veritabanına Bağlanmak

JDBC ile bir veritabanı bağlantısı yapmak için somut(concrete) java.sql.DriverManager sınıfının getConnection() metotları kullanılır. Veritabanı bağlantısı yapılırken dikkat edilmesi gereken en önemli nokta, getConnection() metotuna aktarılan argüman olan, bağlantı url' idir. Bir veritabanı bağlantı ifadesi(database url), veritabanı üreticilerine göre değişen ifadelerden oluşur. Genel olarak aynı tarz verileri isteyen bu url ifadelerinin, üreticilere göre formatları farklı olabilir. Tip 4 sürücülerine ve üretici firmalara göre database url ifadeleri aşağıda verilmiştir.

Genel olarak bir JDBC connection url ifadesi, "jdbc:" ibaresi ve bağlantı için kullanılacak veritabanı teknolojisinden sonra, sunucu adı, bağlantı yapılacak veritabanı adı, portu ve ek bir takım bilgilerden oluşur. Farklı DBMS üreticilerinin tanımladıkları URL ifadeleri sıradaki ayrımda verilmektedir.

** Sql Server için -> jdbc:sqlserver://[serverName[\instanceName][:portNumber]][;property=value[;property=value]]

* Örnekler;

Tümleşik kimlik doğrulaması kullanarak yerel bilgisayar üzerinden varsayılan veritabanına bağlanmak
jdbc:sqlserver://localhost;integratedSecurity=true;

Tümleşik kimlik doğrulaması kullanarak uzak sunucu üzerindeki belirli bir veritabanına bağlanmak
jdbc:sqlserver://localhost;databaseName=AdventureWorks;integratedSecurity=true;

Tümleşik kimlik doğrulaması kullanarak uzak sunucu üzerindeki belirli bir veritabanına varsayılan port ile bağlanmak
jdbc:sqlserver://localhost:1433;databaseName=AdventureWorks;integratedSecurity=true;

Tümleşik kimlik doğrulaması kullanarak uzak sunucu üzerindeki bir veritabanına belirli bir  uygulama adı ile bağlanmak
jdbc:sqlserver://localhost;databaseName=AdventureWorks;integratedSecurity=true;applicationName=MyApp;

** My Sql için -> jdbc:mysql://[host:port],[host:port].../[database][?propertyName1][=propertyValue1][&propertyName2][=propertyValue2]

* Örnekler

Yerel sunucu 3306 port üzerinden sakila adlı veritabanına bağlanmak.
jdbc:mysql://localhost:3306/sakila?profileSQL=true

DB2 için -> jdbc:db2://[:]/

Örnekler;

Yerel sunucu 50000 nolu port üzerinden SAMPLE adlı veritabanına bağlanmak
jdbc:db2://127.0.0.1:50000/SAMPLE

** Java DB için -> jdbc:derby:[subsubprotocol:][databaseName][;attribute=value]..

Örnekler

Yerel sunucu 1527 portu üzerinden myDB adlı veritabanına me kullanıcı adı ve mine şifresiyle bağlanmak.
jdbc:derby://localhost:1527/myDB;create=true;user=me;password=mine

JDBC ile veritabanı bağlantısı için aşağıdaki örnek sınıf kullanılabilir.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * @author www.fatihkabakci.com
 */
public class TestConnection {
   public static void main(String[] args) {
      String userName = "fatih";
      String password = "1234";
      String url = "jdbc:sqlserver://127.0.0.1:1433;databaseName=AdventureWorksDW2008R2;integratedSecurity=true;";

      Connection connection = null;
      try {
         connection = DriverManager.getConnection(url, userName, password);
         System.out.println("Connected to database");
      }
      catch (SQLException e) {
         System.err.println("SQLState: " + e.getSQLState());
         System.err.println("Error Code: " + e.getErrorCode());
         System.err.println("Message: " + e.getMessage());
         e.printStackTrace(System.err);
      }
      finally {
         try {
            connection.close();
         }
         catch (SQLException e) {
            System.err.println("The connections can not be closed.");
         }
      }
   }
}

Sorgu İfadeleri Hazırlamak

Bir veritabanı bağlantısı oluşturduktan sonra yapılacak ilk şey bir sorgu ifadesi hazırlamaktır. Sorgu ifadeleri Statement olarak adlandırılır ve bu arabirim tarafından yürütülür. JDBC API içerisinde 3 farklı Statement arabirimi bulunur.

1. Statement, Klasik sorgu ifadeleri için kullanılır. DBMS, JDBC sürücüsü üzerinden bu tip bir sorgu ifadesi aldığında sorguyu derler ve çalıştırır. Kullanımı genellikle aşağıdaki gibidir.

Statement statement = connection.createStatement();

2. PreparedStatement, Optimize edilmiş sorgu ifadeleri için kullanılır. DBMS, JDBC sürücüsü üzerinden bu tip bir sorgu ifadesi aldığında, öncelikli olarak derlenip derlenmediğine bakar. Şayet derlenmiş bir sorgu ise direk çalıştırır. Aksi halde derlediği sorguyu daha sonra tekrar kullanıma hazır olarak saklar. PreparedStatement tipi sorgular, genelde sık kullanılacak sorgular için inşa edilir. Klasik Statement ile hazırlanan bir sorgu, n çalıştırmada n kez ayrı ayrı derlenecektir. Derleme yüklü veritabanı sistemlerinde gecikmeye sebep olabilir. Gecikmeyi önlemek için bu tip sorguları kullanabilirsiniz. Ancak sık kullandığınız sorgular için bunu yapmanızda fayda vardır. Aksi halde gönderilen sorgular, sisteme ek yük getiren verimsiz bir sorgu modeline dönüşebilir. Kullanımı genellikle aşağıdaki gibidir.

PreparedStatement statement = connection.prepareStatement(sql);

3. CallableStatement, veritabanında bulunan kayıtlı yordamları(stored procedure) çağırmak için kullanılan sorgu ifadesidir. Kullanımı genellikle aşağıdaki gibidir.

CallableStatement statement = connection.prepareCall(sql);

Sorguları Çalıştırmak

JDBC API içinde, bir sorgu oluşturulan ifadeler(Statement) aracılığı ile çalıştırılır. Genel olarak JDBC API içinde iki tip sorgulama mekanizması bulunur. Bunlar sırasıyla SELECT ifadeleri için kullanılan executeQuery() ve INSERT, DELETE, UPDATE ifadeleri için kullanılan executeUpdate() metotlarıdır. Özetle executeQuery() sorgu sonucunda veri elde etmek için kullanılırken, executeUpdate() ise veri manipülasyonları için kullanılır. Kullanım örnekleri aşağıdaki gibidir.

statement.executeQuery("select * from DimEmployee");

statement.executeUpdate("update DimEmployee set LastName='Kabakci' where EmployeeKey=2");

Sorgu Sonuçlarını İşlemek

Bir statement referansı ile, executeQuery() metodu ile yaptığınız sorgunun sonuçlarını ResultSet arabirimi sayesinde elde edebilirsiniz. Bir ResultSet, yaptığınız sorguların sonuçlarını sarmalayan, aynı zamanda dinamik olarak bu sonuçlar üzerinde manipülasyon yapabileceğiniz bir arabirimdir. Sorgu sonuçlarını elde ettikten sonra, getXXX() metotları metotları sayesinde veriler elde edilebilir. Her veri tipi için bir get metodu bulunur. Bu getter metotları, veritabanı tablo alan adlarının yanında, alan index değerleri ile de kullanılabilir. Örnek olarak aşağıdaki test sınıfları verilmiştir.

Vertiabanı Bağlantısı Kapatmak

Bir veritabanı bağlantısını kapatmak için basitçe Connection arabiriminin sağladığı close() metodu kullanılır.

connection.close();
System.out.println("Disconnected to database");

Statement Sorgusu Çalıştırmak

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * @author www.fatihkabakci.com
 */
public class TestStatement {
   public static void main(String[] args) {
      String userName = "fatih";
      String password = "1234";
      String url = "jdbc:sqlserver://127.0.0.1:1433;databaseName=AdventureWorksDW2008R2;integratedSecurity=true;";

      Statement statement = null;
      Connection connection = null;
      try {
         connection = DriverManager.getConnection(url, userName, password);
         System.out.println("Connected to database");
         
         statement = connection.createStatement();  
         ResultSet results = statement.executeQuery("select * from DimEmployee where EmployeeKey=2");
         while(results.next()) {
            int employeeKey = results.getInt("EmployeeKey");
            String firstName = results.getString("FirstName");
            String lastName = results.getString("LastName");
            System.out.println(employeeKey + " " + firstName + " " + lastName);
         }
         
         int numberOfRowsAffected = statement.executeUpdate("update DimEmployee set LastName='Kabakci' where EmployeeKey=2");
         System.out.println(numberOfRowsAffected + " number of rows affected");         
         
         results.close();
         statement.close();
         connection.close();
         System.out.println("Disconnected to database");
      }
      catch (SQLException e) {
         System.err.println("SQLState: " + e.getSQLState());
         System.err.println("Error Code: " + e.getErrorCode());
         System.err.println("Message: " + e.getMessage());
         e.printStackTrace(System.err);
      }
      finally {
         try {
            connection.close();
         }
         catch (SQLException e) {
            System.err.println("The connections can not be closed.");
         }
      }
   }
}

Yukarıdaki örnekte DimEmployee tablosundan EmployeeKey değeri 2 olan çalışanın verileri sorgulanmaktadır. Kayıt imleci(cursor) next() metodu ile ilerletilerek, uygun getXXX() metotları sayesinde veriler elde edilir. Veriler veritabanı alan adları kullanılarak elde edilebildiği gibi, index değerleri ile de elde edilebilir. Yukarıdaki örnek programda, ayrıca bir update sorgusu yapılarak, veritabanında etkilenen satır sayısı değeri de elde edilmiştir.

PreparedStatement Sorgusu Çalıştırmak

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * @author www.fatihkabakci.com
 */
public class TestPreparedStatement {
   public static void main(String[] args) {
      String userName = "fatih";
      String password = "1234";
      String url = "jdbc:sqlserver://127.0.0.1:1433;databaseName=AdventureWorksDW2008R2;integratedSecurity=true;";

      PreparedStatement preStatement = null;
      Connection connection = null;
      try {
         connection = DriverManager.getConnection(url, userName, password);
         System.out.println("Connected to database");

         preStatement = connection.prepareStatement("select * from DimEmployee where EmployeeKey=?");
         preStatement.setInt(1, 2);
         ResultSet results = preStatement.executeQuery();
         while (results.next()) {
            int employeeKey = results.getInt("EmployeeKey");
            String firstName = results.getString("FirstName");
            String lastName = results.getString("LastName");
            System.out.println(employeeKey + " " + firstName + " " + lastName);
         }
         
         preStatement = connection.prepareStatement("update DimEmployee set LastName='Kabakci' where FirstName=? and LastName=?");
         preStatement.setString(1, "Kevin");
         preStatement.setString(2, "Kabakci");
         int numberOfRowsAffected = preStatement.executeUpdate();
         System.out.println(numberOfRowsAffected + " number of rows affected");

         results.close();
         preStatement.close();
         connection.close();
         System.out.println("Disconnected to database");
      }
      catch (SQLException e) {
         System.err.println("SQLState: " + e.getSQLState());
         System.err.println("Error Code: " + e.getErrorCode());
         System.err.println("Message: " + e.getMessage());
         e.printStackTrace(System.err);
      }
      finally {
         try {
            connection.close();
         }
         catch (SQLException e) {
            System.err.println("The connections can not be closed.");
         }
      }
   }
}

Yukarıdaki örnekte farklı olarak, parametreler ? operatörleri ile aktarılır. uygun setXXX() metotları sayesinde, sql sorgusunun içine aktarılan argümanlar, sorgu ile tümleşik olarak veritabanına gönderilir. setXXX() metotlarının ilk parametresi, parametre indeksi olurken, ikinci parametre değeri temsil eder. Bir PreparedStatement klasik Statement dan farklı olarak oluşturulurken sorguyu parametre olarak almasıdır. Sorgu ve parametreler alındıktan sonra, void parametreleri executeQuery() çağrılmaktadır. Verilerin elde edilmesi yine aynı şekildedir.

CallableStatement Sorgusu Çalıştırmak

CallableStatement örneği için Sql Server veritabanında, EmployeeKey parametresi alarak, çalışanın adını ve soyadını döndüren bir store procedure oluşturulmuştur. sp_getEmployee adında bu prosedür aşağıda verilmektedir.

CREATE PROCEDURE sp_getEmployee
   @employeeID int,
   @firstName nvarchar(50) OUTPUT,
   @lastName nvarchar(50) OUTPUT
AS
BEGIN
   SELECT @firstName = FirstName, @LastName = LastName 
   FROM DimEmployee
   WHERE EmployeeKey = @employeeID
END

sp_getEmployee adında bu prosedürü çağıran java programı aşağıda verilmiştir.

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Types;

/**
 * @author www.fatihkabakci.com
 */
public class TestCallableStatement {
   public static void main(String[] args) {
      String userName = "fatih";
      String password = "1234";
      String url = "jdbc:sqlserver://127.0.0.1:1433;databaseName=AdventureWorksDW2008R2;integratedSecurity=true;";

      CallableStatement statement = null;
      Connection connection = null;
      try {
         connection = DriverManager.getConnection(url, userName, password);
         System.out.println("Connected to database");

         int employeeKey = 3;

         statement = connection.prepareCall("{call sp_getEmployee (?, ?, ?)}");
         statement.setInt(1, employeeKey);
         statement.registerOutParameter(2, Types.NVARCHAR);
         statement.registerOutParameter(3, Types.NVARCHAR);
         statement.execute();
         String firstName = statement.getString(2);
         String lastName = statement.getString(3);
         System.out.println(firstName + " " + lastName);

         statement.close();
         connection.close();
         System.out.println("Disconnected to database");
      }
      catch (SQLException e) {
         System.err.println("SQLState: " + e.getSQLState());
         System.err.println("Error Code: " + e.getErrorCode());
         System.err.println("Message: " + e.getMessage());
         e.printStackTrace(System.err);
      }
      finally {
         try {
            connection.close();
         }
         catch (SQLException e) {
            System.err.println("The connections can not be closed.");
         }
      }
   }
}

CallableStatement ifadelerini kullanırken dikkat edilmesi gereken bir takım işlemler bulunur. Yukarıdaki örnekte ilk olarak bir çağrılabilir ifade süslü parantezler { } içerisine alınır. İfade içerisinde, tüm kayıtlı yordam parametleri kadar(girdiler ve çıktıların tümü olmak üzere - in/out) ? karakteri eklenir. Çıktı değerleri uygun indeks sırası ile registerOutParameter() metodu tarafından kaydedilir. Çıktının tipi genel olarak Types sınıfı tarafındaki sabit üye değerleri ile belirtilir. Ardından sorgu çalıştırılarak, yine uygun indeks değerleri ile statement referansı üzerinden çıktılar elde edilir.

Transaction İşlemleri

Bazen yaptığınız işlemleri bir bütün olarak düşünerek, ya hep ya hiç kuralını uygulayabilirsiniz. Bir transaction(hareket) prosesi, bir işlem yarıda kaldığında, yapılan tüm değişikleri geri alan(rollback), işlemin tümü başarıyla tamamlandığında ancak o işlemi geçerli kılan(commit) bir mekanizmadır. JDBC veritabanı işlemlerinde sıklıkla kullanılan transaction ifadelerini kullanmaya imkan tanır. Varsayılan olarak JDBC sorguları transaction kullanmaz. Ancak setAutoCommit(false) çağrısı, bir işlem commit olana dek yapılan işlemleri veritabanına yansıtmaz. Aksi bir durumda rollback çağrısı işlemleri geri alır. Basitçe bir transaction örneği aşağıda gösterilmektedir. Örnek ayrıca ResultSet nesnesi üzerinden veri güncelleme işlemlerinin nasıl yapıldığını da gösterir.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * @author www.fatihkabakci.com
 *
 */
public class TestTransaction {
   public static void main(String[] args) {
      String userName = "fatih";
      String password = "1234";
      String url = "jdbc:sqlserver://127.0.0.1:1433;databaseName=AdventureWorksDW2008R2;integratedSecurity=true;";
      
      Connection connection = null;
      Statement statement = null;
      ResultSet rs = null;
      
      try { 
         connection = DriverManager.getConnection(url, userName, password);
         System.out.println("Connected to database");

         connection.setAutoCommit(false); // because default is true
         {
            statement = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
            rs = statement.executeQuery("select * from DimEmployee");
            
            rs.moveToInsertRow();
            rs.updateString("FirstName", "Ali");
            rs.updateString("LastName", "Veli");
            /*
             * rs.updateString(paramInt, paramString)
             * ......
             * ......
             * ......
             * 
             * */
            rs.insertRow();
         }
         connection.commit();
      }
      catch (SQLException e) {
         try {
            connection.rollback();
            System.out.println("Rollback");
         }
         catch (SQLException e1) {
            e.printStackTrace(System.err);
         }
         
         System.err.println("SQLState: " + e.getSQLState());
         System.err.println("Error Code: " + e.getErrorCode());
         System.err.println("Message: " + e.getMessage());
         e.printStackTrace(System.err);
      }finally {
         try {
            rs.close();
            statement.close();
            connection.close();
         }
         catch (SQLException e) {
            System.err.println("The connections can not be closed.");
         }
      }
   }
}

Yukarıdaki örnekte ilgili kaydı gerçekten ekleyebilmek için DimEmployee tablosuna gerekli diğer alanları da aynı şekilde eklemek gerekmektedir. Transaction' lar ile belirli bir işlem bloğunu saklayarak, bazı işlemleri geri almak isteyebilirsiniz. Bunun için SavePoint arabirimi kullanılır. İlgili örnek aşağıda verilmiştir.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Savepoint;
import java.sql.Statement;

/**
 * @author www.fatihkabakci.com
 *
 */
public class TestTransactionSavePoint {
   public static void main(String[] args) {
      String userName = "fatih";
      String password = "1234";
      String url = "jdbc:sqlserver://127.0.0.1:1433;databaseName=AdventureWorksDW2008R2;integratedSecurity=true;";
      
      Connection connection = null;
      Statement statement = null;
      ResultSet rs = null;
      
      try { 
         connection = DriverManager.getConnection(url, userName, password);
         System.out.println("Connected to database");

         connection.setAutoCommit(false); // because default is true
         {
            statement = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
            rs = statement.executeQuery("select * from ProspectiveBuyer");
            
            if(rs.next())
               // the first record will be deleted with calling commit
               rs.deleteRow();
            // save this point
            Savepoint sp1 = connection.setSavepoint("sp1_row_deleted");
            // the following record will not be deleted because rollback sp1 will be called
            if(rs.next())
               rs.deleteRow();
            
            connection.rollback(sp1);
         }
         connection.commit();
         
         rs.close();
         statement.close();
         connection.close();
      }
      catch (SQLException e) {
         try {
            connection.rollback();
            System.out.println("Rollback");
         }
         catch (SQLException e1) {
            e.printStackTrace(System.err);
         }
         
         System.err.println("SQLState: " + e.getSQLState());
         System.err.println("Error Code: " + e.getErrorCode());
         System.err.println("Message: " + e.getMessage());
         e.printStackTrace(System.err);
      }finally {
         try {
            if(rs != null)
            rs.close();
            if(statement != null)
            statement.close();
            connection.close();
         }
         catch (SQLException e) {
            System.err.println("The connections can not be closed.");
         }
      }
   }
}

Faydalı Bir Sınıf - JDB

JDBC işlemlerinizde genel olarak bir sınıf tasarlayabilir, bazı işlerinizde kolaylıkla sağlayabilirsiniz. Aşağıdaki faydalı olabilecek JDB sınıfı verilmektedir. JDB, bazı veritabanı işlemlerini genel olarak metotlar çerçevesinde sarmalayarak daha az sql cümleciği yazmanıza imkan sağlar. Ayrıca bir ResultSet referansından dinamik olarak bilgileri bir stream üzerine kaydeden, printResult() adında faydalı bir metotta içerir.

package customerDB;

import java.io.IOException;
import java.io.OutputStream;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Properties;
import java.util.Set;
import java.util.Map.Entry;

/**
 * This class processes all sql statements.
 * 
 * @author www.fatihkabakci.com
 */
public class JDB {

   private Connection        connection;
   private Statement         statement;
   private PreparedStatement preparedStatement;
   private CallableStatement callableStatement;

   public JDB() {
      this.connection = null;
      this.statement = null;
   }

   public JDB(String url, String userName, String password) throws SQLException {
      this.connection = DriverManager.getConnection(url, userName, password);
   }

   public Connection getConnection() {
      return this.connection;
   }

   public void close() throws SQLException {
      if (this.statement != null) {
         this.statement.close();
      }
      this.connection.close();
   }

   public int update(String sql) throws SQLException {
      this.statement = connection.createStatement();
      return this.statement.executeUpdate(sql);
   }

   public ResultSet query(String sql) throws SQLException {
      try {
         return this.query(sql, null);
      }
      catch (IOException e) {
         System.err.println(e.getMessage());
         return null;
      }
   }
   
   public ResultSet query(String sql, OutputStream os) throws SQLException, IOException {
      this.statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
      ResultSet resultSet = this.statement.executeQuery(sql);
      if (os != null) {
         this.printResult(resultSet, os);
      }
      // ready to first position
      resultSet.first();
      return resultSet;
   }

   public void call(String procedure, Object parameter, OutputStream os) throws SQLException, IOException {
      this.callableStatement = this.connection.prepareCall("{call " + procedure + " (?)}");
      this.callableStatement.setObject(1, parameter);
      this.callableStatement.execute();
      if (os != null) {
         ResultSet s = this.callableStatement.executeQuery();
         printResult(s, os);
      }
      else {
         this.callableStatement.executeUpdate();
      }
   }

   public void connectToDatabaseSystem(String url) {
      // CREATE DATABASE
      try {
         // String url = "jdbc:sqlserver://" + serverName + ":1433;integratedSecurity=true;";
         this.connection = DriverManager.getConnection(url);
      }
      catch (SQLException e) {
         System.err.println("SQLState: " + e.getSQLState());
         System.err.println("Error Code: " + e.getErrorCode());
         System.err.println("Message: " + e.getMessage());
         e.printStackTrace(System.err);
         return;
      }
   }

   public void disconnectFromDatabaseSystem() throws SQLException {
      this.connection.close();
      System.out.println("disconnected database system");
   }

   public void connectToDatabase(String serverName, String userName, String password, String database) throws SQLException {
      String url = "jdbc:sqlserver://" + serverName + ":1433;databaseName=" + database + ";integratedSecurity=true;";
      this.connection = DriverManager.getConnection(url, userName, password);
      System.out.println("connected database system");
   }

   public void createDatabase(String database) throws SQLException {
      // CREATE DATABASE
      this.update("create database " + database);
      System.out.println("database created");
   }

   public void dropDatabase(String database) throws SQLException {
      // DROP DATABASE
      this.update("drop database " + database);
      System.out.println("database dropped");
   }

   public void createLogin(String loginName, String password) throws SQLException {
      // create login
      String createLoginSql = "create login " + loginName + " with password='" + password + "'";
      this.update(createLoginSql);
      System.out.println("login created");
   }

   public void dropLogin(String loginName) throws SQLException {
      // drop login
      String dropLoginSql = "drop login " + loginName;
      this.update(dropLoginSql);
      System.out.println("login dropped");
   }

   public void createUserForLogin(String loginName, String userName, String database) throws SQLException {
      // create user for login
      String createUserSql = "use " + database + " create user " + userName + " for login " + loginName;
      this.update(createUserSql);
      System.out.println("user created");

      // db owner
      String grantPermissionSql = "use " + database + " exec sp_addrolemember 'db_owner', '" + userName + "'";
      this.update(grantPermissionSql);
      System.out.println("user granted");
   }

   public void dropUser(String userName) throws SQLException {
      // drop user
      String dropUserSql = "drop user " + userName;
      this.update(dropUserSql);
      System.out.println("user dropped");
   }

   public void createTable(String table, Properties fields) throws SQLException {
      // create table
      StringBuffer createTableSql = new StringBuffer("create table " + table + " (");

      Set<Entry<Object, Object>> fieldSet = fields.entrySet();
      Iterator<Entry<Object, Object>> fieldIterator = fieldSet.iterator();
      while (fieldIterator.hasNext()) {
         Entry<Object, Object> field = fieldIterator.next();
         createTableSql.append(field.getKey() + " " + field.getValue() + ",");
      }
      int length = createTableSql.length();
      // replace the last character comma with bracket
      createTableSql.replace(length - 1, length, ")");
      this.update(createTableSql.toString());
      System.out.println("table created");
   }

   public void dropTable(String table) throws SQLException {
      // drop table
      String dropTableSql = "drop table " + table;
      this.update(dropTableSql);
      System.out.println("table dropped");
   }

   public void createIndex(String index, String table, String column) throws SQLException {
      // create index
      String createIndexSql = "create unique index " + index + " on " + table + "(" + column + ")";
      this.update(createIndexSql);
      System.out.println("index created");
   }

   public void dropIndex(String index, String table) throws SQLException {
      // drop index
      String dropIndexSql = "drop index " + index + " on " + table;
      this.update(dropIndexSql);
      System.out.println("index dropped");
   }

   public void createStoreProcedure(String storeProcedure, String table, String variable, String variableType) throws SQLException {
      // create store procedure
      String createSpSql = "create procedure " + storeProcedure + " (@" + variable + " " + variableType + ") as begin declare @name varchar(50) select name from " 
      + table + " where id=@id return @name end";
      this.update(createSpSql);
      System.out.println("sp created");
   }

   public void dropStoreProcedure(String storeProcedure) throws SQLException {
      // drop store procedure
      String dropSpSql = "drop procedure " + storeProcedure;
      this.update(dropSpSql);
      System.out.println("sp dropped");
   }

   public void insertDataIntoTable(String table, Properties data) throws SQLException {
      StringBuffer insertIntoSql = new StringBuffer("insert into " + table + " (");

      // put column id&#39; s
      Set<Object> columnIds = data.keySet();
      for (Object columnId : columnIds) {
         insertIntoSql.append(columnId + ",");
      }
      int length = insertIntoSql.length();
      // replace the last character comma with bracket
      insertIntoSql.replace(length - 1, length, ")");

      // put column values
      insertIntoSql.append(" values (");
      Collection<Object> columnValues = data.values();
      for (Object columnValue : columnValues) {
         try {
            Double.valueOf((String) columnValue);
            insertIntoSql.append(columnValue + ",");
         }
         catch (NumberFormatException e) {
            insertIntoSql.append("&#39;" + columnValue + "&#39;,");
         }
      }
      // replace the last character comma with bracket
      insertIntoSql.replace(insertIntoSql.length() - 1, insertIntoSql.length(), ")");
      this.update(insertIntoSql.toString());
      System.out.println("data inserted");
   }
   
   public void deleteDataFromTable(String table, String whereField, Object whereValue) throws SQLException {
      // delete data from table
      String deleteDataSql = "delete from " + table;
      try {
         Double.valueOf(String.valueOf(whereValue));
         deleteDataSql += " where " + whereField + "=" + whereValue;
      }
      catch (NumberFormatException e) {
         deleteDataSql += " where " + whereField + "=&#39;" + whereValue + "&#39;";
      }
      this.update(deleteDataSql);
      System.out.println("data deleted");
   }
   
   public double avg(String table, String column) throws SQLException {
      ResultSet rs = this.query("select avg(" + column + ") from " + table);
      if (rs.next()) {
         return rs.getDouble(1);
      }
      return 0;
   }
   
   public double min(String table, String column) throws SQLException {
      ResultSet rs = this.query("select min(" + column + ") from " + table);
      return rs.getDouble(1);
   }
   
   public double max(String table, String column) throws SQLException {
      ResultSet rs = this.query("select max(" + column + ") from " + table);
      return rs.getDouble(1);
   }

   private static int getNumberOfColumn(ResultSet resultSet) throws SQLException {
      ResultSetMetaData metadata = resultSet.getMetaData();
      int numberOfColumn = metadata.getColumnCount();
      return numberOfColumn;
   }

   public void printResult(ResultSet resultSet, OutputStream os) throws SQLException, IOException {

      int numberOfColumn = JDB.getNumberOfColumn(resultSet);
      int rowId = 0;
      while (resultSet.next()) {
         os.write(String.valueOf(++rowId).getBytes());
         os.write("->".getBytes());
         for (int i = 1; i <= numberOfColumn; i++) {
            Object data = resultSet.getObject(i);
            os.write((data.toString() + " ").getBytes());
         }
         os.write(&#39;\n&#39;);
      }
      os.flush();
   }

   public static HashMap<Integer, ArrayList<Object>> valueOf(ResultSet resultSet) throws SQLException {
      HashMap<Integer, ArrayList<Object>> hashData = new HashMap<Integer, ArrayList<Object>>();

      int numberOfColumn = JDB.getNumberOfColumn(resultSet);
      int rowId = 0;
      while (resultSet.next()) {
         ++rowId;
         ArrayList<Object> rowData = new ArrayList<Object>();
         for (int i = 1; i <= numberOfColumn; i++) {
            Object data = resultSet.getObject(i);
            rowData.add(data);
         }
         hashData.put(rowId, rowData);
      }
      return hashData;
   }
}

printResult() Metodu

printResult(), yapılan sorgu sonucunda bilgileri dinamik olarak gösterebilen pratik bir metottur. ResultSetMetaData yardımıyla, sorgu çıktısının sahip olduğu özelliklerde elde edilir. Bunlar arasında döndürülen kolon sayısı kolaylık sağlar. İlgili metotlar ayrıca aşağıda verilmiştir.

private static int getNumberOfColumn(ResultSet resultSet) throws SQLException {
      ResultSetMetaData metadata = resultSet.getMetaData();
      int numberOfColumn = metadata.getColumnCount();
      return numberOfColumn;
   }

   public void printResult(ResultSet resultSet, OutputStream os) throws SQLException, IOException {

   int numberOfColumn = JDB.getNumberOfColumn(resultSet);
      int rowId = 0;
      while (resultSet.next()) {
         os.write(String.valueOf(++rowId).getBytes());
         os.write("->".getBytes());
         for (int i = 1; i <= numberOfColumn; i++) {
            Object data = resultSet.getObject(i);
            os.write((data.toString() + " ").getBytes());
         }
         os.write(&#39;\n&#39;);
      }
      os.flush();
   }
MemberCommentDate:
guest
Harika ve cok kullanisli elinize saglik


omer cicek

risperdal uses gruene-kehl.de risperdal yan etkileri
7/19/2016 1:37:00 AM

Name:


Question/Comment
   Please verify the image




The Topics in Computer Science

Search this site for





 

Software & Algorithms

icon

In mathematics and computer science, an algorithm is a step-by-step procedure for calculations. Algorithms are used for calculation, data processing, and automated reasoning.

Programming Languages

icon

A programming language is a formal constructed language designed to communicate instructions to a machine, particularly a computer. It can be used to create programs to control the behavior of a machine. Java,C, C++,C#

Database

icon

A database is an organized collection of data. The data are typically organized to model aspects of reality in a way that supports processes requiring information.

Hardware

icon

Computer hardware is the collection of physical elements that constitutes a computer system. Computer hardware refers to the physical parts or components of a computer such as the monitor, memory, cpu.

Web Technologies

icon

Web development is a broad term for the work involved in developing a web site for the Internet or an intranet. Html,Css,JavaScript,ASP.Net,PHP are one of the most popular technologies. J2EE,Servlet, JSP,JSF, ASP

Mobile Technologies

icon

Mobile application development is the process by which application software is developed for low-power handheld devices, such as personal digital assistants, enterprise digital assistants or mobile phones. J2ME

Network

icon

A computer network or data network is a telecommunications network that allows computers to exchange data. In computer networks, networked computing devices pass data to each other along data connections.

Operating Systems

icon

An operating system is software that manages computer hardware and software resources and provides common services for computer programs. The OS is an essential component of the system software in a computer system. Linux,Windows

Computer Science

icon

Computer science is the scientific and practical approach to computation and its applications.A computer scientist specializes in the theory of computation and the design of computational systems.