我从here获取示例,将ResultSet
映射到Object
,效果很好,但后来我意识到了一个问题,我无法映射{{来自连接查询的1}}。例如,我有两个表,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
可能是一个解决方案,但采用Hibernate似乎需要做很多工作,而且我只熟悉纯SqlResultSetMapping
。从示例here开始,看起来我需要重写所有查询语句并将我的数据库结构放在Java
中。
有没有其他方法可以将加入的Java
映射到一个对象而不会对当前代码造成太多混乱?
EDITED
查询是这样的;
ResultSet
我希望将其映射回select * from usr join vehicle on usr.id = vehicle.user_id;
对象
答案 0 :(得分:1)
让我们以一种全新的方式打破整个事物。您所遵循的方法很方便,但也有局限性。它只处理原始类型的字段。但是,与db中的其他对象或表关联的类作为外键映射呢?就像您拥有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);