JDBC模板 - 一对多

Edg*_*ase 8 java spring-jdbc

我有一个看起来像这样的课程.我需要从两个数据库表中填充它,如下所示.有没有首选的方法呢?

我的想法是让服务类选择List<>通过ResultSetExtractor从DAO.然后foreach在该列表上执行操作,并List<>通过另一个人为个人选择一封电子邮件ResultSetExtractor,并将其附加到foreach循环中.

有没有更好的方法,还是这样的好?

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)
);
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 12

这最好通过ORM解决.使用JDBC,您必须手动执行ORM为您执行的操作.执行N + 1个查询效率非常低.您应该执行单个查询,并手动构建对象.繁琐但不难:

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();
Run Code Online (Sandbox Code Playgroud)