作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我从 here 中获取了示例将 ResultSet
映射到 Object
,效果很好,但后来我意识到一个问题,我无法从联接映射 ResultSet
询问。例如,我有两个表,usr
和 vehicle
。我执行 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/
我是一名优秀的程序员,十分优秀!