gpt4 book ai didi

java - Spring:用于动态查询的通用 RowMapper

转载 作者:行者123 更新时间:2023-12-03 22:47:48 24 4
gpt4 key购买 nike

我正在使用 SpringBatch 从 Oracle 读取数据并写入 ElasticSearch。

我的代码适用于静态查询。示例:select emp_id, emp_name from employee_table 我有一个 RowMapper 类,它将 resultSet 中的值与 Employee POJO 进行映射。

我的要求是

查询将由用户输入。所以查询可能如下

  1. 从employee_table中选择emp_id、emp_name
  2. 从 customer_table 中选择 cust_id、cust_name、cust_age
  3. 从 address_table 中选择 door_no、street_name、loc_name、city
  4. 类似查询

我的问题是

  1. 有没有办法根据用户给出的查询动态创建POJO?
  2. 如果查询像我的情况一样不断变化,RowMapper 概念会起作用吗?
  3. 有类似通用行映射器的东西吗?

示例代码将不胜感激。

最佳答案

如果您有需要映射到的对象...

考虑使用 RowMapper 的自定义实现为您的 SQL 设置别名以匹配您的对象字段名称它实际上扩展了 BeanWrapperFieldSetMapper

如果你的 POJO 看起来像这样:

public class Employee {

private String employeeId;
private String employeeName;

...
// getters and setters

}

那么你的 SQL 可以如下所示:

SELECT emp_id employeeId, emp_name employeeName from employee_table

然后你的包裹RowMapper看起来像这样:

import org.springframework.jdbc.core.RowMapper
import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper

public class BeanWrapperRowMapper<T> extends BeanWrapperFieldSetMapper<T> implements RowMapper<T> {

@Override
public T mapRow(final ResultSet rs, final int rowNum) throws SQLException {
final FieldSet fs = getFieldSet(rs);
try {
return super.mapFieldSet(fs);
} catch (final BindException e) {
throw new IllegalArgumentException("Could not bind bean to FieldSet", e);
}
}

private FieldSet getFieldSet(final ResultSet rs) throws SQLException {
final ResultSetMetaData metaData = rs.getMetaData();
final int columnCount = metaData.getColumnCount();

final List<String> tokens = new ArrayList<>();
final List<String> names = new ArrayList<>();

for (int i = 1; i <= columnCount; i++) {
tokens.add(rs.getString(i));
names.add(metaData.getColumnName(i));
}

return new DefaultFieldSet(tokens.toArray(new String[0]), names.toArray(new String[0]));
}

}

或者...

如果您没有要映射到的 POJO,请使用开箱即用的 ColumnMapRowMapper取回列名(我们称它们为 COL_A、COL_B、COL_C)到值的映射( Map<String,Object> )。那么如果你的作者是 JdbcBatchItemWriter您可以将命名参数设置为:

INSERT TO ${schema}.TARGET_TABLE (COL_1, COL_2, COL_3) values (:COL_A, :COL_B, :COL_C)

然后是你的 ItemSqlParameterSourceProvider实现可能如下所示:

public class MapItemSqlParameterSourceProvider implements
ItemSqlParameterSourceProvider<Map<String, Object>> {

public SqlParameterSource createSqlParameterSource(Map<String, Object> item) {
return new MapSqlParameterSource(item);
}

}

关于java - Spring:用于动态查询的通用 RowMapper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37016843/

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