source: trunk/fmgVen/src/net/fmg/ven/SorguEslestirici.java @ 24

Last change on this file since 24 was 23, checked in by fmguler, 14 years ago

Refs #3 - Spring 2.5 libraries are added. Old spring 2 jar is removed. The main dependency is spring-jdbc.jar and spring-beans.jar, spring-core.jar and spring-tx.jar are referenced from them. For testing with postgresql, its driver is added.

The interface is translated to the new Ven class. Instead of adding 'object' to all of the methods, I aimed to make it less verbose, so just shortened the name of the methods to list, get save, delete.

Lastly, we have a class to demonstrate the usage called 'Sample' in the test packages.

File size: 6.7 KB
Line 
1/*
2 * SorguEslestirici.java
3 *
4 * Created on December 18, 2006, 10:40 AM
5 * (4.12.06 tarihli SpringDaoDeneme çalışmasından derlenmiştir)
6 *
7 * Ven - Ayar Yerine Gelenek veritabanı erişim nesnesi
8 */
9
10package net.fmg.ven;
11
12import java.beans.PropertyDescriptor;
13import java.sql.ResultSet;
14import java.sql.SQLException;
15import java.util.ArrayList;
16import java.util.Date;
17import java.util.HashMap;
18import java.util.HashSet;
19import java.util.Iterator;
20import java.util.LinkedList;
21import java.util.List;
22import java.util.Map;
23import java.util.Set;
24import net.fmg.ven.arac.Cevir;
25import net.fmg.ven.arac.SinifBildirenLinkedList;
26import org.springframework.beans.BeanWrapper;
27import org.springframework.beans.BeanWrapperImpl;
28import org.springframework.jdbc.core.RowCallbackHandler;
29import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
30
31/**
32 * 'Ayar yerine gelenek' yaklaşımında üretilmiş sorgunun sonucunu belirtilen nesneye eşler
33 * @author Fatih Mehmet Güler
34 */
35public class SorguEslestirici{
36    private NamedParameterJdbcTemplate sablon;
37    private Set vtSiniflari;
38    private Set nesnePaketleri;
39    private boolean hataAyiklama = false;
40    private Map saklanmisSiniflar;
41   
42    /**
43     * Creates a new instance of SorguEslestirici
44     */
45    public SorguEslestirici(){
46        this.vtSiniflari = new HashSet();
47        this.nesnePaketleri = new HashSet();
48        this.saklanmisSiniflar = new HashMap();
49        this.vtSiniflari.add(Integer.class);
50        this.vtSiniflari.add(String.class);
51        this.vtSiniflari.add(Date.class);
52        this.vtSiniflari.add(Double.class);
53        this.vtSiniflari.add(Boolean.class);
54    }
55   
56    public List listele(String sorgu, Map parametreler, final Class nesneSinifi){
57        long t1 = System.currentTimeMillis();
58        final List sonuclar = new LinkedList();
59        final String tabloAdi = Cevir.vt(nesneSinifi.getSimpleName());
60        final Set sutunlar = new HashSet();
61       
62        sablon.query(sorgu,parametreler,new RowCallbackHandler(){
63            public void processRow(ResultSet rs) throws SQLException {
64                sutunAdlariniAl(sutunlar,rs);
65                esle(rs,sutunlar,tabloAdi,nesneSinifi,sonuclar);
66            }
67        }
68        );
69        System.out.println("Listeleme zamanı="+(System.currentTimeMillis()-t1));       
70        return sonuclar;
71    }
72   
73    private void esle(ResultSet rs, Set sutunlar, String tabloAdi, Class nesneSinifi, List ustListe){
74        try{
75            if (!sutunlar.contains(tabloAdi+"_no")) return; //bu nesne sütunlar arasında hiç yok
76            Object no = rs.getObject(tabloAdi+"_no");
77            if (no==null) return; //bu nesne sütunlar arasında var ama null, muhtemelen left join den dolayı
78            BeanWrapper wr=new BeanWrapperImpl(nesneSinifi); //Zaten class introspectionunu saklıyor (CachedIntrospectionResults.forClass())
79            wr.setPropertyValue("no",no);
80            Object nesne = wr.getWrappedInstance();
81            boolean esle = true;
82            for (Iterator it = ustListe.iterator(); it.hasNext();) { //listenin içinde indexOf ve get(i) ile birkaç kez dolaşmak yerinde bir kez dolaşmış olalım, onlar da aynı şeyi yapıyor çünkü.
83                Object listedekiNesne = (Object) it.next();
84                if (nesne.equals(listedekiNesne)){ //NOT: bunu no'ları karşılaştırarak da yapabiliriz
85                    wr.setWrappedInstance(listedekiNesne); //listede zaten var onu kullanmalıyız
86                    esle = false; // ve tekrar eşleme yapmamalıyız
87                    break;
88                }
89            }
90            if (esle) ustListe.add(nesne); //bulamadık, yani listede yok bunu ekliyoruz
91            PropertyDescriptor[] pdArr = wr.getPropertyDescriptors();
92            for (int i = 0; i < pdArr.length; i++) {
93                PropertyDescriptor pd = pdArr[i];
94                String alanAdi = Cevir.vt(pd.getName());
95                Class alanSinifi = pd.getPropertyType();
96                String sutun = tabloAdi+"_"+alanAdi;
97                if (esle && vtSiniflari.contains(alanSinifi)){ //veritabanı nesneleri
98                    if(sutunlar.contains(sutun)){
99                        if(hataAyiklama) System.out.println(">>alan bulundu "+sutun);
100                        wr.setPropertyValue(pd.getName(),rs.getObject(sutun));
101                    }else{
102                        if(hataAyiklama) System.out.println("--alan bulunamadı: "+sutun);
103                    }
104                }
105                if (esle && alanSinifi.getPackage()!=null && getNesnePaketleri().contains(alanSinifi.getPackage().getName())){ //bire bir nesneler
106                    if(sutunlar.contains(sutun+"_no")){
107                        if(hataAyiklama) System.out.println(">>nesne bulundu "+sutun);
108                        List list = new ArrayList(1); //tek sonuç olacağını biliyoruz
109                        esle(rs,sutunlar,sutun,alanSinifi,list);
110                        if(list.size()>0)wr.setPropertyValue(pd.getName(),list.get(0));
111                    }else{
112                        if(hataAyiklama) System.out.println("--nesne bulunamadı: "+sutun);
113                    }
114                }
115                if ((SinifBildirenLinkedList) wr.getPropertyValue(pd.getName())  instanceof SinifBildirenLinkedList){ //çoklu nesneler
116                    if(sutunlar.contains(sutun+"_no")){
117                        if(hataAyiklama) System.out.println(">>liste bulundu "+sutun);
118                        Class bagNesneSinifi = (Class)wr.getPropertyValue(pdArr[i].getName()+".nesneSinifi");
119                        esle(rs,sutunlar,sutun,bagNesneSinifi,(List)wr.getPropertyValue(pd.getName()));
120                    }else{
121                        if(hataAyiklama) System.out.println("--liste bulunamadı: "+sutun);
122                    }
123                }
124               
125            }
126        } catch(Exception ex){
127            ex.printStackTrace();
128        }
129    }
130   
131    private Set sutunAdlariniAl(Set sutunAdlari, ResultSet rs) throws SQLException{
132        if (!sutunAdlari.isEmpty()) return sutunAdlari;
133        for (int i=1; i<rs.getMetaData().getColumnCount()+1; i++) {
134            sutunAdlari.add(rs.getMetaData().getColumnName(i));
135        }
136        return sutunAdlari;
137    }
138   
139    public void setHataAyiklama(boolean hataAyiklama) {
140        this.hataAyiklama = hataAyiklama;
141    }
142   
143    public Set getNesnePaketleri() {
144        return nesnePaketleri;
145    }
146   
147    public void setNesnePaketleri(Set nesnePaketleri) {
148        this.nesnePaketleri = nesnePaketleri;
149    }
150   
151    public void setSablon(NamedParameterJdbcTemplate sablon) {
152        this.sablon = sablon;
153    }
154}
Note: See TracBrowser for help on using the repository browser.