0

たとえば、さまざまなオブジェクトを作成するさまざまなクラスからのクエリを処理するクラスを作成しようとしています。

Class Employees, Class Customers, Class Sales

JTextField 値から派生したコンストラクターを介して SQL クエリを (クエリ クラス "Database" に) 渡したいと思います。

たとえば、2 つの異なるクラスから:

new Database (SELECT PRODUCT FROM SALES WHERE DATE = YESTERDAY);

new Database (SELECT FULLNAMES FROM CUSTOMER WHERE ADDRESS = NEWYORK);

私が直面している問題は、次の項目を動的に作成する場合です (PreparedStatement パラメーター):

stmt.setString(2, NEWYORK);

そのため、「?」の「sql」移入することができます:

String sql = "SELECT FULLNAMES FROM CUSTOMER WHERE ADDRESS = ?";

私のプロジェクトでは、上記のようにパラメーターに値を渡すステートメントが 1 つある可能性があります。または、より多くのステートメントを意味するより多くのパラメーターがある可能性があるため、上記を再利用することはできません。

「stmt.setString(2, NEWYORK);」を生成する方法についてアイデアを持っている人はいますか? 動的に、渡されるパラメーターの数に従って動的に生成できるようにします。たとえば、次のようにすることができます。

stmt.setString(1, NEWYORK);
stmt.setString(2, FULLNAMES);
stmt.setString(3, EMPLOYEE);

注: 全体のポイントは、データベース クラスを再利用することです。

4

1 に答える 1

2

すでに SQL 文字列を動的に作成できる (?必要に応じて正しい位置に を挿入する) ことができると仮定すると、パラメーターの順序 (1、2、3 など) となるMapパラメーターを渡すために a を使用することをお勧めします。keyこのようなもの:

public class Database{
    private String _sqlString;
    private Map<Integer,Object> _parameters;

    public Database(String sql){
        _sqlstring = sql;
    }

    public void setParameters(Map<Integer,Object> param){
        _parameters = param;
    }

    /* 
     * I'm assuming you already have a method like this
     */
    public List processQuery(){
        List results = new ArrayList();
        /* 
         * establish connection here
         */
        PreparedStatement preparedStatement = connection.prepareStatement(this._sqlString);

        if(_parameters != null){
            /* 
             * Iterate over the map to set parameters 
             */
            for(Integer key : _parameters.keySet()){
                preparedStatement.setObject(key, _parameters.get(key));
            }
        }            

        ResultSet rs = preparedStatement.executeQuery();
        /*
         * process the ResultSet
         */
        return results;
    }

}

Database最後に、次のように使用できます。

String sql = "SELECT FULLNAMES FROM CUSTOMER WHERE ADDRESS = ? OR ADDRESS = ?";

Map<Integer,Object> param = new HashMap<>();
param.put(1,"NEW YORK");
param.put(2,"CHICAGO");

Database db = new Database(sql);
db.setParameters(param);
List customers = db.processQuery();
于 2013-08-27T20:25:25.387 に答える