2012-08-02 16 views
7

Ho una classe comune per tutti i DAO in cui leggeremo le query ed eseguirle come di seguito. Invierò i parametri da DAO a questa classe.Impostare i parametri dinamicamente sull'istruzione preparata in JDBC

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

qual è il modo migliore per impostare dinamicamente i parametri sull'istruzione preparata in JDBC. Credo che non abbiamo un concetto di parametri con nome in JDBC come abbiamo in primavera JDBC. Siamo solo semplici JDBC nel nostro progetto.

+2

Si prega di non utilizzare troppo stile audace. – amicngh

+0

consultare http://docs.oracle.com/javase/1.4.2/docs/guide/jdbc/getstart/preparedstatement.html – swapy

risposta

4

scrivere qualcosa di simile:

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

e nelle query basta usare '?' dove è necessario impostare il parametro.

So che questo è il codice della vecchia scuola, ma solo per dare qualche esempio minimalista ...

+2

Che dire di ps.setObject()? – David

3

un'occhiata a questa pagina example. La tua query dovrebbe contenere? nel posto in cui si desidera impostare il valore.

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

E si può facilmente impostare i valori come questo

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

buon modo è quello di utilizzare Mappa

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

GRAZIE, questo mi ha fatto risparmiare un incarico universitario – CapturedTree

Problemi correlati