如何动态创建预准备语句 - 并重新使用查询

时间:2013-08-27 13:11:14

标签: java mysql database jdbc prepared-statement

我一直在尝试创建一个类来处理来自创建不同对象的不同类的查询。例如。

Class Employees, Class Customers, Class Sales

我想通过从JTextField值派生的构造函数传递SQL查询(到查询类“Database”)。

例如,来自两个不同的类:

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

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

我遇到的问题是动态创建以下项目(PreparedStatement Parameters):

stmt.setString(2, NEWYORK);

这样“sql”在“?”可以填充:

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

在我的项目中,可能有一个语句将值传递给参数,如上所述,或者可能有更多参数,意味着更多语句,因此上述内容无法重复使用。

任何人都可以有关于如何生成“stmt.setString(2,NEWYORK);”的想法动态地,以便我可以根据传递的参数数量动态生成它。所以我可以举例:

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

注意:重点是重用数据库类。

1 个答案:

答案 0 :(得分:2)

假设您已经能够动态创建SQL字符串(根据需要将?插入正确的位置),我建议使用Map传递key的参数将是参数顺序(1,2,3等等)。像这样:

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