我一直在尝试创建一个类来处理来自创建不同对象的不同类的查询。例如。
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);
注意:重点是重用数据库类。
答案 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();