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になると、これはばかげています。

これをより柔軟にして、すべてをより適切に入力する方法を知るための、より簡単な方法はあり?ますか?

4

3 に答える 3

3

例(コメントするには長すぎました):

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();
}
于 2012-08-26T21:26:52.357 に答える
0

このようなものかもしれません(大まかなコードですが、アイデアは得られます):

    class Param{
        final int type;
        final Object value;         
        Param(int type, Object value){
            this.type = type;
            this.value = value;
        }
    }

    final List<Param> params = new ArrayList<>();

    final StringBuilder sql = new StringBuilder("SELECT * FROM bcu_venue_events WHERE 1=1");
    int foo = 0;
    boolean bar = true;             
    if (foo != 0){
        sql.append(" AND foo=?");
        params.add(new Param(Types.INTEGER, foo));
    }       
    if (!bar){
        sql.append(" AND bar=?");
        params.add(new Param(Types.BOOLEAN, bar));
    }
    try(Connection conn = null; PreparedStatement getStmt = conn.prepareStatement(sql.toString())) {            
        for(int i = 0; i < params.size(); i++){
            Param p = params.get(i);
            getStmt.setObject(i + 1, p.value, p.type);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
于 2012-08-26T21:31:53.000 に答える
-1

これはどう:

String sql = "SELECT * FROM foobar_table WHERE 1=1";

if ( foo != 0 )
    sql += " AND foo=" + foo;
if ( !bar )
    sql += " AND bar=" + bar;

try{
    PreparedStatement getStmt = con.prepareStatement(sql);
} catch (SQLException e ){
    e.printStackTrace();
}
于 2012-08-26T21:06:34.303 に答える