PreparedStatement:我可以提供列名作为参数吗?

时间:2009-10-03 22:09:07

标签: mysql jdbc

假设我有一个包含3列的表:C1,C2,C3

我根据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。一个优雅的解决方案?

4 个答案:

答案 0 :(得分:3)

这不起作用。 prepare语句解析SQL,发送到数据库进行验证和编译。如果问号可以替换SQL的一部分,那么你将失去绑定变量的整个点 - 速度和安全性。您将重新引入SQL注入,并且必须为所有参数重新编译语句。

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

答案 1 :(得分:2)

你可以编写一组sql查询并将它们存储在地图中,然后根据相关列获取一个。

enum column { a, b, c}

Map<column, string> str;

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

然后根据枚举稍后从地图中抓取一个。 sql语句中的字符串追加有可能在将来成为安全问题。

答案 2 :(得分: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();

答案 3 :(得分: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());