当前位置: 首页 > 知识库问答 >
问题:

Spring Batch--使用JDBCursorItemReader从数据源中读取并使用ResultSet

东方智敏
2023-03-14

我试图使用Spring Batch创建一个使用DataSource(配置之前)并运行查询的作业。我希望能够遍历返回的ResultSet,用返回的数据创建一个新表。

@Bean
public JdbcCursorItemReader<ResultSet> reader(String query, DataSource dataSource) {
    JdbcCursorItemReader<ResultSet> itemReader = new JdbcCursorItemReader<>();
    itemReader.setDataSource(dataSource);
    itemReader.setSql(query);
    return itemReader;
}

我的ItemProcessor应该收到什么?这个?

public class ExtractionItemProcessor implements ItemProcessor<ResultSet, String>{    
@Override
    public String process(ResultSet item) throws Exception {
        // transform the resultSet into a SQL INSERT
  }
}

编辑:我知道查询结果的唯一方法是ResultSet元数据,所以我不能创建POJO和设置属性。

共有1个答案

穆季萌
2023-03-14

创建一个POJO类来表示记录,例如foo:

public class Foo {
     private final long id;
     // more properties

     public Foo(long id // ,...) {
         this.id = id;
         // set other properties
     }

     public long getId() {
         return id;
     }
}

因此,阅读器将是JDBCursorItemReader

并创建rowmapper ,例如:

public FooRowMapper implements implements RowMapper<Foo> {

    @Override
    public Foo mapRow(ResultSet rs, int rowNum) throws SQLException {
        long id = rs.getLong("id");
        // more properties 
        return new Foo(id // more properties);
    }
}
public class ExtractionItemProcessor implements ItemProcessor<Foo, String>{    
@Override
    public String process(Foo item) throws Exception {
    int someValue = transform(foo);
    return "INSERT INTO blah blah blah..." + someValue + "...";  // potentially dangerous - see SQL injection attack
  }
}

为了更进一步,也许ExtractionItemProcessor转换foo应该创建bar。然后看起来像:

public class ExtractionItemProcessor implements ItemProcessor<Foo, Bar>{    
@Override
    public Bar process(Foo item) throws Exception {
    int someValue = transform(foo);
    // more values....
       return new Bar(someValue // more values);
  }
}

因此,ItemWriterimpelementation将获得列表 ,它知道如何安全地将bar插入到另一个表中。

 类似资料:
  • 我有一个springbatch应用程序,我将连接到一个网络数据库进行阅读。我发现的大多数示例都嵌入了数据库,用于独立测试。我不想那样做。我不确定配置是否类似。以下是我所拥有的最具德国特色的部分(带有一些异议): ,然后从应用程序启动: 我没有配置数据源。我不确定,因为我的基本上只是一个到远程网络数据库的客户端连接,它的配置是否会与我找到的各种示例的嵌入式设置不同。所以我自然会出错(如下)。我只是在

  • 我需要从数据库读取数据,并使用PIG分析数据。我用java编写了一个UDF,引用了下面的链接 org.apache.pig.impl.logicallayer.frontendException:错误1066:无法在org.apache.pig.pig.tools.grunt.gruntparser.openiterator(pigserver.java:892)在org.apache.pig.t

  • 问题内容: 我在通过火花流从天蓝色斑点读取数据时遇到问题 上面的代码适用于HDFS,但无法从Azure blob读取文件 上面是在azure UI中显示的路径,但是这行不通,我是否丢失了某些内容,以及如何访问它。 我知道Eventhub是流数据的理想选择,但是我目前的情况要求使用存储而不是队列 问题答案: 为了从Blob存储中读取数据,需要完成两件事。首先,您需要告诉Spark在基础Hadoop配

  • 问题内容: 我有一个MS-Access数据库,我正在使用JDBC(我认为是JDBC-ODBC桥)在Java中连接到该数据库。我的访问数据库有一些希伯来语值。 当我尝试使用String str = rs.getString(1)(rs是RowSet)读取这些值时,我得到的字符串只是一个问号字符串。 我还有希伯来语中的其他字符串,这些字符串是我在Java代码中使用字符串文字设置的,它们可以正常工作。所

  • 我有一些非常类似于下面的代码(我不得不做一些困惑)。我正在获取一个应用程序启动失败的错误。未显示的代码是datasource bean和spring boot application类。当我在debug中放置断点并运行所有bean时,所有bean似乎都被创建了,除了Job和Step bean,这两个bean似乎被完全跳过了。我不确定如何进一步诊断。似乎是一些Spring的魔法问题。任何想法都非常感

  • 问题内容: 是否可以将数据从Microsoft Sql Server(以及oracle,mysql等)读取到Spark应用程序中的rdd中?还是我们需要创建一个内存中的集合并将其并行化为RDD? 问题答案: 从邮件列表中找到了解决方案。可以使用JdbcRDD完成此操作。我需要获取MS Sql Server JDBC驱动程序jar并将其添加到项目的lib中。我想使用集成安全性,因此需要将sqljdb