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

时间:2017-08-22 05:43:54

标签: java hibernate jdbc

我从here获取示例,将ResultSet映射到Object,效果很好,但后来我意识到了一个问题,我无法映射{{来自连接查询的1}}。例如,我有两个表,ResultSetusr。我做了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; 对象

1 个答案:

答案 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);