Java上的PreparedStatement和设置参数的概率

Java上的PreparedStatement和设置参数的概率,java,mysql,prepared-statement,Java,Mysql,Prepared Statement,在java中,有一种很好的方法可以使用预先准备好的语句,其中有可能设置或不设置某些参数 假设我有一个完整的查询,如下所示: 从表1中选择*,其中字段1='..'和字段2='..'和字段3='..' 然后在我的程序中,我想做类似的事情(我知道我写的方式是不可能的) 如果不编写许多不同的查询,如何实现它?你不能。prepared语句的全部要点是它是“prepared”的,这意味着它被解析(由驱动程序或服务器解析),每次运行所做的就是提供参数 您试图编写的代码对其他人来说也是一场噩梦。如果你只是把它吸

在java中,有一种很好的方法可以使用预先准备好的语句,其中有可能设置或不设置某些参数

假设我有一个完整的查询,如下所示:

从表1中选择*,其中字段1='..'和字段2='..'和字段3='..'

然后在我的程序中,我想做类似的事情(我知道我写的方式是不可能的)


如果不编写许多不同的查询,如何实现它?

你不能。prepared语句的全部要点是它是“prepared”的,这意味着它被解析(由驱动程序或服务器解析),每次运行所做的就是提供参数


您试图编写的代码对其他人来说也是一场噩梦。如果你只是把它吸起来,写下查询,它会干净得多。(或使用ORM工具。)

另一个解决方案是使用Hibernate使用“更面向对象的方法”,它允许您动态创建查询(典型的用法是使用多个参数的搜索查询),但我不知道您使用的是什么技术堆栈

String query = "SELECT * FROM Table1 WHERE 1=1";

if (Field1Var != Value1) {
    query += " AND Field1 = ? ";
}

if (Field2Var != Value2) {
    query += " AND Field2 = ? ";
}

if (Field3Var != Value3) {
    query += " AND Field3 = ? ";
}

PreparedStatement s = conn.prepareStatement(query); 

int i = 0;

if (Field1Var != Value1) {
    s.setString(++i, Field1Var);
}

if (Field2Var != Value2) {
    s.setString(++i, Field2Var);
}

if (Field3Var != Value3) {
    s.setString(++i, Field3Var);
}
  • 使用附加条件1=1
  • 使用计数器变量

  • 或者你可以像我一样写一个“NamedPreparedStatement”。(https://gist.github.com/1978317)

    是的,我知道,但如果我的查询可以或不能基于某些预LC有一些条件,我如何安全地转义输入?我使用preparedstatement正是为了这个目的……preparedstatement(或者更具体地说,使用“?”的参数替换,您可能可以从其他JDBC类中获得,我不记得了)正是避免SQL注入攻击的正确方法。但是(正如我对另一个答案的评论,它只是将if语句变成了一个循环),你所做的就是在一个准备好的语句上设置参数,然后扔掉它并创建一个新的语句。prepared语句的API将(正确地)不允许您做您想做的事情。@dty-您是否有一个链接可以帮助进一步解释这一点?Marcx可以通过使用多个prepared语句来完成一些事情吗?假设已知哪些字段可能丢失?无论如何,我删除了我的答案。您可以创建一个存储过程并使用参数执行该过程。我不喜欢您的答案,因为它不会回答我的问题。其次,但同样重要的是,您不能在准备语句之前设置变量。。。所以setString方法返回一个错误,因为没有?而且你不能调用没有参数的prepareStatement方法…很抱歉,现在它应该可以工作了。但我想我还是不明白你的问题。
    String query = "SELECT * FROM Table1 WHERE 1=1";
    
    if (Field1Var != Value1) {
        query += " AND Field1 = ? ";
    }
    
    if (Field2Var != Value2) {
        query += " AND Field2 = ? ";
    }
    
    if (Field3Var != Value3) {
        query += " AND Field3 = ? ";
    }
    
    PreparedStatement s = conn.prepareStatement(query); 
    
    int i = 0;
    
    if (Field1Var != Value1) {
        s.setString(++i, Field1Var);
    }
    
    if (Field2Var != Value2) {
        s.setString(++i, Field2Var);
    }
    
    if (Field3Var != Value3) {
        s.setString(++i, Field3Var);
    }