29 Ocak 2015 Perşembe

Jsf Hibernate CRUD


     Daha önceki yazılarımda elimden geldiğince Jsf ile ilgili konulardan bahsetmiştim. Bu yazımın konusu ise okuma , yazma , silme ve güncellemedir. Şimdiye kadar ki Jsf  çalışmalarımda veri tabanı bağlantı ve işlemleri için Hibernate yi tercih etmiştim , bu yazımdaki örnek kodların bir kısmı da HQL mantığıyla bir kısmını da bildiğimiz SQL cümleleri ile gerçekleştirdim. Bunun sebebi HQL ile bazı işlemleri yapmak hem karmaşık hemde hataya sebep olabiliyor.


     Ayrıca bu dört işlem için küçük bir uygulama da yazdım , bu örnek kodları onun içerisinden alıyorum. Eğer isterseniz buradaki Github linkinden erişebilirsiniz. Örneğimiz şöyle ; bir veya birden fazla blog adresimiz var ve bu uygulamada hangi blogda hangi yazılar var ,bu yazılar kaç kez okunmuş , kaç yorum var gibi bilgiler mevcut biz de bunlar üzerinde işlemler yapıyoruz.

Create

public boolean saveUser(String ad, String soyad, String sifre) {
        ses = hu.getSessionFactory().openSession();
        ses.beginTransaction();
        Query q = ses.createSQLQuery("insert into user(ad,soyad,sifre) values(:ad,:soyad,:sifre)")
                .setParameter("ad", ad)
                .setParameter("soyad", soyad)
                .setParameter("sifre", sifre);
        int i = q.executeUpdate();
        ses.getTransaction().commit();
        ses.close();
        return true;
    }

     ses.createQuery(...) normal bir HQL ifadesidir. Yukarıdaki gibi  "SQL" eklediğimiz eklediğimiz zaman standart SQL cümleleri yazabiliriz. executeUpdate() integer değer dönderir ve kaydın başarılı bir şekilde eklenebilmesi için gereklidir.

Read

public List blogGetir(int id) {
        List blog = new ArrayList<>();
        Blog blg = new Blog();
        ses = hu.getSessionFactory().openSession();
        ses.beginTransaction();
        Query q = ses.createQuery("from Blog b join b.user where b.user.uid=:uid")
                .setParameter("uid", id);
        Iterator iter = q.list().iterator();
        Object[] obje;
        while (iter.hasNext()) {
            obje = (Object[]) iter.next();
            blg = (Blog) obje[0];
            blog.add(blg);
        }

        ses.getTransaction().commit();
        ses.close();
        return blog;
    }

     Bu örneği daha önceki yazılarımda belirtmiştim. Join şeklindeki bir sorguyu iterator yardımıyla pojoya yerleştirip List döndererek üzerinde istediğimiz işlemi yapabiliriz. Create de olduğu gibi executeUpdate()  olmadan da çalışacaktır.

Update

public boolean yaziUpdate(String blogAd, String yaziAd, String konu,
            Integer shows, Date tarih, Integer yorum, int id)  throws ParseException {
        boolean sonuc;
        ses = hu.getSessionFactory().openSession();
        try {
            ses.beginTransaction();
            Query q = ses.createSQLQuery("update blog b set blog_ad=:blog_ad , "
                    + "yazi_ad=:yazi_ad , konu=:konu , shows=:shows , tarih=:tarih , yorum=:yorum where b.bid=:bid")
                    .setParameter("blog_ad", blogAd)
                    .setParameter("konu",konu)
                    .setParameter("shows", shows)
                    .setParameter("tarih",tarih)
                    .setParameter("yazi_ad",yaziAd)
                    .setParameter("yorum",yorum)
                    .setParameter("bid",id);
            int a = q.executeUpdate();
            ses.getTransaction().commit();
            sonuc = true;
        } catch (Exception e) {
            sonuc = false;
        } finally {
            ses.close();
        }
        return sonuc;
    }

     Burada Bean içerisine aldığım yeni değerleri fonksiyonla göderip güncelleme yapıyorum. Güncelleyeceğim sütunun id sini de buraya gönderiyorum. Eğer eklemezsek o tablodaki bütün değerleri aynı olacak şekilde güncelleyebilir! o yüzden "where" kısmını unutmayalım. Ayrıca dikkatli bakarsanız burada tarih(Date) güncellemesi yapıyoruz. Dolayısıyla String bir ifadeyi direk tarih olarak ekleyemeyiz , hata verir. Bu hatayı engellemek için String ifadeyi Date formatında parse etmeliyiz. Ben bunu ManagedBean içerisinde aşağıdaki gibi yapmıştım;


 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
 Date parseDate = sdf.parse(tarih);

Delete



 public void yaziSil(int id) {
        ses = hu.getSessionFactory().openSession();
        try {
            ses.beginTransaction();
            Query q = ses.createQuery("delete from Blog b where b.bid=:bid")
                    .setParameter("bid", id);
            int a = q.executeUpdate();
            ses.getTransaction().commit();
        } catch (Exception e) {
            throw e;
        } finally {
            ses.close();
        }
    }


     Kayıt silerken de yukarıdaki gibi id bilgisine göre silebiliriz. Belki dikkatinizi çekmiştir ilk ikisinde try catch finally bloğu yok son ikisinde var , daha düzenli ve hata yakalayabilmek için bu yapıyı da kullanabiliriz. Uygulamanın tamamlanmış halini aşağıdaki videodan izleyebilirsiniz!


0 yorum:

Yorum Gönder