15 Haziran 2016 Çarşamba

Mybatis -Custom Query

Mybatis, veri tabanı sorgulama işlemini java class'ları yardımı ile çok kolay kılsa da bütün sorgulama işlemlerini bu şekilde yapamayacağımızı bilmemiz gerekir. Örneğin iki farklı tablo arasında join sorgu yapmak istediğinizde ya da en basit bir işlemi yapmak istediğinizde bunu java kodu ile yapmak mümkün olmayacaktır. Bu durumlarda custom query olarak adlandırılan sorgu yönteminden faydalanacağız. Şöyle ki sorgularımız <name>sqlmap.xml  olan xml dosyaları içerisine yazılacak. Sorgu sonucu dönecek verinin modelini ya da sorguya gidecek parametreleri yine uygun syntax kuralları ile sqlmap dosyasına eklemeliyiz. Örnek ile anlatırsam daha iyi anlaşılacaktır. Örnekte CUSTOMER isimli müşteri bilgilerini içeren bir tablomuz olsun ve yine bu müşterilerin adres bilgisi için ADDRESS isimli adres verileri içeren bir tablomuz olsun.

CUSTOMER



ADDRESS



Bir müşterinin adres bilgisi yukarıdan da anlaşılacağı gibi ADDRESS_OID verisi ile ADDRESS tablosu ile ilişkili bir şekilde tutuluyor. Yazacağımız sorgu da hem müşterinin isim, soyisim verisini hem de adresinin il, ilçe bilgisini dönmesini amaçlayalım. Bu durumda bizim ihtiyacımız olan sorgu join şeklinde olmalı. Sorguyu aşağıdaki şekilde yazabiliriz.



Yukarıdaki sorgu bizim işimizi görecektir ve tek sorunumuz bunu mybatis'te nasıl gerçekleştireceğimizdir. Öncelikle ben CUSTOMER tablosu önceki yazılarımda anlattığım tablo ve bu tablo üzerinde ufak değişiklikler yaptığım için tekrar generate ettim. Yeni oluşturduğum ADDRESS tablosu için generate işlemini gerçekleştirdim. Önceki yazılarımda nasıl generate yapılacağından bahsetmiştim. Yine de örnek görüntüyü paylaşıyorum.



Yukarıdaki gibi generatorConfig.xml dosyasına ADDRESS tablosunu ekledim(sondan bir önceki satır). CUSTOMER tablosunu önceden generate ettiğim için comment içine alarak tekrar generate edilmesini engelledim. Tekrar generate edilse de bir sorun teşkil etmeyecekti fakat tekrar generate'e gerek yok. Generate işlemini runGenerator.xml dosyasını Build > Ant Build yaparak generate ediyoruz. Şimdi sorguya odaklanarak sorgu sonucunda hangi kolonlar dönecek ve bu kolonları nasıl karşılayacağımızı belirleyelim. Dönen verileri karşılayacak yeni bir model class'ı oluşturmak işimizi görecektir.



Kolonları karşılayacak propertyleri ve bunların Setter ve Getter'larını tanımlıyoruz.



Yukarıda gördüğümüz class bizim sorgu sonucu dönen verilerin objesi olacaktır. Bu şekilde veritabanı verilerini rahatlıkla yönetebileceğiz. İşin detay ve önemli noktası olan yer sorguyu ekleme adımına geldik. Dilersek bu sorgu Customer_sqlMap.xml ya da Address_sqlMap.xml içine konulabilir. Hangisi mantıklı geliyorsa o sqlMap seçilir. Ben Customer_sqlMap.xml dosyası içine sorgumu yerleştireceğim.



Yukarıda gördüğüz gibi iki yapı bulunmakta. Biri sorgumuzu içeren <select/> kısmı diğeri sorgu sonucu verileri class'ımıza (objeye dolduracak) aktaracak <resultMap/> kısmı. İkisinin de id bilgisini unique(tekil) olacak şekilde istediğimiz gibi verebiliriz. Mantıklı bir şeyler yazmakta fayda var. Daha sonra resultMap için hangi class'ımıza (hangi objeye) veriler aktırılacak bunu type property'si ile belirliyoruz. Burada class'ımızın yolunu veriyoruz. Daha sonra içerisinde hangi kolon hangi property'e map edecek(eşleşecek) bunun bilgilerini ve veri tiplerini uygun olacak şekilde belirliyoruz.
<select> için resultMap kısmına eşleşeceği resultMap'in id bilgisini veriyoruz. Biz üstteki resultMap ile eşleşmesini istediğimiz için onun id bilgisini verdik. Sorguya bir parametre bilgisi geleceği durumda bu alan parameterClass propertysi ekleyerek gelecek parametrenin tipini de vermemiz gerekirdi. Ben daha basit olması açısından bir parametre falan göndererek bir sorgu oluşturmak istemedim. İlerleyen zamanda bir örneğini gösteririm. Yukarıdaki gibi sqlMap'teki olacak işlemlerimizi tamamlıyoruz. Şimdi bu sorguyu çağıracak olan metodumuzu oluşturmalıyız. Bunun için ilgili sqlMap'in ilişkili olduğu Mapper.java class'ına metod tanımını yapıyoruz.


Şimdi istediğimiz şekilde bu metodu kullanarak veritabanından verileri alabiliriz. Ben önceden oluşturmuş olduğum manager içerisinde bir metot içerisinde bu metotu çağırdım.


Şimdi çalıştığını görelim.


Gördüüğünüz üzere veritabanı içerisindeki verilere bu şekilde erişerek bilgileri console'a döktüm. Bundan sonra bu verileri istediğim gibi işleyebilirim, benzer sorgular oluşturarak ekleyebilir, güncelleyebilir ya da silebilirim. Mybatis'te custom query kullanımı bu kadar, umarım faydalı olur.