Spring Batch JdbcBatchItemWriter报错:参数索引越界(S1009)求助
错误原因分析
出现Parameter index out of range(参数索引越界)和S1009错误,本质是JDBC参数绑定不匹配,你的代码存在以下核心问题:
SQL字段与参数数量不匹配
insert语句指定的列共14个:order_id, order_no, paid_at, paid_payment_id, pay_method, pay_no, pg, service_type, status, transaction_amount, transaction_at, vat_amount, canceled_at, created_at
但values段写了15个参数,数量完全不对等,导致JDBC无法正确绑定参数。参数名语法错误
values里的pg未加冒号:pg,被识别为SQL字面量而非参数占位符,打乱了后续参数的绑定顺序。同时使用两种互斥的参数提供方式
你既配置了BeanPropertyItemSqlParameterSourceProvider,又调用了CalculationOriginalAccountBooksItemPreparedStatementSetter(),这两种方式二选一即可,同时使用会导致参数绑定逻辑冲突。参数名与列/实体属性对应混乱
列order_id对应参数应为:orderId,但你values里第一个参数是:expectedCalculationAmount,参数名与列的对应关系完全错位,JDBC无法找到正确的绑定位置。
修复方案
1. 修正SQL语句
确保列数量与参数数量一致,参数名正确(加冒号),且参数名与BooksEntity属性一一对应:
private JdbcBatchItemWriter<BooksEntity> booksWriter() { return new JdbcBatchItemWriterBuilder<BooksEntity>() .itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>()) .dataSource(dataSource) .sql( "insert into books(order_id, order_no, paid_at, paid_payment_id, pay_method, pay_no, pg, service_type, status, transaction_amount, transaction_at, vat_amount, canceled_at, created_at) " + " values (:orderId, :orderNo, :paidAt, :paidPaymentId, :payMethod, :payNo, :pg, :serviceType, :status, :transactionAmount, :transactionAt, :vatAmount, :canceledAt, :createdAt)") .build(); }
2. 二选一参数提供方式
- 若无需自定义参数绑定,保留
BeanPropertyItemSqlParameterSourceProvider即可,它会自动根据实体类属性名匹配参数名。 - 若需要自定义绑定逻辑,去掉
itemSqlParameterSourceProvider,只用preparedStatementSetter,此时SQL需用?作为占位符:
private JdbcBatchItemWriter<BooksEntity> booksWriter() { return new JdbcBatchItemWriterBuilder<BooksEntity>() .preparedStatementSetter(new CalculationOriginalAccountBooksItemPreparedStatementSetter()) .dataSource(dataSource) .sql( "insert into books(order_id, order_no, paid_at, paid_payment_id, pay_method, pay_no, pg, service_type, status, transaction_amount, transaction_at, vat_amount, canceled_at, created_at) " + " values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)") .build(); }
3. 验证实体类属性
确保BooksEntity存在对应属性:orderId、orderNo、paidAt、paidPaymentId、payMethod、payNo、pg、serviceType、status、transactionAmount、transactionAt、vatAmount、canceledAt、createdAt,属性名需与SQL参数名完全匹配(大小写敏感,除非配置了驼峰转下划线规则)。
额外检查
- 确认MySQL驱动版本与Spring Batch版本兼容,避免版本冲突引发参数绑定异常。
- 可开启JDBC日志,查看实际执行的SQL和绑定的参数,进一步定位问题。
内容的提问来源于stack exchange,提问作者myeongsasoo

