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

Spring Batch StoredProcedureItemReader仅使用输出参数读取StoredProc(没有输入参数)

濮阳振
2023-03-14
<bean id="spItemReader">
    class="org.springframework.batch.item.database.StoredProcedureItemReader" >
    <property name="dataSource" ref="dataSource"/>
    <property name="procedureName" value="mynamespace.spname"/>
    <property name="refCursorPosition" value="1"></property>
    <property name="rowMapper">
        <bean class="MyRowMapper"/>
    </property>
    <property name="parameters">
        <list>
            <bean class="org.springframework.jdbc.core.SqlParameter">
                <constructor-arg index="0" value="column1"/>
                <constructor-arg index="1">
                    <util:constant static-field="java.sql.Types.SMALLINT"/>
                </constructor-arg>
            </bean>
            <bean class="org.springframework.jdbc.core.SqlParameter">
                <constructor-arg index="0" value="P_column2"/>
                <constructor-arg index="1">
                    <util:constant static-field="java.sql.Types.VARCHAR"/>
                </constructor-arg>
            </bean>
            <bean class="org.springframework.jdbc.core.SqlParameter">
                <constructor-arg index="0" value="P_column3"/>
                <constructor-arg index="1">
                    <util:constant static-field="java.sql.Types.INTEGER"/>
                </constructor-arg>
            </bean>
            <bean class="org.springframework.jdbc.core.SqlParameter">
                <constructor-arg index="0" value="P_column4"/>
                <constructor-arg index="1">
                    <util:constant static-field="java.sql.Types.CHAR"/>
                </constructor-arg>
            </bean>
        </list>
    </property>
</bean>

我将dataSource作为org.springframework.jdbc.dataSource.DriverManagerDataSource的实例,并以com.ibm.db2.jcc.db2Driver作为驱动程序类连接到DB2

我的作业配置如下:

<job id="testJob" xmlns="http://www.springframework.org/schema/batch">
    <step id="step1">
        <tasklet>
            <chunk reader="spItemReader" writer="eventItemWriter"
                commit-interval="1" />
        </tasklet>
    </step>
</job>

<bean id="jobRepository"
    class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
    <property name="transactionManager" ref="transactionManager" />
</bean>

<bean id="transactionManager"
    class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />

<bean id="jobLauncher"
    class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
    <property name="jobRepository" ref="jobRepository" />
</bean>

我有writer作为StaxEventitemWriter和正确的Unmarshaller配置。

我不确定我遗漏了什么,请告诉我该如何修复这个问题。如果需要更多的信息,请让我知道。

共有1个答案

郝杰
2023-03-14

最后,我自己找到了一个解决办法。Spring Batch API提供的StoredProcedureItemReader提供了PreparedStatementSetter,它必须被类型化为CallableStatement。因为StoredProcedures不能使用PreparedStatements。我们必须通过为PreparedStatementSetter提供自定义实现来重写setValues方法。下面是配置的外观。

注意:property name=“PreparedStatementSetter”ref=“ParamSet”

代码:

<bean id="spItemReader"
 class="org.springframework.batch.item.database.StoredProcedureItemReader" >
<property name="dataSource" ref="dataSource"/>
<property name="procedureName" value="mynamespace.spname"/>
<property name="refCursorPosition" value="1"></property>
 <property name="preparedStatementSetter" ref="paramSet" ></property>  
<property name="rowMapper">
    <bean class="MyRowMapper"/>
</property>
<property name="parameters">
    <list>
        <bean class="org.springframework.jdbc.core.SqlParameter">
            <constructor-arg index="0" value="column1"/>
            <constructor-arg index="1">
                <util:constant static-field="java.sql.Types.SMALLINT"/>
            </constructor-arg>
        </bean>
        <bean class="org.springframework.jdbc.core.SqlParameter">
            <constructor-arg index="0" value="P_column2"/>
            <constructor-arg index="1">
                <util:constant static-field="java.sql.Types.VARCHAR"/>
            </constructor-arg>
        </bean>
        <bean class="org.springframework.jdbc.core.SqlParameter">
            <constructor-arg index="0" value="P_column3"/>
            <constructor-arg index="1">
                <util:constant static-field="java.sql.Types.INTEGER"/>
            </constructor-arg>
        </bean>
        <bean class="org.springframework.jdbc.core.SqlParameter">
            <constructor-arg index="0" value="P_column4"/>
            <constructor-arg index="1">
                <util:constant static-field="java.sql.Types.CHAR"/>
            </constructor-arg>
        </bean>
    </list>
</property>
</bean>

<bean id="paramSet" class="com.jpmc.ib.asup.batch.CustomSPParamSetter" ></bean>
public class CustomSPParamSetter implements PreparedStatementSetter{

@Override
public void setValues(PreparedStatement ps) throws SQLException {

    CallableStatement eventCallableSt=(CallableStatement)ps;
    eventCallableSt.registerOutParameter(1, java.sql.Types.SMALLINT);
    eventCallableSt.registerOutParameter(2, java.sql.Types.VARCHAR);
    eventCallableSt.registerOutParameter(3, java.sql.Types.INTEGER);
    eventCallableSt.registerOutParameter(4, java.sql.Types.CHAR);
}
}
 类似资料:
  • 我正在学习如何使用Mybatis。老实说,我很喜欢这个框架。它很容易使用,我对它很满意,因为我可以使用它的sql命令:)我使用MyBatis 3.4.2和PostgreSQL数据库。 例如,我喜欢在插入之前使用注释执行查询是多么容易。如果我在接口方法之前添加一些注释,那么数据映射就像一个迷人的例子,比如:。 我不喜欢的(我希望你能把我引向正确的方向)有以下几点: 使用JDBC时,我需要做到以下几点

  • 我试图将两个数组和一个整数从另一个方法引入到写入文件的方法中。我试着用论据来解释,但没有用。希望你能帮忙 这是我如何传递参数从方法持有arry信息。 此方法旨在使用传递的数组参数创建文件。 这是读取文件的方法 请你能告诉我哪里出了问题,我如何创建一个文件,保存数组并稍后读取文件。 *************编辑代码******************** { }公共静态无效读取()抛出IOExce

  • 出于我无法控制的原因,我必须在我的C代码中实现这个函数: 调用此函数时,编译器是否忽略它,或者是否仍然进行调用?例如: 两行代码的执行时间是相同的,还是第一行需要更长的时间?

  • 在Camunda Modeler中,我向[user_task]添加了一个输出参数(命名为out)。 问:在通过以下方式完成任务之前,如何通过Java API设置输出参数: 在[exclusive_gateway]箭头上,我设置了以下内容: 那么,我是可以通过Java API设置任务的输出参数,还是只能使用过程变量呢?

  • 问题内容: 我想从查询中获取ID,但是我得到的是NULL,我的错误在哪里? 为什么@Id参数始终为null?我看不到我的错误? 问题答案: 首先,选择所希望的使用的输出变量然后分配该中值使用可变。另外,您应该使用变量在where子句中传递数据,以避免类似sql的注入问题(即,您不应像那样将其串联起来)。试试这个 : 在这里查看详细信息

  • return语句可用于仅从函数返回一个值。 但是,使用output parameters ,您可以从函数返回两个值。 输出参数与参考参数类似,不同之处在于它们将数据传输出方法而不是传输到方法中。 以下示例说明了这一点 - using System; namespace CalculatorApplication { class NumberManipulator { public