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

时间:2012-03-04 21:26:01

标签: java mysql prepared-statement

有一种很好的方法可以在java中使用预处理语句,有可能存在某些参数可以被设置的概率吗?

我们假设我有一个像这样的完整查询:

SELECT * FROM Table1 WHERE Field1='....' AND Field2='....' AND Field3='....'

然后在我的程序中我想做那样的事情(我知道我写的方式不可能)

// part of code where I have 3 variable set by some logic and the query itself
//.........

String Query = "SELECT * FROM Table1 WHERE Field1=? ";
PreparedStatement s = conn.prepareStatement();          
s.setString(1, Field1Var);

if (Field2Var != Value)
{
    Query += " AND Field2=? ";
    s.setString(2, Field2Var);
}

if (Field3Var != Value3)
{
    Query += " AND Field3=? ";
    s.setString(3, Field3Var);
}
s = conn.prepareStatement(query);   

如果不写出许多不同的查询,我怎样才能实现呢?

3 个答案:

答案 0 :(得分:1)

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 = 1.
  2. 使用计数器变量。
  3. 或者你可以像我一样写一个“NamedPreparedStatement”。 (https://gist.github.com/1978317)

答案 1 :(得分:0)

你做不到。准备好的声明的重点是它是“准备好的” - 这意味着它被解析(由驱动程序或服务器),并且每次运行所做的只是提供参数。

您尝试编写的代码也将成为其他任何人都可以关注的噩梦。如果你只是把它搞砸并写下查询就会更清洁。 (或使用ORM工具。)

答案 2 :(得分:0)

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