JDBC 模板 - 一对多

2022-09-03 14:17:45

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

我的想法是有一个服务类来从DAO中选择一个via a。然后在该列表中做一个,并通过另一个人为个人选择一封电子邮件,并将其与循环一起附加。List<>ResultSetExtractorforeachList<>ResultSetExtractorforeach

有没有更好的方法,或者它是否尽可能好?

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)
);

答案 1

这最好通过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();

答案 2

我正在寻找类似的东西,虽然答案是完全有效的,但我选择了这个漂亮的库,而不是 https://simpleflatmapper.org/0203-joins.html

它还与弹簧靴完美集成。

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

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


推荐