JDBC模板-一对多

问题描述 投票:8回答:2

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

我的想法是要有一个服务类,以便从DAO中通过List<>选择ResultSetExtractor。然后在该列表上进行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)
);
java spring-jdbc
2个回答
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();

0
投票

我一直在寻找相似的东西,尽管答案是完全正确的,但我还是选择了这个不错的库https://simpleflatmapper.org/0203-joins.html

它还与Spring Boot完美集成。

主要优点是您拥有一个干净的存储库层,它使用您的pojo并使重构更加容易,并且像休眠状态一样,您仍然可以将深层嵌套和复杂的一对多映射,并且仍然可以控制执行的内容。

它也有一个不错的jdbctemplate CRUD,Java 13最终带来了对多行字符串文字的支持,这对于sql语句的可读性非常好。希望这对某人有帮助:)

© www.soinside.com 2019 - 2024. All rights reserved.