Merhabalar arkadaşlar. Bu yazımızda JSF ile veri tabanından nasıl kayıt çekileceğini göreceğiz. Önceki yazımızda kayıt eklemeyi öğrenmiştik. Ben yine o yazıdaki veritabanı ve tabloyu kullanacağım.
Veri tabanından kayıt çekerken biz bir sonuç kümesine (ResultSet) ihtiyaç duyarız. Bu sonuç kümesine veri tabanından dönen sonuç atanır ve biz de uygun metot ile ilgili sütunu alırız. Mesele ResulSet’imizin adı rs olsun ve yazar adalarını çekmek isteyelim. O zaman rs.getString(“Adi”); diyerek yazar adlarını almış oluruz. Tabi burada where koşulu kullanılmadığını ve SELCET * yapıldığını varsayarak böyle diyorum. Daha sonra bu sonuç kümesi içinden aldığımız değerleri bir listeye atarız. Dizi de kullanabiliriz ama bellek işgali gibi sebeplerden ötürü liste kullanmak daha mantıklı. Listeyi de bir dataTable ile ekrana basıcaz. Listeyi direk dataTable’ın value özelliğine atayarak kullanamıyoruz, bunun yerine bir var nesnesi tanımlayıp o nesne ile adeta bir döngü şeklinde kayıtları ekrana döküyoruz. Şöyle düşünebiliriz: Java sınıfı içindeki DataTable’ın value özelliğine atıyoruz, DataTable sanki kendi içinde for ya da while döngüsü işletiyormuşçasına bir var nesnesi ile tüm kayıtları ekra döker.
Veri tabanımız şu şekilde. Önceki yazıda yazdığımız uygulama ile yeni kayıtlar ekleyip bu hale getirebilirsiniz.
Kodlarımız da şu şekildedir. Yine açıklamalarını kod satırları içinde verdim.
kayitCek.xhtml Kodu
<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:f="http://xmlns.jcp.org/jsf/core"> <h:head> <title>Facelet Title</title> </h:head> <h:body> <h:dataTable value="#{kayitCek.yazarlarTablosu}" var="yaz"> <!--Burada var nesnesi her satır için özelleşmiş olacak ve DataTable bir döngü işletirmişcesine kayıtları ekrana dökecek.--> <h:column> <f:facet name="header"><!--Sütunun başlığını belirteceğimiz etiket.--> <h:outputLabel>Adi</h:outputLabel><!--Sütunun başlığı.--> </f:facet> <h:outputLabel value="#{yaz.adi}"/><!--Sütuna yazılacak değer .--> </h:column> <h:column> <f:facet name="header"><!--Sütunun başlığını belirteceğimiz etiket.--> <h:outputLabel>Alani</h:outputLabel><!--Sütunun başlığı.--> </f:facet> <h:outputLabel value="#{yaz.alani}"/><!--Sütuna yazılacak değer .--> </h:column> </h:dataTable> </h:body> </html>
KayitCek.java Kodu
import java.sql.*; import java.util.*; import javax.faces.bean.*; @ManagedBean @RequestScoped public class KayitCek { PreparedStatement ps=null;//SQL sorgumuzu tutacak ve çalıştıracak nesne. Connection con=null;//Veri tabanına bağlantı yapmamızı sağlayacak nesne. public List<AdiAlaniPojo> getYazarlarTablosu() { try { Class.forName("com.mysql.jdbc.Driver");//Hangi türde bir veri tabanını kullanacağını bildiriyoruz. con=DriverManager.getConnection("jdbc:mysql://localhost:3306/kod5","root","");//Bağlanacağı veri tabanını ve kullanacağı kullanıcı adı-parolayı bildiriyoruz. ps=con.prepareStatement("SELECT * FROM yazarlar");//Yazarlar tablosundaki herşeyi çek diyoruz. ResultSet rs=ps.executeQuery();//SQL Sorgusundan dönecek sonuç rs sonuç kümesi içinde tutulacak. List<AdiAlaniPojo> liste=new ArrayList<>();//AdiAlani sınıfı tipinde liste tanımladık çünkü SQL Sorgusundan dönecek sonuç içindeki Adi Alani kısmına bu tiple ulaşacaz. while(rs.next())//Kayıt olduğu sürece her işlem sonunda 1 satır atla. { AdiAlaniPojo aa=new AdiAlaniPojo();//SQL Sorgusundan sütunları çekip bu değişkenin içinde Adı veya Alani kısmına atıyacağız. aa.setAdi(rs.getString("Adi")); //ResultSet içinden o anki indisdeki "Adi" anahtar kelimesine karşı gelen değer alınıyor. aa.setAlani(rs.getString("Alani")); //ResultSet içinden o anki indisdeki "Alani" anahtar kelimesine karşı gelen değer alınıyor. liste.add(aa);//Her bir dönen sonucu listeye ekliyoruz. } return liste;//Listeyi return ediyoruz. } catch (ClassNotFoundException | SQLException exception) { System.out.println("Bir hata meydana geldi:"+exception); return null; } finally{ //try'a da düşse catch'e de bu bloktaki kod çalıştırılacak. try { if(con!=null){ //Connection nesnesi belki yukarıda null kalmış olabilir. Kontrol etmekte fayda var. con.close(); } if(ps!=null){ //PreparedStatement nesnesi yukarıda null kalmış olabilir. Kontrol etmekte fayda var. ps.close(); } } catch (SQLException sqlException) { System.out.println("Bir hata meydana geldi:"+sqlException); } } } }
AdiAlaniPojo.java Kodu
public class AdiAlaniPojo { private String Adi; private String Alani; public String getAdi() { return Adi; } public void setAdi(String Adi) { this.Adi = Adi; } public String getAlani() { return Alani; } public void setAlani(String Alani) { this.Alani = Alani; } }
Ekran Çıktısı
Bu yazıda da bu kadar arkadaşlar. Gelecek yazıda güncelleme (update) işlemine bakacağız. Görüşmek üzere.
Editörde hangi fontu kullandınız?
Merhaba.
Yazı içinde crayon kod eklentisi ile kodlarımızı yazıyoruz.
hocam inputtextareadan gireceğim değeri sql sorgusuna nasıl ekleyebilirim mesela select * from deneme where donem = 2015-2016; gibi bir sorgu çalıştırmak istediğimde 2015-2016 yı kullanıcının ekrandan girmesini istediğimde SQL sorusuna nasıl eklemem gerekiyor. Paylaşımlarınız ve desteğiniz için çok teşekkür ederim
Merhaba Dursun.
Öncelikle bu durumun Sql injectiona sebep olma riski yüksek. Bunu gözönüne kodunu ona göre iyi yazman lazım.
Eğer kişi inputTextAreaya 2015-2016 diye giriş yapacaksa sen java kodu içinde String sql =”select * from table where donem =? ”
Deyip preparedStatement a ilgili değeri set edip kodu çalıştırırsan amacına ulaşırsın gibime geliyor.
Ben de teşekkür ederim kolay gelsin. Olmazsa yine yorum at, daha detaylı bakarız.
Merhabalar, table şeklinde yüzlerce satıdan oluşan verilerim var ve bunlara bir süzgeç yapmak istiyorum. Yardımcı olabilir misiniz?
mail : [email protected]
Merhabalar.
Nasıl bir süzgeçten bahsediyorsunuz? Biraz açabilir misiniz? Mesela PrimeFaces kütüphanesi kullanırsanız kolonlara özgü dinamik arama özelliği bile katabilirsiniz:
http://www.primefaces.org/showcase/ui/data/datatable/columns.xhtml
Merhabalar, Örnekteki gibi yalnız daha sade olması gerek. Nasıl yapabilirim?
Teşekkürler @lkaygnel:disqus
Aptallığımı mazur görün, ben ne demek istediğinizi yine anlayamadım. Size yardımcı olmak istiyorum ama amacınızın ne olduğunu anlayamıyorum.
Estağfurullah. basitçe şöyle yalnız richfaces olması gerekiyor. Sade demek ise tek bir tane textbox bile olur yani tüm sütunlar için yapılmasına gerek yok.
Richfaces daha önce hiç çalışmadığım için size yardımcı olamıyorum maalesef. PrimeFaces tarafta var istedikleriniz ama o da sizin işinize yaramıyor 🙂
Pekii mail adresinizi alsam bikaç hatam var jsf de belki yol gösterirsiniz. Teşekkürler
[email protected] adresine yollayabilirsiniz.