1. Giriş
Bu belgenin PDF dosyası |BURADA|| adresinde mevcuttur.
Bu belgedeki örnekler |BURADA| adresinde mevcuttur.
1.1. Contenu
Bu belgede, bir veritabanının farklı işletim yapılarını incelemeyi amaçlıyoruz. Aşağıdaki katmanlı mimariyi ele alalım:
![]() |
Yürütme akışı soldan sağa doğru ilerler:
- İlk olarak [ui] (Use Interface) katmanındaki sınıflardan biri yürütülür. Bu sınıf, [metier] ve [dao] katmanlarını örneklendirir. [ui] katmanı bir grafik arayüz ise, daha sonra kullanıcının eylemlerini bekler. Kullanıcının bir eylemi, mimarinin tüm katmanlarında veritabanına kadar yöntemlerin yürütülmesine neden olabilir. Bu yürütmelerin sonucu, bir şekilde kullanıcıya sunulur;
Farklı katmanların rolleri şu şekilde olabilir:
- [JDBC] katmanı (Java DataBase Connectivity), veritabanlarına evrensel erişim arayüzüdür. [DAO] katmanına her zaman aynı arayüzü sunar. SGBD değiştirilirse, sadece JDBC sürücüsünü değiştirmek yeterlidir. Belirli kurallara uyulduğu takdirde [DAO] katmanı değişmez. Ancak, SGBD arasında %100 taşınabilirliği sağlamak zordur; çünkü bunlar genellikle SQL'in önemli bir kısmını içerir ve bu kısım, genellikle performans artışı sağladığı için göz ardı edilmesi zordur. Özel SQL kullanıldığı anda, SGBD ile taşınabilirlik artık mümkün olmaz. Ayrıca, SGBD'lerde genellikle birincil anahtarların otomatik olarak oluşturulmasına ilişkin farklı politikalar ve yer yer farklılık gösteren ayrılmış kelimeler bulunur. Bu belgede, her biri için ayrı bir yapılandırma projesi olacağını kabul ederek, incelenen JDBC mimarisini altı farklı SGBD'e taşımayı başardık;
- [DAO] katmanı, kullanılan belirli veritabanındaki verilere erişim arayüzü sunar (tüm SGBD'ler için geçerli yöntemleri sunan JDBC arayüzünden ayırt edilmelidir);
- [métier] katmanı, uygulamanın yönetim kurallarını veya iş kurallarını uygular.
- Giriş verileri olarak, [dao] katmanı aracılığıyla veritabanından gelen verileri ve/veya [ui] katmanı tarafından kendisine iletilen kullanıcı verilerini kullanır;
- bu katman, ürettiği verileri [dao] katmanı aracılığıyla veritabanına kaydedebilir ve/veya kullanıcıya görüntülenmesi için kendisini sorgulayan [ui] katmanına geri gönderebilir;
- [ui] katmanı, kullanıcının eylemlerini gerçekleştiren ve bunların sonuçlarını kullanıcıya geri döndüren katmandır;
Yukarıda, [DAO] katmanı, SGBD'te yürütülmek üzere SQL isteklerini [JDBC] katmanına gönderir. Son birkaç yıldır (2006) bu mimari şu şekilde gelişebilir:
![]() |
Artık JPA katmanı (Java Persistence API), SQL isteklerini JDBC katmanına gönderiyor ve sonuçları bu katmandan alıyor. [JPA] katmanı, [DAO] katmanına nesneleri kalıcı hale getirme, değiştirme, silme ve alma işlemlerini sunar. [DAO] katmanı artık SQL komutları göndermemektedir. Bu yaklaşım, JPA uygulamalarının SGBD ile arasındaki farkları yönetmesi nedeniyle daha taşınabilirdir, ancak JDBC teknolojisinden daha yavaştır. Bunu göstermek için performans testleri yapacağız. JPA teknolojisi, yıllar önce Hibernate [http://hibernate.org/] çerçevesinin yaptığı işi resmileştirir.
Aşağıdaki iki mimariden birine sahip iki katmanı inceleyeceğiz:
![]() |
![]() |
[DAO1] ve [DAO2] katmanlarının aynı [IDAO] arayüzünü uygulaması zorunlu kılınacaktır. Ayrıca, [JUnitTestsDao] testi her iki yapılandırma için de aynı olacak ve performansları karşılaştırmamızı sağlayacaktır. [DAO1] katmanı Spring JDBC ile, [DAO2] katmanı ise Spring JPA ile uygulanacaktır;
Bunu yaptıktan sonra, [IDAO] arayüzünü web üzerinde şu şekilde sunacağız:
![]() |
- [1]'te, [IDAO] katmanı, Spring MVC tarafından uygulanan [2] web katmanı aracılığıyla web üzerinde sunulmaktadır. Aslında ortaya konan arayüz [IDAO]'tir ve bu arayüzün [DAO-JDBC] veya [DAO-JPA-JDBC] mimarisiyle uygulanmasına bağlı olarak web hizmetinin iki sürümünü oluşturacağız;
- [B]'te, bir uzak istemci, web hizmeti tarafından sunulan ve [IDAO-serveur] katmanındaki yöntemlere erişim sağlayan URL'leri kullanır. [DAO-Client] ve [3] katmanlarının, [IDAO-serveur] ve [1] arayüzlerini uygulamasını sağlayacağız. Bu sayede, daha önce iki kez kullanılmış olan [JUnitTestsDao] testini [4] olarak kullanabileceğiz;
- [3]'te, [DAO-client] katmanı Spring ile RestTemplate olarak uygulanacaktır;
Bu işlem tamamlandıktan sonra, web hizmetine erişimi güvenli hale getireceğiz:
![]() |
- [5]'te, istemcinin HTTP isteği, Spring Security ile uygulanan bir kimlik doğrulama katmanından geçer;
Bu işlem tamamlandıktan sonra, önceki mimariyi aşağıdaki gibi güncelleyeceğiz:
![]() |
- [3]'te, istemci uygulaması kendisi bir web uygulamasıdır. Bu uygulama, güvenli web hizmetinin URL'lerini sorgulamaya olanak tanıyan bir [5] formu sunacaktır. Güvenli web hizmetine HTTP erişimleri, JavaScript ile uygulanan bir [DAO-client-js] katmanı aracılığıyla gerçekleştirilecektir. Bu mimari, "etki alanları arası istekler" olarak adlandırılan mekanizmayı kullanır:
- [2] web hizmeti, [http://machine1:port1/] biçimindeki URL'leri sunar;
- [3] adlı istemci web uygulaması, URL [http://machine2:port2/] adresinden indirilir. Eğer [http://machine2:port2/], [http://machine1:port1/] ile aynı değilse (aynı makine, aynı bağlantı noktası), o zaman istemci tarayıcısı, [DAO-client-js] katmanından gelen HTTP çağrılarını engelleyecektir. Bu sorunu gidermek için web hizmetinin etki alanları arası istekleri izin vermesi gerekir. Bunun nasıl yapılacağını göreceğiz;
Sunulan projeler, aşağıdaki altı SGBD sürümüyle test edilmiştir:
- MySQL 5 Community Edition;
- SQL Server 2014 Express;
- PostgreSQL 9.4;
- Oracle Express 11g sürüm 2;
- IBM DB2 Express-C 10.5;
- Firebird 2.5.4;
Bu SGBD'lerin her biri için dört farklı [DAO] katmanı geliştirilmiştir:
- Spring ile uygulanan bir katman JDBC;
- Spring JPA ve Hibernate JPA sağlayıcısı ile uygulanan bir katman;
- Spring JPA ve JPA EclipseLink sağlayıcısı ile uygulanan bir katman;
- Spring ile uygulanan bir katman: JPA ve sağlayıcı JPA OpenJPA;
Dolayısıyla burada yirmi dört farklı yapılandırma sunulmaktadır. Faktörleştirme konusunda büyük çaba sarf ettik:
- kodun büyük bir kısmı yalnızca bir kez yazılmıştır. Bu yapı, iki Maven yapılandırma projesine dayanmaktadır:
- biri JDBC katmanını yapılandırır;
- diğeri ise JPA katmanını yapılandırır;
![]() |
![]() |
Belirli bir SGBD'in JDBC [1] katmanını yapılandıran Maven projesi iki adımdan oluşur:
- JDBC sürücü arşivini içe aktarmak;
- kullanılan veritabanına erişim kimlik bilgilerini ve [DAO1] katmanının JDBC sürücüsüne göndereceği çeşitli SQL komutlarını tanımlamak. SQL standartlaştırılmış olsa da, esas olarak sorgularda bulunan ve bazı SGBD'lerde yasaklanmış anahtar kelimeler olduğu ortaya çıkan tablo/sütun adları nedeniyle taşınabilirlik sorunları yaşandı (DB2 için ROLES tablosu, Firebird için PASSWORD sütunu). Ayrıca, bir sütun adı normalde büyük/küçük harf duyarlı olmasa da, PostgreSQL'te tabloların birincil anahtarındaki ID sütunuyla ilgili bir sorunla karşılaştık. Sistem, bu sütunun adının küçük harflerle id olarak yazılmasını istedi. İşte bunlar tipik olarak beklenmedik taşınabilirlik sorunlarıdır;
Belirli bir SGBD'in JPA ve [2] katmanlarını yapılandıran üç Maven projesi de iki adımdan oluşur:
- JPA uygulama arşivini içe aktarmak;
- bağlı olan belirli SGBD için kullanılan JPA uygulamasını yapılandırmak. Aslında, SQL komutlarını JDBC katmanına gönderen, JPA katmanıdır. Etkili olabilmesi için, SGBD'i tanımalı ve ona tanıyacağı SQL komutlarını göndermelidir. Bu komutlar, bu SGBD'in sahibi olan SQL'i ve bunun özel özelliklerini (veri türleri, diziler, tetikleyiciler, prosedürler, birincil anahtarların otomatik oluşturulması vb.) kullanabilir;
Böylece, veritabanını kullanan diğer tüm projelerin dayandırılacağı yirmi dört Maven yapılandırma projesi (4 yapılandırma x 6 SGBD) elde edilir. Yukarıdaki şemalarda, [DAO1] ve [DAO2] katmanları aynı arayüzü sunduğundan, yukarıdaki iki mimarinin 24 yapılandırması tek bir [JUnitTestsDao] test sınıfı ile test edilecektir. Bu mimariler doğrulandıktan sonra, artık herhangi bir zorluk kalmaz:
- veritabanını web üzerinde yayınlamaya yönelik Maven projesi bu iki mimariye dayanmaktadır. Dolayısıyla burada da 24 olası yapılandırma bulunmaktadır;
- web hizmetine erişimi güvenli hale getirme amaçlı Maven projesi, önceki projeye dayanmaktadır ve bu projede de 24 olası yapılandırma bulunmaktadır;
- son olarak, güvenli web hizmetine etki alanları arası istekleri mümkün kılan Maven projesi, önceki projeye dayanmaktadır ve bu projede de 24 olası yapılandırma bulunmaktadır;
Çalışma, SGBD, MySQL5 ve JPA Hibernate uygulamalarıyla gerçekleştirilmiştir. Ardından, JPA Eclipselink ve OpenJPA uygulamalarına taşıma işlemi gerçekleştirilir. Ardından diğer veritabanlarına (PostgresQL, Oracle; SQL, Server; DB2, Firebird) taşıma işlemi gerçekleştirilir.
Bu ders yeni başlayanlara yöneliktir. Kullanılan kavramların büyük bir kısmı açıklanmaktadır. Veritabanı programlama veya web programlama bilgisi gerekli değildir. Ancak, kullanılan SQL sorguları açıklanmadığından, SQL diline ilişkin sağlam bir bilgi birikimi gereklidir.
Örnekleri anlamak için, herhangi bir Java giriş dersinde bulunabilecek temel Java bilgisi gereklidir. [Introduction au langage Java] belgesinin ilk iki bölümü bu amaç için yeterlidir. Bu eski bir belgedir (1998, 2002'de revize edilmiştir) ancak temel bilgiler burada mevcuttur. Kapsamlı bir ders için Jean-Marie Doudoux'un [http://www.jmdoudoux.fr/java] adlı kapsamlı kitabını okuyabilirsiniz.
Bu belge hiçbir şekilde kapsamlı değildir. Yalnızca benzer bağlamlarda yeniden kullanılabilecek bir metodoloji ve kodlar sunmak amacıyla hazırlanmıştır. Belge, el altında bir bilgisayar olmadan da okunabilecek şekilde yazılmıştır. Bu nedenle, çok sayıda ekran görüntüsü verilmiştir.
Bu belge, Java dilinin tüm özelliklerini veya uygulama alanlarını kapsamasa da, dil öğrenimi için bir kaynak olarak kullanılabilir. Bu belgeyi baştan sona takip etmeseniz bile, yeni başlayan okuyucular hem dilin kullanımı hem de Spring çerçevesinin kullanımı konusunda “ileri düzey Java” seviyesine ulaşacaktır. Ardından, aşağıdaki kitaplarla Java eğitimine devam edebilirler:
- [Örnekler Aracılığıyla Spring MVC ve Thymeleaf'e Giriş (2015)], Spring ekosistemine ilişkin öğrenmeyi, 'web programlama MVC' dalını tanıtarak sürdürür;
- [Bir istemci/sunucu örneği - AngularJS 1.x / Spring 4 (2014)], istemcinin [AngularJS] çerçevesiyle, sunucunun ise [Spring MVC] çerçevesiyle uygulandığı bir istemci/sunucu web mimarisini sunar;
- [NetBeans IDE ve GlassFish uygulama sunucusu ile Java EE'ye giriş (2012)], Spring dünyasından ayrılıp JSF (Java Server Faces) ve EJB (Enterprise Java Bean) tabanlı bir web mimarisine geçmektedir;
- [Android Studio ile Android tablet programlamaya giriş (2016)]; bu, istemcinin bir Android tablet, sunucunun ise Spring ile uygulanan bir web hizmeti olduğu bir istemci/sunucu mimarisini tanımlamaktadır MVC;
1.2. Sources
Bu belgenin iki ana kaynağı vardır:
- [ref1] : [Örnekler Aracılığıyla Spring MVC ve Thymeleaf'e Giriş (2015)]'e kadar. Bu belge, [ref1]'te yapılan ve sunulan çalışmayı başka bir veritabanı kullanarak yeniden ele almaktadır. Basitçe söylemek gerekirse, bu belge, çalışmayı Spring ile web programlama bağlamından (MVC) çıkarmaktadır. [ref1]'te bir veritabanını web üzerinde sunmak için kullanılan kodların ve metodolojinin yeniden kullanılabilir olduğunu fark ettiğim için, bunları ayrı bir belge haline getirmeye karar verdim;
- [ref2] : [Uygulamalı Java 5 Kalıcılığı (2007)];
Spring hakkında daha ayrıntılı bilgi edinmek için aşağıdaki kaynaklara başvurabilirsiniz:
- Spring çerçevesinin referans belgesi [http://docs.spring.io/spring/docs/current/spring-framework-reference/pdf/spring-framework-reference.pdf];
- URL ve [http://spring.io/guides] adreslerinde çok sayıda Spring öğreticisi bulunabilir;
- Spring'e adanmış [developpez.com] sitesi [http://spring.developpez.com/];
- [http://www.tutorialspoint.com/spring/spring_tutorial.pdf] başlıklı öğretici;
SQL konusunda yeterli bilgisi olmayan okuyucular, [Introduction au langage SQL avec le SGBD Firebird] adlı kitapla URL [Firebird veritabanı yönetim sistemi ile SQL diline giriş (2006)] adresinde temel bilgileri edinebilirler.
1.3. Kullanılan araçlar
Aşağıdaki örnekler şu ortamda test edilmiştir:
- 64 bit Windows 8.1 Pro işletim sistemli bilgisayar;
- JDK 1.8 (paragraf 23.1);
- IDE Spring Tool Suite 3.6.3 (paragraf 1);
- Chrome tarayıcısı (diğer tarayıcılar kullanılmamıştır);
- Chrome eklentisi [Advanced Rest Client] (paragraf 1);
- SGBD MySQL 5.6 Community Edition (paragraf 23.4);
- SGBD SQL Server 2014 Express (paragraf 23.9);
- SGBD PostgreSQL 9.4 (paragraf 23.7);
- SGBD Oracle Express 11g sürüm 2 (paragraf 23.6);
- SGBD IBM DB2 Express-C 10.5 (paragraf 23.8);
- SGBD Firebird 2.5.4 (paragraf 23.10);
- EMS Manager'ın altı SGBD istemcisi (paragraf 23.5);
JDK 1.8 sürümüne dikkat edin. Vaka çalışmasından birinde Java 8'in [java.lang] paketindeki bir yöntem kullanılmaktadır.
Örneklerin çoğu, IDE Eclipse, IntellijIDEA ve NetBeans ile aynı şekilde açılabilen Maven projeleridir. Aşağıdaki ekran görüntüleri, Eclipse'in bir türü olan IDE Spring Tool Suite'ten alınmıştır.
1.4. Örnekler
Örnekler, indirilebilir bir dosya olarak URL [http://tahe.developpez.com/java/spring-database] adresinde mevcuttur.
![]() |
- [1]'te örnek dosyalar;
- [2] dosyasına dönüştürülür; [spring-core] klasörü Spring öğrenme projelerini içerir;
- [3] dosyasında, [spring-database-config] klasörü altı veritabanına ait JDBC ve JPA yapılandırma projelerini içerir;
![]() |
- [4] içinde, SGBD Oracle yapılandırması bulunur. Burada üç klasör vardır:
- [databases], belge tarafından kullanılan iki veritabanını oluşturmaya yarayan SQL komut dosyalarını içerir;
- [jdbc-driver], Oracle sürücüsü JDBC'i ve bunun yerel Maven deposuna kurulması için bir komut dosyasını içerir;
- [eclipse], [5]’i de içeren dört Oracle yapılandırma projesini barındırır:
- [oracle-config-jdbc], SGBD'e erişim katmanını (JDBC) yapılandırır;
- [oracle-config-jpa-hibernate], JPA katmanını, SGBD'e erişim için JPA Hibernate sağlayıcısıyla yapılandırır;
- [oracle-config-jpa-eclipselink], SGBD'e erişim için JPA katmanını, JPA Eclipselink sağlayıcısıyla yapılandırır;
- [oracle-config-jpa-openjpa], JPA erişim katmanını SGBD'e JPA OpenJPA sağlayıcısıyla yapılandırır;
- [6]'te, [eclipse config / launch configurations] dosyası, kullanıcının Eclipse'e içe aktarabileceği ve daha sonra kendi ortamına uyarlayabileceği çalışma yapılandırmalarını içerir;
![]() |
- [7]'te, [spring-database-generic] klasörü, altı SGBD ve üç JPA sağlayıcısında ortak olan SGBD'e erişim kodunun tamamını içerir;
- [8]'te, [spring-jdbc], API, JDBC ve Spring JDBC'i içeren dört proje barındırır;
- [9]'te, [spring-jpa / spring-jpa-generic], bir veritabanına erişmek için JPA katmanını kullanan projedir. [generic-create-db*] projeleri, JPA projeleri olup, JPA katmanı tarafından kullanılan veritabanlarının oluşturulmasını sağlar;
![]() |
-
[10]'te, [spring-webjson] klasörü, veritabanını web üzerinde sunan projeleri içerir;
- [spring-webjson-server-jdbc-generic], Spring JDBC ile erişilen veritabanını web üzerinde sunan web hizmetidir;
- [spring-webjson-server-jpa-generic], Spring JPA ile erişilen veritabanını sunan web hizmetidir;
- [spring-webjson-client-generic], yukarıdaki iki web hizmetine erişim sağlayan tek istemcidir;
-
[11]'te, [spring-security] klasörü, veritabanını güvenli erişimle web üzerinde sunan projeleri içerir;
- [spring-security-server-jdbc-generic], Spring JDBC ile erişilen veritabanını sunan güvenli web hizmetidir;
- [spring-security-server-jpa-generic], Spring JPA ile erişilen veritabanını sunan güvenli web hizmetidir;
- [spring-security-client-generic], yukarıdaki iki güvenli web hizmetine erişim sağlayan tek istemcidir;
-
[12] içinde yer alan [spring-cors] klasörü, bir tarayıcının JavaScript kodundan gelenler gibi etki alanları arası erişime izin veren güvenli erişimle veritabanını web üzerinde sunan projeleri içerir;
- [spring-cors-server-jdbc-generic], etki alanları arası erişime izin veren ve Spring JDBC ile erişilen veritabanını sunan güvenli web hizmetidir;
- [spring-cors-server-jpa-generic], etki alanları arası erişime izin veren ve Spring JPA ile erişilen veritabanını sunan güvenli web hizmetidir;
- [spring-cors-client-generic], önceki iki web hizmetine sorgu göndermek için kullanılan bir web uygulamasıdır;












