JDBC模板 – 一对多
我有一个看起来像这样的课程。 我需要从两个数据库表中填充它,如下所示。 有没有首选的方法呢?
我的想法是有一个服务类来通过DAO的ResultSetExtractor
选择List
。 然后在该列表上执行foreach
,并通过另一个ResultSetExtractor
为个人选择List
电子邮件,并使用foreach
循环将其附加。
有没有更好的方法,还是这样的好?
public class Person { private String personId; private String Name; private ArrayList emails; } create table Person ( person_id varchar2(10), name varchar2(30) ); create table email ( person_id varchar2(10), email varchar2(30) );
这最好通过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 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 persons = personsById.values();