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 | |
---|
10 | package net.fmg.ven; |
---|
11 | |
---|
12 | import java.beans.PropertyDescriptor; |
---|
13 | import java.sql.ResultSet; |
---|
14 | import java.sql.SQLException; |
---|
15 | import java.util.ArrayList; |
---|
16 | import java.util.Date; |
---|
17 | import java.util.HashMap; |
---|
18 | import java.util.HashSet; |
---|
19 | import java.util.Iterator; |
---|
20 | import java.util.LinkedList; |
---|
21 | import java.util.List; |
---|
22 | import java.util.Map; |
---|
23 | import java.util.Set; |
---|
24 | import net.fmg.ven.arac.Cevir; |
---|
25 | import net.fmg.ven.arac.SinifBildirenLinkedList; |
---|
26 | import org.springframework.beans.BeanWrapper; |
---|
27 | import org.springframework.beans.BeanWrapperImpl; |
---|
28 | import org.springframework.jdbc.core.RowCallbackHandler; |
---|
29 | import 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 | */ |
---|
35 | public 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(Cevir.isim(nesneSinifi.getName())); |
---|
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 | } |
---|