Spring Batch读取SQL表时Reader初始化失败问题排查
问题根源定位
从栈追踪的核心异常java.sql.SQLSyntaxErrorException: Unknown column 'PASS' in 'where clause'可以直接锁定问题:
你拼接SQL时直接将字符串变量str的值"Pass"拼入语句,生成的SQL为select Stu_info FROM myTable where status = PASS,数据库会把PASS识别为列名而非字符串值,因此抛出“未知列”错误,最终导致Reader初始化失败。
另外代码里存在语法错误:字符串使用了中文引号“,需替换为英文双引号",否则会引发编译或运行异常。
修复方案
方案1:参数绑定(推荐,安全防注入)
不要直接拼接字符串,使用Spring Batch的参数绑定功能,修改JdbcCursorItemReader配置:
@Configuration @EnableBatchProcessing public class BatchConfing { private MyRepo myRepo; @Autowired private JobBuilderFactory jbf; static String str = "Pass"; // 替换为英文引号 private static final String QUERY_FIND_STUDENTS = "select " + "Stu_info" + // 替换为英文引号 " FROM myTable " + " where status = :status"; // 使用命名参数占位符 @Autowired private DataSource dataSource; @Bean public ItemReader<StudentDTO> itemReader() { return new JdbcCursorItemReaderBuilder<StudentDTO>() .name("cursorItemReader") .dataSource(dataSource) .sql(QUERY_FIND_STUDENTS) .parameterValues(Collections.singletonMap("status", str)) // 绑定参数值 .rowMapper(new BeanPropertyRowMapper<>(StudentDTO.class)) .build(); } // 其余Bean代码保持不变 }
方案2:手动添加单引号(不推荐,存在SQL注入风险)
如果必须拼接字符串,需给变量值包裹单引号:
private static final String QUERY_FIND_STUDENTS = "select " + "Stu_info" + " FROM myTable " + " where status = '" + str + "'"; // 给字符串值加单引号
重要提示
- 禁止直接拼接变量到SQL语句中,这会带来SQL注入风险,参数绑定是标准安全做法。
- 代码中的标点符号必须使用英文格式,中文引号、逗号等都会引发语法错误。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

