Hibernate ve Spring Data JPA arasındaki farklar

Merhaba arkadaşlar, bu yazımda Hibernate ve Spring Data JPA arasındaki temel farklılıklara değineceğim.

Konuya geçmeden önce  Hibernate, JPA ve Spring Data JPA kavramlarından bahsetmenin faydalı olacağını düşünüyorum.

JPA (Java Persistence API) nedir?

Java Persistence API herhangi bir java nesnesinin veri tabanındaki ilişkisel bir tabloya eklenebilmesini, o tablodan okunabilmesi gibi çeşitli özellikler sağlar.

Hibernate nedir?

Hibernate, Java ortamları için bir ORM (Object Relational Mapping) çözümüdür. ORM; model sınıflarımızın ilişkisel veri tabanındaki tablolarımızla eşleşebilmesini sağlayan bir programlama tekniğidir. Bir nevi uygulama ile ilişkisel bir veri tabanı arasında bir köprü olarak düşünülebilir. Hibernate, Java tabanlı bir ORM teknolojisidir.

Buraya kadar yazılanlardan yola çıkarak JPA (Java Persistence Api) ‘ın bir standart, Hibernate’in ise bir JPA uygulaması olduğunu aklımızdan çıkarmayalım.

Spring Data JPA nedir?

Spring Data; Spring kütüphanesinin bir parçasıdır.

Spring Data sanıldığı aksine Hibernate gibi bir JPA uygulaması değildir. Sadece JPA uygulamamızın en üst katmanına ekstra soyut bir katman ekleyen bir kütüphanedir.

Spring Data JPA GenericDao özel uygulamalarına bir çözüm sunar. Metot adı kuralları aracılığıyla sizin adınıza JPA sorguları oluşturabilir.

 

Buraya kadar olan kısmı toparlamak gerekirse Hibernate ile Spring Data JPA arasındaki temel farklılıklar şunlardır;

Hibernate bir JPA uygulaması iken Spring Data JPA bir veri erişimi soyutlamasıdır.

Spring Data ile Hibernate, Eclipse Link gibi herhangi bir JPA uygulamasını beraber kullanabilirsiniz. Dolayısıyla Hibernate ile Spring Data JPA bir rakip değillerdir ve aynı kapsamda değerlendirilemezler aksine birbirlerini tamamlayıcı özellikler taşırlar.

Bir dahaki yazımda görüşmek üzere, hoşçakalın…

 

 

Isolation Level nedir

Merhaba arkadaşlar. Bu yazıda size kısaca çoğu kişinin merak ettiği veri tabanı sistemlerinde kullanılan izolasyon seviyelerinden bahsedeceğim.

Bildiğiniz üzere bir veri tabanında tutarlığı korumak için dört farklı özellik bulunmaktadır. Bunlar; atomicity, consistency, isolation ve durability (Kısaca ACID diye söylenebilir). Biz burada isolation (izolasyon) kısmıyla ilgileneceğiz. İzolasyon bir işlem bütünlüğünün diğer kullanıcı ve sistemlere nasıl göründüğünü ifade eder. İzolasyon seviyesi veri tabanındaki bir işlemin başka işlemlerden nasıl izole edilmesi gerektiğini tanımlar. Kullanılacak olan izolasyon seviyesi aşağıdaki olaylar düşünülerek ve kullanılacak sistemin ihtiyaçlarına göre belirlenebilir.

Dirty Read : Adından da anlaşılacağı gibi kirli bir okumadır. Bir işlemin henüz işlenmemiş bir veriyi okuduğu durumdur. Örnek olarak elimizde T1 ve T2 diye iki işlemimiz olsun. T1 herhangi bir satırı güncelliyor fakat değişikliği onaylamadan işini bırakıyor. Bu arada T2 bu güncellenmiş veriyi okuyabiliyor. Eğer T1 bu işlemi geri alırsa T2 var olmamış veriyi okumaya devam edecektir.

Non-Repeatable Read : Yine elimizde T1 ve T2 diye iki işlemimiz olduğunu varsayalım. Örneğin T1 in bir veriyi okuduğunu varsayalım. Eş zamanlı olarak T2 de bu veriyi güncellemiş olsun. Şimdi T1 aynı verileri tekrar alırsa farklı bir değer okumuş olur.

Şimdi izolasyon seviyelerinden bahsedelim. Bilindiği üzere temelde dört adet izolasyon seviyesi bulunmaktadır.

Read Uncommitted : Read Uncommitted en düşük izolasyon seviyesidir. Adından da anlaşılacağı gibi bu seviyede bir işlem başka bir işlemin henüz onaylamadığı değişiklikleri okuyabilir. Bu sayede yukarıda bahsettiğimiz Dirty Read olayına izin verilmiş olur.

Read Committed : Bu izolasyon seviyesi okunan herhangi bir verinin okunduğunda verinin önceden işlendiğini garanti eder. Böylece Dirty Read e izin vermez.

Repeatable Read : En kısıtlayıcı izolasyon seviyesidir. Bu seviyede herhangi bir işlem referans aldığı tüm satırlarda okuma kilitlerini tutar. Diğer işlemler bu satırları okuyamayacağından, güncelleyemediğinden veya silemediğinden, böylece Non-Repeatable Read ı önlemiş olur.

Serializable : Bu en yüksek izolasyon seviyesidir. Seri hale getirilebilir bir yürütmenin serileştirilmesi garanti edilir.

 

Bu izolasyonların seviyeleri için şu en iyisidir veya şu en kötüsüdür diye bir yorumda bulunamayız. Hangisinin bizim için iyi veya kötü olduğu var olan uygulamamızın ihtiyaçlarına göre değişebilir.

Bir dahaki yazıda görüşmek üzere, hoşçakalın 🙂

JDBC – Statement ve PreparedStatement arasındaki farklar

Merhaba arkadaşlar. Bu yazımda önceden benim de çok merak ettiğim bir konu olan Statement ve PreparedStatement arasındaki farkları ve birbirlerine göre avantajlarını, dezavantajlarını anlatacağım.

Statement ve PreparedStatement ifadelerini mutlaka bir yerlerde kullanmışızdır. Özellikle herhangi bir SQL sorgusu çalıştırmak istediğimizde bu ikisinden herhangi birini kullanırız. Görünüşte hiçbir farkı olmayabilir ama arka tarafta işler farklı işliyor 🙂

Peki hangisini ne zaman hangi durumlarda kullanmak daha faydalıdır buna bakacağız.

Yazdığımız herhangi bir SQL sorgusunu Statement durumunda çalıştırdığımızı varsayalım. Bu sorgu her çalıştırıldığında veri tabanının belleğinde bu sorgunun bir örneği saklanır. Bu sorgunun binlerce kere çalıştırıldığını düşünürsek bu durum zararlı olabilir. Veri tabanı performansı düşebilir veya bağlantı kopmaları yaşanabilir. Bu durumda PreparedStatement kullanmak faydalı olabilir. Herhangi bir SQL sorgusunu PreparedStatement durumunda çalıştırdığımızı düşünelim. Böylece veri tabanında bu sorgusunun sadece bir kere örneği saklanır ve bin kere de çalıştırsak bu sorgunun veri tabanının belleğinde sadece bir örneği tutulur. Böylece PreparedStatement daha performanslı olabilir.

Tabi PreparedStatement her zaman kullanılacak diye bir şart yok. Örneğin bir uygulamamız olduğunu düşünelim ve sürekli farklı sorguların gönderildiğini düşünelim. Bu durumda Statement kullanmak daha mantıklı olabilir ama sürekli aynı sorgular üzerinde çalışıyorsak tabi ki PreparedStatement kullanmak daha akıllıca olacaktır.

Umarım sizi bu konu hakkında biraz olsun fikir sahibi yapabilmişimdir. Bir daha ki yazımda görüşmek üzere..

MySQL – Kullanıcı Yetkilendirme

Merhaba arkadaşlar. Bu yazımda veri tabanı sistemlerinde kullanılan kullanıcı yetkilendirme özelliğinden bahsedeceğim.

Bildiğiniz üzere her veri tabanı sisteminde bir ya da birden fazla kullanıcı bulunmaktadır ve her veri tabanı kullanıcısının belli yetkileri vardır. Mesela sistem admini veri tabanıyla ilgili tüm yetkilere sahipken başka bir veri tabanı kullanıcısı sadece ona verilmiş yetkileri kullanabilir.
Bu yetkiler temelde ikiye ayrılır.

Birincisi tablo şeması üzerinde sahip olunan yetkilerdir. Bu yetkilere örnek verecek olursak; tabloya yeni bir alan ekleme olabilir, alanın veri tipini değiştirmek olabilir, tablo eklemek veya silmek olabilir. Kısacası bu yetkiler sadece tablonun şeması üzerinde kullanılabilecek yetkilerdir.
İkincisi ise tablo verisi üzerinde sahip olunan yetkilerdir. Bu yetkilerin ne olduğundan bahsedecek olursak; tabloya yeni kayıt ekleme (insert), tablodaki kayıtları çekme(select), tablodaki kayıtları güncelleme(update) ve tablodaki kayıtları silme(delete) işlemlerinin hepsi bu yetkiler sayesinde yapılır.

Peki herhangi bir veri tabanı kullanıcısına nasıl yetki verilir, bundan bahsedelim.
İlk önce bir kullanıcı yaratalım.
MySQL’de kullanıcı yaratmak için CREATE USER komutunu kullanırız.

CREATE USER ‘username’@’localhost’ IDENTIFIED BY ‘password’

Kullanıcımızı yarattıktan sonra sıra geldi yetki vermeye..
MySQL’de herhangi bir kullanıcıya yetki vermek için GRANT komutunu kullanırız.

GRANT privileges ON object TO user;
privileges : kullanıcıya verilmek istenen ayrıcalıklardır.
object : veri tabanının ismi veya herhangi bir veri tabanındaki tablonun ismidir.
user : yetkilerin verileceği kullanıcıdır.

Birkaç örnek yaparsak;
GRANT ALL ON magaza TO ‘hakan’@’localhost’;
Bu sorgunun görevi; magaza veri tabanındaki tüm yetkileri hakan adlı kullanıcıya vermektedir. Tüm yetkileri verdiğimiz için kısaca ALL komutunu kullanabiliriz.

GRANT SELECT,INSERT,ALTER ON okul TO ‘zeynep’@’localhost’;
Bu sorgunun görevi ise; okul veri tabanındaki SELECT, INSERT ve ALTER yetkilerini zeynep adlı kullanıcıya vermektir.

Peki bir kullanıcının yetkilerini nasıl geri alırız bunu açıklayalım.
MySQL’de yetki geri alma işlemi REVOKE komutuyla yapılmaktadır.
REVOKE privileges ON object FROM user;

Örnek olarak birkaç sorgu yazarsak;
REVOKE DELETE,UPDATE ON magaza FROM ‘hakan’@’localhost’;
Bu sorgunun görevi; hakan adlı kullanıcıdan mağaza veri tabanı üzerindeki kayıt silme ve kayıt güncelleme yetkilerini geri almaktır.

REVOKE SELECT ON okul FROM ‘*’@’localhost’;
Bu sorgunun görevi ise; tüm kullanıcıların okul veri tabanı üzerindeki kayıt görüntüleme yetkisini geri almaktır. ‘*’ işareti tüm kullanıcıları belirtmek için kullanılmıştır.

Tabi yetkilendirme işlemleri sadece bunlarla sınırlı değildir. Yetkilendirme işlemleri fonksiyonlar, prosedürler veya triggerlar üzerinde de yapılabilir.

Trigger Kullanımı

Merhaba arkadaşlar 🙂 Bugün çoğu veri tabanı sistemlerinde kullanılan Triggerlar hakkında bilgi vereceğim.

Triggerların Türkçesi tetikleyici demektir. Yani akla ilk olarak bir şey sonucunda etkilenen manası gelmektedir. Aslında tam olarak da Triggerlar bunu sağlar.

Triggerları veri tabanlarımızda kullanmamızın ana sebebi bir yerde bir değişiklik olduğunda buna paralel olarak başka bir yerde de değişikliğin sağlanmasıdır. Mesela bir veri tabanımız var ve içinde iki tane tablo olduğunu varsayalım ve X adlı tablomuzda değişiklik yapmak istiyoruz. Bu ekleme olabilir, silme olabilir ya da güncelleme olabilir. Eğer buna bağlı olarak Y tablomuzda da değişiklik olmasını istiyorsak Triggerları kullanırız. Bu bize dinamik bir değişiklik kazandırır. Yani bir tablonun içeriğini değiştirdikten sonra başka bir tablonun içeriğini değiştirmemize gerek kalmaz bu otomatik olarak gerçekleşir.

Triggerları, programlama dillerindeki şart cümleciklerine de benzetebilirsiniz.Yani şartın sağlanması gerekir şart sağlanıyorsa eğer Trigger çalışır.

Triggerlar Insert, Delete ve Update işlemleri üzerinde çalışırlar.

Veri tabanımızda bir Trigger yaratmak için aşağıdaki yapıyı kullanırız.

PL/SQL Nedir.. Neden Kullanılır..

Merhaba arkadaşlar.. Bugün size üzerinde çalıştığım PL/SQL teknolojisini anlatmaya çalışacağım.
Belki çoğunuz bu teknoloji hakkında yeterli bilgiye sahip değildir hatta ismini duymamış olanlar bile vardır. Daha çok bu teknolojinin nedir neden kullanılır ve nerelerde rol oynar bunun üzerinde duracağım.

1-PL/SQL Nedir, Neden Kullanılır?
PL/SQL yapısal dillerin SQL’e eklenmesi sonucu oluşan Oracle’a has bir dildir. PL/SQL kullanarak her türlü SQL cümleciği yazabilirsiniz. Dinamik SQL ifadeleri oluşturup, çalıştırabilirsiniz.En önemliği özelliği de PL/SQL uygulamaları veri tabanı kısmında çalışırlar. Böylece sorguların istemciden sunucuya ya da tekrar sunucudan istemciye gitmesine gerek yoktur. Yani ağ trafiği de azalmış olur.

2-PL/SQL Yapısal Özellikler
PL/SQL, SQL cümlelerine blok yapılarının, şart cümlelerinin, döngülerin vs. diğer özelliklerin eklenmesiyle oluşmuş bir dildir. En temel yapı birimi bloktur. Bir veya birden fazla bloktan oluşabilirler. Akış kontrolü sayesinde yapısal dillere ait olan şart cümleleri ve döngüler PL/SQL bloklarında kullanılabilir. Böylece yazılan programlar çok etkin ve hızlı hale gelmektedir. Eğer bu özellik olmasaydı SQL cümlelerini ayrı ayrı yazmak ve çalıştırmak gerekecekti.Bu da performansı azaltan etkenlerden bir tanesidir.

3-Blok Yapısı
Birbirleriyle ilişkili ifadelerin mantıksal bölümlere ayrılması demektir. Değişken tanımlamaları ve hata kontrolleri de her blok içerisinde yapılabilir. PL/SQL blok yapısı üç bölümden oluşur.Bunlar;

  • Bildirim Deyimleri
  • Program Komutları (Zorunlu!)
  • Aykırı Durumlar (Exception ifadeleri)

Bu üç bölümden sadece ikincisi zorunludur. Klasik bir PL/SQL blok yapısı şu şekildedir.

Şimdi de bu ifadede geçen komutları kısaca tanıyalım.

  • DECLARE : Blok içerisinde kullanılan değişkenlerin tanımlandığı bölümdür.
  • BEGIN : Bloğun başlangıcını belirten referans isimdir
  • EXCEPTION : Aykırı durumların başlangıcını belirten rezerve isimdir. Hata durumlarında neler yapılacağını kontrol eder.
  • END : Bloğun sonunu belirten referans isimdir.

Not:Exception kısmı nesneye yönelik programlama dillerindeki try/catch’e çok benzer. Bir hata olduğunda ne yapacağını belirtir.

Örnek bir blok yapısı yapalım.