2009-10-03 114 views
2

假设我有一张有3列的表格:C1,C2,C3PreparedStatement:我可以提供列名作为参数吗?

我根据C1列进行搜索。 我可以做类似这样的东西(这是行不通的 - 因为这是不prepareStatement它的使用 :)的方式)

String c;// the name of the column 

...  
String sql = "select * from table where ? = ?"; 
       pre = con.prepareStatement(sql); 
       pre.setString(1, c); 
       pre.setString(1, i); 
       rs = pre.executeQuery(); 

主要的想法,我不希望有每列有3个ifs。优雅的解决方案?

+0

不应该是..... pre.setString(1,'c1'); pre.setString(2,i); – 2009-10-03 22:15:47

+0

我做了更正。 :) – 2009-10-03 22:19:14

回答

2

你可以编写了一组SQL查询,并将它们存储在一张地图,然后抓住基于所涉及的专栏之一。

enum column { a, b, c} 

Map<column, string> str; 

static { 
str.put(a, "select * from tbl where a = ? "); 
... 
} 

然后根据枚举稍后抓取一张地图。在sql语句中附加字符串有一种成为未来安全问题的方式。

0

你不能做到这一点:

String c;// the name of the column 

...  
String sql = "select * from table where " + c + " = ?"; 
       pre = con.prepareStatement(sql); 
       pre.setString(1, i); 
       rs = pre.executeQuery(); 

如果没有,那么这可能是一个解决方案:

String c;// the name of the column 

...  
String sql = "select * from table where ('C1' = ? AND C1 = ?) 
            OR ('C2' = ? AND C2 = ?) 
            OR ('C3' = ? AND C3 = ?)" 
       pre = con.prepareStatement(sql); 
       pre.setString(1, c); 
       pre.setString(2, i); 
       pre.setString(3, c); 
       pre.setString(4, i); 
       pre.setString(5, c); 
       pre.setString(6, i); 
       rs = pre.executeQuery(); 
+0

我知道。我在问题中写道。 :) – 2009-10-03 22:28:25

+0

没有看到更新;我删除了关于将Col名称传递给PreparedStatement的部分。 – manji 2009-10-03 23:12:01

3

这是行不通的。准备语句解析SQL,发送到数据库进行验证和编译。如果问号可以代替SQL的某些部分,那么您将失去整个绑定变量 - 速度和安全性。您将重新引入SQL注入,并且必须重新编译所有参数的语句。

不会像SELECT * FROM table WHERE c1 = ? OR c2 = ? OR c3 = ?这样的东西更好(当然取决于索引和表大小)。

0

使用动态查询和java.sql.Statement

String whereClause = c + " = " + i; 

// Form the dynamic Query 
StringBuffer query = new StringBuffer("SELECT * FROM TABLE"); 
// Add WHERE clause if any 
query.append(" WHERE " + whereClause); 

// Create a SQL statement context to execute the Query 
Statement stmt = con.createStatement(); 

// Execute the formed query and obtain the ResultSet 
ResultSet resultSet = stmt.executeQuery(query.toString()); 
+1

只是要小心,因为它可以导致sql注入 – 2009-10-03 23:14:44

相关问题