2013-08-27 45 views
0

例如,我一直試圖創建一個處理來自不同類的查詢的類來創建不同的對象。如何動態創建預準備語句 - 並重新使用查詢

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的參數):

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

注意:整個問題是重用數據庫類。

回答

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(); 
相關問題