没有Prepared Statement的SQL中的转义字符

时间:2016-08-01 20:20:22

标签: java sql spring

我知道有很多问题专门问这个,但我不确定。我正在使用Spring Batch和FieldSetMapper,因此我将这些语句生成为字符串,并收集这些字符串并将它们传递给我的ItemWriter。从这个意义上讲,我不打算使用准备好的声明。这就是我所拥有的:

private static String insertStmt = "insert into ..." 
//this is the beginning of the insert statement. Not gonna type it all out

private String addStatement() {

    String values = String
            .format("values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' ESCAPE '\'')",
                    this.primCustNum, this.primCustName, this.mfstRptId,
                    this.shtlStpNum, this.primCustAddr1,
                    this.primCustAddr2, this.primCustCity,
                    this.primCustState, this.primCustPostalCde,
                    this.primCustPhoneNum);

    //log.info("INSERT+VALUES: {}", insertStmt + values);
    return insertStmt + values;

}

但这不会处理像这样的情况 insert into ... where values ('tony's place', ...); 因为tony's有一个撇号

2 个答案:

答案 0 :(得分:2)

看看这个答案: How to escape single quotes for SQL insert...when string to insert is in a user generated variable

在将insertStmt发送到insert之前,需要输入两个引号,如下所示:

  • this.primCustNum = this.primCustNum.replace(“'”,“''”);

答案 1 :(得分:-1)

只需创建另一个私有方法,将您的字符串作为参数并迭代它,如果检测到特殊字符,它将在char之前放置一个反斜杠并返回新字符串(使用这些反斜杠)。然后,在创建sql语句期间,而不是纯文本,使用您的文本作为参数调用此私有方法。