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

2024-04-09

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

我的代码对于静态查询效果很好。 例子:select emp_id, emp_name from employee_table我有一个 RowMapper 类,它将 resultSet 中的值与 Employee POJO 进行映射。

我的要求是

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

  1. select emp_id, emp_name from employee_table
  2. select cust_id, cust_name, cust_age from customer_table
  3. select door_no, street_name, loc_name, city from address_table
  4. Similar queries

我的问题是

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

示例代码将不胜感激。


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

考虑使用自定义实现为 SQL 指定别名以匹配对象字段名称RowMapper这实际上延伸了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拿回地图(Map<String,Object>)的列名(我们称它们为 COL_A、COL_B、COL_C)到值。那么如果你的作家是这样的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);
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring:用于动态查询的通用 RowMapper 的相关文章

随机推荐

  • 无法启动服务器:绑定到 TCP/IP 端口:无法分配请求的地址 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我昨天重新启动了服务器 不幸的是mysql现在无法启动 错误日志如下 root site digger var log mysql cat error
  • Swift SpriteKit:在 GameScene 中访问 UIViewController 的最佳实践[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我想了解从 GameScene 访问 UIViewController 方法的最佳实践是什么 现在我一直在使用 NSNotificationCe
  • Asp.net Button 组件在 Twitter-Bootstrap 主题下不起作用

    我一直在为我的 asp net 网站主题使用 twitter bootstrap 并且在尝试让一个简单的按钮执行事件时遇到了一些麻烦 该按钮是一个 asp 组件 从我在论坛中读到的内容来看 bootstrap 不能很好地管理 asp net
  • 在随机端口上运行微服务时,Eureka 无法找到端口

    我在 Spring Boot 应用程序中使用 eureka 进行服务发现 使用功能区进行负载平衡 当我在修复端口上运行在 eureka 注册的微服务时 它工作正常 但是当我在随机端口上运行它们时 尽管我可以看到在 eureka 仪表板上注册
  • 将 Link 组件与 ListItem 和 Typescript 结合使用

    我正在使用material ui v3 5 1 我想让 ListItem 使用 Link 组件 如下所示
  • Mac 上的 USB 调试 Moverio

    我刚刚买了一台 Moverio BT 100 Epson 看起来就像一个纸袋一样有用 有没有人设法让 USB 调试 ADB 在 Mac 上看到它 Burf 您必须转到 android 文件夹 要找到它 只需打开终端并写入 cd cd and
  • 将随机范围从 1–5 扩大到 1–7

    给定一个产生 1 到 5 范围内的随机整数的函数 编写一个产生 1 到 7 范围内的随机整数的函数 这相当于 Adam Rosenfield 的解决方案 但对于某些读者来说可能更清楚一些 它假设 rand5 是一个返回 1 到 5 含 范围
  • 仅 React-Bootstrap 关闭按钮样式不起作用

    对于我与 React Bootstrap 一起使用的所有组件 所有样式都有效 除了模态 警报等中内置的关闭按钮 示例如下 警报组件 预期 我看到的警报组件 模态组件 预期 我看到的模态组件 我正在使用的构建在 React Bootstrap
  • 覆盖自定义 UITableViewCell

    我有一个习惯UITableViewCell我这样使用 AppTableCell cell tableView dequeueReusableCellWithIdentifier CellIdentifier if cell nil NSAr
  • 从动词列表中检索动词

    我有一个全是动词的字符串列表 我需要获取每个动词的词频 但我想将 想要 想要 想要 和 想要 等动词计为一个动词 形式上 动词 被定义为 4 个单词的集合 其形式为 X Xs Xed Xing 或形式为 X Xes Xed Xing 其中
  • Excel VBA - 工作表属性未按应有的方式分配字段

    VBA 新手 尝试使用 Sheet 属性 就像在 OOP 语言中使用 Getters 和 Setters 一样 我在 Sheet1 中有以下代码 为了清晰起见 进行了简化 Option Explicit Private bAllowChan
  • NSArray或NSMutableArray的removeAllObjects方法会释放内存吗?

    我需要知道 NSArray 或 NSMutableArray 的 removeAllObjects 方法是否释放内存 如果我的数组有 10000 个元素 我可以使用 array removeAllObjects 释放内存并用其他元素重新加载
  • 获取服务器端时间和客户端时间之间的差异并显示它[重复]

    这个问题在这里已经有答案了 可能的重复 如何将 JavaScript 倒计时与服务器时间同步 https stackoverflow com questions 5357719 how to sync a javascript countd
  • 在 Glide 中查找并加载缓存的图像

    我是 glide 新手 想要将我的应用程序从 universalimageloader 迁移到 glide 我想将磁盘上的缓存图像转换为图像文件 并将其显示到 ImageView 中 当我使用universalimageloader时 我可
  • 100% CSS 布局,带页眉和页脚

    我正在尝试创建一个带有页眉和页脚 两者都有固定高度 以及它们之间的内容 div 的布局 该内容填充剩余空间 在 content div 中 我想要具有基于百分比值的高度的 div 以 content div 的 heihgt 作为父级 我不
  • 如何在 NS-3/ndnSIM 中模拟过程延迟?

    我想在发送兴趣包之前在消费者节点上添加一些进程延迟 我发现 Simulator Schedule 函数可以实现这个目的 但我不确定如何使用它 因为 ndnSIM 有自己的协议流程 如果我安排一个新事件 可能会导致一些意外的结果 或者是否有其
  • Swig:将Java中的字节数组传递给C

    我正在尝试创建 Java 实现 以便使用 Swig 将 byte 传递给 C Swig include typemaps i apply char STRING int LENGTH char buff int len inline typ
  • Java EE 5 和 Hibernate

    我可以将哪个版本的 Hibernate 与 Java EE 5 一起使用 我可以使用最新版本吗 See http www hibernate org http www hibernate org 它说最新的4 1 4版本可以与Java EE
  • 带列的数据透视表 pandas 中的百分比计算

    我有一个数据集 其中包含来自不同供应商 地点 日期和产品的多个销售登记册 数据集是这样的 local categoria fabricante tipo consistencia peso pacote ordem vendas kg AR
  • Spring:用于动态查询的通用 RowMapper

    我正在使用 SpringBatch 从 Oracle 读取数据并将其写入 ElasticSearch 我的代码对于静态查询效果很好 例子 select emp id emp name from employee table我有一个 RowM