在JdbcCursorItemReader读者类中编写大型查询的最佳或正确方法是什么?

时间:2018-07-08 15:50:02

标签: spring spring-boot spring-batch

我正在使用基于Spring Boot and Batch annotation的方法。我正在根据需要使用JdbcCursorItemReader读取表数据并将其写入CSV/XML/other表等中。

作为春季批处理的最佳实践,只是想了解我在JdbcCursorItemReader方法内创建SQL查询的方式的视图。是否有任何方法可以避免串联并遵循最佳方法,就像我们在基于XML的方法中所做的那样?

请让我知道以下编写SQL查询的方法是否是最佳方法?

基于注释的方法。

@Bean(destroyMethod="")
    public JdbcCursorItemReader<Orders> employeesReader(){
        JdbcCursorItemReader<Orders> itemReader = new JdbcCursorItemReader<>();
        itemReader.setDataSource(dataSource);
        itemReader.setSql("SELECT orderNumber, productName, msrp, priceEach "
                + "FROM products p "
                + "INNER JOIN orderdetails o "
                + "ON p.productcode = o.productcode "
                + "AND p.msrp > o.priceEach "
                + "WHERE p.productcode = ? ");
        itemReader.setRowMapper(new OrdersRowMapper());
        itemReader.setIgnoreWarnings(true);

        return itemReader;
    }

可以使用无需连接运算符的基于XML的方法来完成相同的XML

<bean id="ordersItemReader" class="org.springframework.batch.item.database.JdbcCursorItemReader" scope="step" >
    <property name="dataSource" ref="dataSource" />
    <property name="sql">
        <value>
            SELECT orderNumber, productName, msrp, priceEach
            FROM products p INNER JOIN orderdetails o ON p.productcode = o.productcode
            AND p.msrp > o.priceEach
            WHERE p.productcode =  '#{stepExecutionContext[productcode]}';
        </value>
    </property>
    <property name="rowMapper">
        <bean class="com.XXXX.mapper.OrdersRowMapper" scope="step" />
    </property>
</bean>

在我的项目中,我们使用的是基于注释的方法,因此需要相关指导。

2 个答案:

答案 0 :(得分:1)

如何使用XML properties file?我也喜欢干净的查询,将它们放在一个地方特别好。

只需使用名为entry的{​​{1}}并将查询作为orderQuery来创建XML。

然后,您可以使用普通的key加载XML属性,并使用@PropertySource@Configuration @Bean将其注入到@Value("${orderQuery}中。

希望有帮助!

答案 1 :(得分:0)

我个人认为一致性是要遵循的原则。如果在项目中使用批注,请使用基于批注的方法。否则,对于新手来说,要理解为什么要混合使用xml和注释是很棘手的(可能对此有些神圣的含义)。从可读性的角度来看,我看不出太大差别。

P.S。顺便说一句,我更喜欢在方法上放置@StepScope注释,而不是(destroyMethod =“”)