在Java中准备动态语句的正确方法
我正在根据通过查询字符串传递的值准备一条SQL语句。(我在用这出戏!框架。基本上,我遇到的(不是真正的问题,只是我不太喜欢的事情)是,当我想在SQL字符串中使用
?
并在以后用动态值设置它们时。
这是我拥有的:
String sql = "SELECT * FROM foobar_table WHERE";
if ( foo != 0 )
sql += " AND foo=?";
if ( !bar )
sql += " AND bar=?";
try{
PreparedStatement getStmt = con.prepareStatement(sql);
if ( foo != 0 )
getStmt.setInt(1,foo);
if ( foo != 0 && !bar )
getStmt.setBoolean(2, bar);
else
getStmt.setBoolean(1, bar);
} catch (SQLException e ){
e.printStackTrace();
}
这确实有效,但如您所见,不是很直观。当有2个动态值时,这是可以的,但当你达到5或6时,这就变得荒谬了。
有没有更简单的方法使它更灵活,以便我知道如何更好地填写所有?
?
解决方案
示例(太长,无法进行注释):
String sql = "SELECT * FROM foobar_table WHERE 1 = 1 ";
ArrayList paramList = new ArrayList();
if ( foo != 0 ) {
sql += " AND foo=?";
paramList.add(foo);
}
if ( !bar ) {
sql += " AND bar=?";
paramList.add(bar);
}
try{
PreparedStatement getStmt = con.prepareStatement(sql);
int index = 1;
for (Object param : paramList) {
getStmt.setObject(index, param);
index++;
}
// execute
} catch (SQLException e ){
e.printStackTrace();
}
相关文章