假设我有一个包含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。一个优雅的解决方案?
答案 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());