有一种很好的方法可以在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);
如果不写出许多不同的查询,我怎样才能实现呢?
答案 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);
}
或者你可以像我一样写一个“NamedPreparedStatement”。 (https://gist.github.com/1978317)
答案 1 :(得分:0)
你做不到。准备好的声明的重点是它是“准备好的” - 这意味着它被解析(由驱动程序或服务器),并且每次运行所做的只是提供参数。
您尝试编写的代码也将成为其他任何人都可以关注的噩梦。如果你只是把它搞砸并写下查询就会更清洁。 (或使用ORM工具。)
答案 2 :(得分:0)
另一个解决方案是使用“更多面向对象的方法”,使用Hibernate Criteria API允许您动态创建查询(典型用途是带有许多参数的搜索查询),但我不知道您使用的技术堆栈。 / p>