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

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

Class Employees, Class Customers, Class Sales 

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

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

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

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

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

 public class Database{ private String _sqlString; private Map _parameters; public Database(String sql){ _sqlstring = sql; } public void setParameters(Map 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 param = new HashMap<>(); param.put(1,"NEW YORK"); param.put(2,"CHICAGO"); Database db = new Database(sql); db.setParameters(param); List customers = db.processQuery();