是否可以在运行时创建Java模型对象并动态映射Spring Batch Reader中的字段?

时间:2019-06-03 22:43:53

标签: java spring reflection spring-batch spring-jdbc

我们正在尝试使春季批处理工作更加通用。在此过程中,我们还希望使在读取器,处理器和写入器之间传递的模型对象具有通用性/动态性。 如果我们将表名,列名,类型名存储在数据库中,并在运行时获取此信息,我们将能够动态创建模型类,映射在读取器中读取的数据并将其传递跟作家在一起?

是否可以在运行时创建MyClass并根据配置进行映射? RowMapper不接受泛型吗? 那么,如何在代码中指定它却又没有在运行时实际拥有一个已编译的类呢?

公共类MyRowMapper实现RowMapper {

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

    MyClass myClass= new MyClass();
            myClass.setName(rs.getString("Name"));
            myClass.setNumber(rs.getLong("Number"));
    return myClass;
}

}

1 个答案:

答案 0 :(得分:2)

  

我们将能够即时创建模型类,映射在读取器中读取的数据并将其传递给写入器吗?

是的,使用字节码库,您可以在运行时创建类,然后使用反射分配值,然后将对象传递给周围,但是重点是什么?

如果没有代码提前知道对象,那么即使使用数据的代码也需要使用反射来访问数据。

您也可以只使用Map<String, Object>。或者是一些包装类,如果您也需要携带元数据(例如,值为null时的值类型)。

Spring已经可以为您完成此任务。例如。 JdbcTemplate,而不是致电

<T> List<T> query(String sql, Object[] args, RowMapper<T> rowMapper)

您可以致电

List<Map<String,Object>> queryForList(String sql, Object... args)