2012-08-02 73 views
7

我有一個所有DAO的公共類,我們將在其中讀取查詢並執行它們,如下所示。我將從DAO發送參數給這個類。動態設置參數準備JDBC中的語句

Connection connection = Queries.getConnection(); 
String query = Queries.getQuery(queryName);//Queries i will get from xml 
PreparedStatement preparedStatement = connection.prepareStatement(query); 

什麼是在JDBC中動態設置參數Statement的最佳方法。我相信,我們在JDBC中沒有像JDBC一樣的命名參數概念。在我們的項目中,我們只是簡單的JDBC。

+2

請不要使用大膽的風格。 – amicngh 2012-08-02 12:13:10

+0

請參閱http://docs.oracle.com/javase/1.4.2/docs/guide/jdbc/getstart/preparedstatement.html – swapy 2012-08-02 12:27:43

回答

4

寫這樣的事情:

public static int mapParams(PreparedStatement ps, Object... args) throws SQLException { 
    int i = 1; 
    for (Object arg : args) {   
     if (arg instanceof Date) { 
     ps.setTimestamp(i++, new Timestamp(((Date) arg).getTime())); 
    } else if (arg instanceof Integer) { 
     ps.setInt(i++, (Integer) arg); 
    } else if (arg instanceof Long) { 
     ps.setLong(i++, (Long) arg); 
    } else if (arg instanceof Double) { 
     ps.setDouble(i++, (Double) arg); 
    } else if (arg instanceof Float) { 
     ps.setFloat(i++, (Float) arg); 
    } else { 
     ps.setString(i++, (String) arg); 
    } 
    } 
    } 
} 

,並在查詢只需使用 '?'您需要設置參數。

我知道這是老學校的代碼,而只是給一些簡約的例子...

+2

ps.setObject()呢? – David 2014-08-27 11:40:04

3

example此頁面。 您的查詢應該包含?在您想要設定價值的地方。

String query = "update COFFEES set SALES = ? where COF_NAME = ?"; 

你可以輕鬆地設定值這樣

preparedStatement.setInt(1, 100); 
preparedStatement.setString(2, "French_Roast"); 
3

好方法是使用地圖

Map<String, Object> params = new HashMap<>(); 
params.put("id",0); 
params.put("name","test"); 
//more params here... 


String sql = "SELECT * FROM test"; 

boolean first = true; 

for (String paramName : params.keySet()) { 
    Object paramValue = params.get(paramName); 
    if (paramValue != null) { 
     if (first){ 
      sql += " where " + paramName + "=?"; 
      first = false; 
     } else { 
      sql += " and " + paramName + "=?"; 
     } 
    } 
} 

Connection connection = DataSource.getInstance().getConnection(); 

ps = connection.prepareStatement(sql); 

int paramNumber = 1; 
for (String paramName : params.keySet()) { 
    Object paramValue = params.get(paramName); 
    if (paramValue != null) { 
     if (param instanceof Date) { 
      ps.setDate(paramNumber, (Date) param); 
     } else if (param instanceof Integer) { 
      ps.setString(paramNumber, (Integer) param); 
     //more types here... 
     } else { 
      ps.setString(paramNumber, param.toString()); 
     } 
     paramNumber ++; 
    } 
} 
+0

謝謝,這節省了我在大學任務上的時間 – CapturedTree 2017-11-14 06:24:08