22 Şubat 2014 Cumartesi

JSF ve MySQL Veritabanı

Java ile MySQL bağlantısı kurmak için MySQL JDBC Driver kütüphanesine ihtiyacımız vardır.Bu kütüphane Netbeans ile beraber gömülü olarak gelir.Bu kütüphaneyi projemize ekledikten sonra bağlantı aşağıda ki gibi kurulur.

public class JavaMySQL {   
    static Connection con = null;   
    public static void main(String[] args) {
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3307", "root", "root");
            if(!con.isClosed()){
                System.out.println("Veritabanına bağlanıldı!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Bu işlemi kendimize has bir kütüphane yazarak da yapabiliriz. Bu takdirde her defasında bu kodları yazmadan bir Connection nesnesi ve baglan() metodu ile MySQL veritabanına bağlanılabilir.Örnekde veritabanına bağlanmak için MySQLBaglantiBean classı ile baglan() metodu kullanılmıştır.
Aşağıda ki örnek de girilen değerler veritabanına kaydedilip daha sonra h:dataTable componenti ile listelenmektedir. Liste elemanının yanında ki Sil butonu ile listeden dolayısıyla veritabanından eleman silinebilmektedir.
Bu web uygulamasının önyüzü aşağıda ki gibi kodlanır.

index.xhtml

<h:body>
        <h:form>
            <h:panelGrid columns="3" border="0">
                <h:outputText value="Personel adı"/>
                <h:inputText value="#{kmb.personelad}" size="25" required="true"
                             requiredMessage="Lütfen personel adını giriniz!"
                             id="personeladi"/>
                <h:message for="personeladi" style="color: red"/>
                <h:outputText value="Personel soyadı"/>
                <h:inputText value="#{kmb.personelsoyad}" size="25" required="true"
                             requiredMessage="Lütfen personel soyadını giriniz!"
                             id="personelsoyadi"/>
                <h:message for="personelsoyadi" style="color: red"/>
                <h:outputText value="Personel görevi"/>
                <h:inputText value="#{kmb.personelgorev}" size="25" required="true"
                             requiredMessage="Lütfen personel görevini giriniz!"
                             id="personelgorevi"/>
                <h:message for="personelgorevi" style="color: red"/>
                <h:outputText value="Personel e-postası"/>
                <h:inputText value="#{kmb.personeleposta}" size="25" required="true"
                             requiredMessage="Lütfen personel epostasını giriniz!"
                             id="personeleposta"/>
                <h:message for="personeleposta" style="color: red"/>
                <h:outputText value="Personel maaşı"/>
                <h:inputText value="#{kmb.personelmaas}" size="25" required="true"
                             requiredMessage="Lütfen personel maaşını giriniz!"
                             id="personelmaasi"/>
                <h:message for="personelmaasi" style="color: red"/>
                <h:commandButton value="Kaydet" action="#{kmb.veriEkle}" id="kayit"/>
                <h:commandButton value="Temizle" type="reset"/>
                <h:outputText value=""/>
            </h:panelGrid>
            <h:messages  globalOnly="true" style="color: red"/>
        </h:form>
        <br/>
        <h:form>
            <h:dataTable value="#{kmb.liste}" var="lborder="1" id="tablo">
                <h:column>
                    <f:facet name="header">PERSONEL ADI</f:facet>
                        #{l.ad}
                </h:column>
                <h:column>
                    <f:facet name="header">PERSONEL SOYADI</f:facet>
                        #{l.soyad}
                </h:column>
                <h:column>
                    <f:facet name="header">PERSONEL E-POSTA</f:facet>
                        #{l.eposta}
                </h:column>
                <h:column>
                    <f:facet name="header">PERSONEL GÖREVİ</f:facet>
                        #{l.gorev}
                </h:column>
                <h:column>
                    <f:facet name="header">PERSONEL MAAŞI</f:facet>
                        #{l.maas}
                </h:column>
                <h:column>
                    <f:facet name="header">
                        SİL
                    </f:facet>
                    <h:commandLink action="#{kmb.veriSil(l)}" value="Sil">
                        <h:graphicImage url="http://www.777icons.com/libs/basic-vista/delete-icon.gif"
                                        width="20" height="20"/>
                    </h:commandLink>
                </h:column>
            </h:dataTable>
        </h:form>
    </h:body>

Bu sayfanın çıktısı aşağıda ki gibidir.



Gelelim asıl olayın döndüğü yere. ManagedBean'e.Bu uygulama da veritabanı işlemlerinin yapıldığı yer ManagedBean dir.Bu java classı aşağıda ki gibidir.


VeritabaniIslemBean.java

private String personelad;
    private String personelsoyad;
    private String personelgorev;
    private String personeleposta;
    private String personelmaas;
    private MySQLBaglantisi msb = new MySQLBaglantisi();
    private boolean resultSet, resultSilme;
    private static List<Personel> liste;

    public String getPersonelad() {
        return personelad;
    }

    public void setPersonelad(String personelad) {
        this.personelad = personelad;
    }

    public String getPersonelsoyad() {
        return personelsoyad;
    }

    public void setPersonelsoyad(String personelsoyad) {
        this.personelsoyad = personelsoyad;
    }

    public String getPersonelgorev() {
        return personelgorev;
    }

    public void setPersonelgorev(String personelgorev) {
        this.personelgorev = personelgorev;
    }

    public String getPersoneleposta() {
        return personeleposta;
    }

    public void setPersoneleposta(String personeleposta) {
        this.personeleposta = personeleposta;
    }

    public String getPersonelmaas() {
        return personelmaas;
    }

    public void setPersonelmaas(String personelmaas) {
        this.personelmaas = personelmaas;
    }

    public List<Personel> getListe() {
        msb.baglan();
        liste = new ArrayList<Personel>();
        String sql2 = "SELECT * FROM jsfapp.personel";
        try {
            PreparedStatement pstmt2 = (PreparedStatement) msb.getConnection().prepareStatement(sql2);
            ResultSet resultSetListe = pstmt2.executeQuery();
            while (resultSetListe.next()) {
                liste.add(new Personel(resultSetListe.getString(1), resultSetListe.getString(2), resultSetListe.getString(3),
                        resultSetListe.getString(4), resultSetListe.getString(5)));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return liste;
    }

    public String veriEkle() {
        msb.baglan();
        String sonuc = "";
        String sql = "INSERT INTO jsfapp.personel (personelad,personelsoyad,"
                + "personeleposta,personelgorev,personelmaas) VALUES(?,?,?,?,?)";
        try {
            PreparedStatement pstmt = (PreparedStatement) msb.getConnection().prepareStatement(sql);
            pstmt.setString(1, personelad);
            pstmt.setString(2, personelsoyad);
            pstmt.setString(3, personeleposta);
            pstmt.setString(4, personelgorev);
            pstmt.setString(5, personelmaas);
            resultSet = pstmt.execute();
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (!resultSet) {
            sonuc += personelad + " " + personelsoyad + " kaydedildi.";
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(sonuc));
            return null;
        } else {
            sonuc += "Kayıt işlemi başarısız!";
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(sonuc));
            return null;
        }

    }

    public String veriSil(Personel personel) {
        msb.baglan();
        String sonuc = "";
        String sql = "DELETE FROM jsfapp.personel WHERE personelad='" + personel.getAd() + "' AND personelsoyad='" + personel.getSoyad() + "'";
        try {
            PreparedStatement pstmt = (PreparedStatement) msb.getConnection().prepareStatement(sql);
            resultSilme = pstmt.execute();
        } catch (Exception e) {
            e.printStackTrace();
        }

        if (!resultSilme) {
            sonuc += personel.getAd() + " " + personel.getSoyad() + " silindi.";
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(sonuc));
            return null;
        } else {
            sonuc += "Silme işlemi yapılamadı!";
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(sonuc));
            return null;
        }
    }
}


Personel.java

public class Personel {
   
    private String ad;
    private String soyad;
    private String eposta;
    private String gorev;
    private String maas;

    public Personel(String ad, String soyad, String eposta, String gorev, String maas) {
        this.ad = ad;
        this.soyad = soyad;
        this.eposta = eposta;
        this.gorev = gorev;
        this.maas = maas;
    }

    public String getAd() {
        return ad;
    }

    public void setAd(String ad) {
        this.ad = ad;
    }

    public String getSoyad() {
        return soyad;
    }

    public void setSoyad(String soyad) {
        this.soyad = soyad;
    }

    public String getEposta() {
        return eposta;
    }

    public void setEposta(String eposta) {
        this.eposta = eposta;
    }

    public String getGorev() {
        return gorev;
    }

    public void setGorev(String gorev) {
        this.gorev = gorev;
    }

    public String getMaas() {
        return maas;
    }
    public void setMaas(String maas) {
        this.maas = maas;
    }
}


Sil butonu ile veri silindikten sonra sayfanın görünümü aşağıda ki gibi olur.




3 Şubat 2014 Pazartesi

JAVA İLE JSON PARSE ETME

Önceki yazılarımdan birinde XML parse etmeyi ele almıştım.Bu yazımda başka bir kategorileme dili olan JSON un nasıl parse edildiğini ele alacağım.
JSON, javascript'in bir alt kümesi olan düzenli bir şekilde XML gibi içerik kategorileme dilidir. JSON XML'e göre daha da hızlıdır, daha pratiktir. XML gibi bütün programlama dillerinde etkin bir şekilde kullanılabilir.
Yapı olarak XML e çok benzeyen JSON tipinin ana amacı veri alış verişi yaparken daha küçük boyutlarda veri alıp göndermektir. Ayrıca kullanımı da çok kolaydır.
XML ve JSON karşılaştırması için bir örnek verelim. Bunun için Müşteri datalarını tuttuğumuzu varsayalım.

XML Örneği

01
<musteriler>
02
<musteri>

03
<kod>120.01.001</kod>
04
<ad>Microsoft</ad>

05
<unvan>Microsoft AŞ.</unvan>
06
</musteri>

07
<musteri>
08
<kod>120.01.002</kod>

09
<ad>Google</ad>
10
<unvan>Google AŞ.</unvan>

11
</musteri>
12
<musteri>

13
<kod>120.01.003</kod>
14
<ad>Yahoo</ad>

15
<unvan>Yahoo AŞ.</unvan>
16
</musteri>

17
<musteri>
18
<kod>120.01.004</kod>

19
<ad>Apple</ad>
20
<unvan>Apple AŞ.</unvan>

21
</musteri>
22
</musteriler>



Şimdide bunu JSON ile ifade edelim.
01
{musteriler:[
02
{

03
"kod":"120.01.001",
04
"ad"="Microsoft",

05
"unvan"="Microsoft AŞ",
06
}

07
{
08
"kod":"120.01.002",

09
"ad"="Google",
10
"unvan"="Google AŞ",

11
}
12
{

13
"kod":"120.01.003",
14
"ad"="Yahoo",

15
"unvan"="Yahoo AŞ",
16
}

17
{
18
"kod":"120.01.004",

19
"ad"="Apple",
20
"unvan"="Apple AŞ",

21
}
22
]}


Gördüğünüz üzere kodumuz oldukça azaldı ve yazması-okumasıda kolaylaştı.
Böyle 3-5 elemanlı örneklerde per bir performans göremesenizde 1000-2000 elemanlı örneklerde performans oldukça farkedecektir.
Java ile JSON okumak için org.json kütüphanesine ihtiyaç duyacağız.Bu kütüphaneyi buradan indirebilirsiniz.Kütüphaneyi projemize ekledikten sonra artık kodlama kısmına geçebiliriz.


JsonReader.java

public class JsonReader {
        private static String readAll(Reader rd) throws IOException {
        StringBuilder sb = new StringBuilder();
        int cp;
        while ((cp = rd.read()) != -1) {
            sb.append((char) cp);
        }
        return sb.toString();
    }

  
 public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException {
        InputStream is = new URL(url).openStream();
        try {
            BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
            String jsonText = readAll(rd);
            JSONObject json = new JSONObject(jsonText);
            return json;
        } finally {
            is.close();
        }
    }

    public static void main(String[] args) throws IOException, JSONException {
        JSONObject json = readJsonFromUrl("http://findyourmp.parliament.uk/api/search?q=bob&f=js");
        System.out.println(json.toString());
        for (int i = 0; i < json.getJSONObject("results").getJSONArray("members").length(); i++) {
            System.out.println("İsim:" + json.getJSONObject("results").getJSONArray("members").getJSONObject(i).get("member_name"));
        }
    }


Bu kodların çıktısı aşağıda ki gibi olur.