You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 13:53:23