java - 在Java中准备动态Statement的正确方法

标签 java sql jdbc prepared-statement playframework-2.0

我正在根据通过查询字符串传递的值准备 SQL 语句。 (我正在使用 Play! 框架。基本上,我遇到的问题(并不是真正的问题,只是我不太喜欢)是当我想在 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();
}

关于java - 在Java中准备动态Statement的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12133833/

相关文章:

Java Swing Clickable JFree Charts,单击每个条形图或饼图即可打开新框架或新图表

java - 在java中获取所有语言环境

java - 提取的 pdf 文本未显示在控制台中

java - 从 getCursorName 函数读取数据时出现异常 "positioned update not supported"

java - 无法使用 executeQuery() 发出数据操作语句

java - 来自 weblogic 的数据库连接

java - 通过 JDBC 连接时在 session 信息中显示应用程序名称

带有 Int 数组的 Java HashMap

mysql - 如何在 MySQL 中选择 DateTime.MinValue (01/01/1970)?

sql - SQL Server 中的 AVG