Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment créer dynamiquement une instruction préparée - et réutiliser la requête

En supposant que vous êtes déjà capable de créer dynamiquement une chaîne SQL (en insérant le ? dans la bonne position au besoin), je suggérerais d'utiliser une Map pour passer des paramètres où la key serait l'ordre des paramètres (1,2,3 et ainsi de suite). Quelque chose comme ça :

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;
    }

}

Enfin, vous pouvez utiliser Database comme suit :

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();