gpt4 book ai didi

java - 使用 JdbcTemplate 将关系数据库映射到每个包含一个 List 的 List
转载 作者:太空宇宙 更新时间:2023-11-03 10:50:21 26 4
gpt4 key购买 nike

我正在使用带有 JdbcTemplate 和 MySQL 数据库的 Spring MVC。

假设我有以下 2 个表:

table_school

ID    NAME

table_students

ID    NAME    ADDRESS    SCHOOL_ID

我有一个具有以下类变量的 School POJO:

int id, String name, List<Student> students

有没有一种方法可以在一个查询中使用 JdbcTemplate 来检索每个 School 对象包含适当的 Student 对象列表的列表?我知道这很容易使用 Hibernate 实现,但我想使用 JdbcTemplate ..

非常感谢!

最佳答案

是的,您可以在 1 个查询中获取所有数据。

简单示例:

class Student {
int id;
String name;
String addr;

Student(int id, String name, String addr) {
this.addr = addr;
this.id = id;
this.name = name;
}
}

class School {
int id;
String name;
List<Student> students = new ArrayList<>();

School(int id, String name) {
this.id = id;
this.name = name;
}

void addStudent(Student s) {
students.add(s);
}
}

/*
* helper method that gets school from map or create if not present
*/
private School getSchool(Map<Integer, School> schoolMap, int id, String name) {
School school = schoolMap.get(id);
if (school == null) {
school = new School(id, name);
schoolMap.put(id, school);
}
return school;
}

// RUN QUERY

String sql =
" select st.ID, st.NAME, st.ADDRESS. s.id, s.name" +
" from table_students st" +
" inner join table_school s on st.school_id = s.id";

final Map<Integer, School> schoolMap = new HashMap<>();

jdbcTemplate.query(sql, new RowCallbackHandler() {

@Override
public void processRow(ResultSet rs) throws SQLException {

int studentId = rs.getInt(1);
String studentName = rs.getString(2);
String studentAddr = rs.getString(3);
int schoolId = rs.getInt(4);
String schoolName = rs.getString(5);

Student student = new Student(studentId, studentName, studentAddr);

getSchool(schoolMap, schoolId, schoolName).addStudent(student);
}
});

关于获取性能的最后一点:

如果您希望获取很多记录,那么增加jdbc fetch size 参数几乎总是一个好主意。所以在运行查询之前将其设置在您的 jdbcTemplate 上:

jdbcTemplate.setFetchSize(200);  // you can experiment with this value

或者如果你使用的是 spring 的 JdbcDaoSupport,你可以使用这样的模式:

public class MyDao extends JdbcDaoSupport {

....

@Override
protected void initTemplateConfig() {
getJdbcTemplate().setFetchSize(200);
}

}

关于java - 使用 JdbcTemplate 将关系数据库映射到每个包含一个 List<Object> 的 List<Object>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25727099/

26 4 0