2013-05-09 24 views
7

Buna benzer bir sınıfa sahibim. Aşağıda da gösterilen iki veritabanı tablosundan doldurmam gerekiyor. Bunu yapmak için tercih edilen bir yolu var mı?JDBC Şablon - Bir Çoktan

Benim düşüncem bir List<> bir DAO'dan bir ResultSetExtractor üzerinden seçmek için bir hizmet sınıfına sahip olmaktır. Sonra bu listede bir foreach yapın ve bir birey için başka bir ResultSetExtractor aracılığıyla bir List<> e-posta adresi seçin ve foreach döngüsünden ekleyin.

Daha iyi bir yol var mı, yoksa aldığı kadar mı?

public class Person { 
    private String personId; 
    private String Name; 
    private ArrayList<String> emails; 
} 


create table Person (
    person_id varchar2(10), 
    name  varchar2(30) 
); 


create table email (
    person_id varchar2(10), 
    email  varchar2(30) 
); 

cevap

10

Bu en iyi bir ORM tarafından çözülür. JDBC ile, bir ORM'in sizin için ne yapacağını el ile yapmanız gerekir. N + 1 sorgularını yürütmek çok verimsizdir. Tek bir sorgu yürütmeli ve nesnelerinizi manuel olarak oluşturmalısınız. Hantal, ama zor değil:

select person.id, person.name, email.email from person person 
left join email on person.id = email.person_id 

... 

Map<Long, Person> personsById = new HashMap<>(); 
while (rs.next()) { 
    Long id = rs.getLong("id"); 
    String name = rs.getString("name"); 
    String email = rs.getString("email"); 
    Person person = personsById.get(id); 
    if (person == null) { 
     person = new Person(id, name); 
     personsById.put(person.getId(), person); 
    } 
    person.addEmail(email); 
} 
Collection<Person> persons = personsById.values(); 
+0

Bu harika. Keşke bunu önceki bir projede yapmıştım. Son hattın ne yaptığını söyleyebilir misin? O kısmı takip ettiğime emin değilim. – EdgeCase

+0

Sadece değerleri haritadan alır, çünkü sorgunun bir sonucu olarak isteyeceğiniz şey bir “Harita

+1

Veya'java.util.Set ' 'Sınıf Kişisi {public boolean = eşittir (Object o) {return id == (Kişi) o.id; public int hashCode() {return id.hashCode(); }} 'Bu, performans ve okunabilirlik amaçları için daha cazip olan Map.values ​​() işlevini çağırmaktan kaçınacaktır. – juanchito