gpt4 book ai didi

java - 如何将连接的 ResultSet 映射到 java 中的对象?

转载 作者:行者123 更新时间:2023-12-02 12:20:48 26 4
gpt4 key购买 nike

我从 here 中获取了示例将 ResultSet 映射到 Object ,效果很好,但后来我意识到一个问题,我无法从联接映射 ResultSet询问。例如,我有两个表,usrvehicle。我执行 select 查询并将这两个查询连接起来。

public class Usr {
public int id;
public Vehicle vehicle;
}

public class Vehicle {
public int id;
public int year;
public String model;
public int user_id;
}

如何将 ResultSet 映射到 Usr 对象?我用谷歌搜索了一下,发现SqlResultSetMapping可能是一个解决方案,但采用Hibernate似乎需要做很多工作,而且我只熟悉纯Java。从示例here ,看起来我需要重写所有查询语句并将我的数据库结构放入 Java 中。

是否有其他方法可以将连接的 ResultSet 映射到对象,而不会对当前代码造成太多困惑?

已编辑

查询是这样的;

select * from usr join vehicle on usr.id = vehicle.user_id;

我想将其映射回 Usr 对象

最佳答案

让我们以新的方式打破整个事情。您遵循的方法很方便,但有局限性。它仅处理字段的原始类型。但是,与数据库中的其他对象或表关联作为外键映射的类又如何呢?就像您有 Usr 类的情况一样,其中您有 Vehicle 作为关联关系。

您可以在类中编写映射逻辑,然后在必要时重用它,而不是以过于通用的方式进行映射。

编写一个RowMapper抽象类

public abstract class RowMapper<E> {

public List<E> processResultSet(ResultSet rs) throws SQLException {
List<E> objectList = new ArrayList<>();

while(rs.next()) {
objectList.add(mapRow(rs));
}

return objectList;
}

abstract E mapRow(ResultSet rs) throws SQLException;
}

现在为 Usr 类编写行映射逻辑

public class UsrMapper extends RowMapper<Usr> {

@Override
public State mapRow(ResultSet rs, int rowNum) throws SQLException {

Usr usr = new Usr();
Vehicle vehicle = new Vehicle();

usr.setId(rs.getInt("usr.id"));
vehicle.setId(rs.getInt("vehicle.id"));
vehicle.setYear(rs.getInt("vehicle.year"));
vehicle.setModel(rs.getString("vehicle.model"));

usr.setVehicle(vehicle);

return usr;
}
}

您还可以为 Vehicle 实现另一个 RowMapper。现在它只是使用它的一种方法。

假设您从以下联接查询中获取了 ResultSet

select usr.id, vehicle.id, vehicle.year, vehicle.model from usr join vehicle on usr.id = vehicle.user_id;

现在

UsrMapper usrMapper = new UsrMapper();
List<Usr> usrList = usrMapper.processResultSet(resultSet);

关于java - 如何将连接的 ResultSet 映射到 java 中的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45809693/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com