如何在Java的SQL查询字符串中添加占位符并动态传参?
解决方案
完全可以将日期参数作为方法入参传入,用?作为SQL占位符是正确且推荐的做法——这是JDBC预编译语句的标准用法,既能实现参数动态传递,还能避免SQL注入风险。
步骤1:修改SQL常量
将固定日期的to_date('22-05-2024','dd-mm-yyyy')替换为占位符?(如果你的dataAccessService支持直接传入日期类型参数,无需保留to_date,JDBC会自动处理类型转换):
private static final String QUERY_5 = "select * from ESTERO.VW_EST_MARGINI_INVIO_MIDA_Q where 1=1 AND data_riferimento = ? and UPCV_CODE = 'UCV_EDCROEETLDFI' and mercato = 'MGP' and data_invio_forecast is not null";
如果必须传入字符串格式的日期,可改为to_date(?,'dd-mm-yyyy'),但推荐直接传入日期类型参数,避免格式解析错误。
步骤2:修改searchLimit方法,添加参数入参
调整方法签名,接收日期参数,并将参数传入dataAccessService.search的第三个参数(原null位置,用于传递SQL参数):
@Datasource(datasourceKey = EDatasourceKey.DAMASCO) public List<UpView> searchLimit(LocalDate dataRiferimento) { try { long startTime = System.currentTimeMillis(); log.debug("call searchLimit(): |{}|", startTime); // 将LocalDate转为JDBC支持的SQL Date(根据dataAccessService的参数要求调整) java.sql.Date sqlDate = java.sql.Date.valueOf(dataRiferimento); // 传入参数数组执行查询 List<UpView> result = dataAccessService.search(UpView.class, QUERY_5, new Object[]{sqlDate}, true, true); log.info("end searchLimit(): |{}|", System.currentTimeMillis() - startTime); return Assorted.notNull(result) ? result : null; } catch (Exception e) { log.error(e.getMessage(), e); return null; } }
关键说明
- 无需使用
StringBuilder拼接SQL,直接复用常量即可,预编译机制会自动替换占位符。 - 调用方法时,只需传入目标日期即可,例如:
searchLimit(LocalDate.of(2024,5,22))。
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

