2009-07-08 10 views
32

In molti linguaggi di programmazione qualcosa di simile a questo è possibile per le dichiarazioni preparate:Utilizzando una variabile invece di un indice parametro con un JDBC preparato dichiarazione

PreparedStatement statement = connection.prepareStatement(
    "SELECT id FROM Company WHERE name LIKE ${name}"); 
statement.setString("name", "IBM"); 

Ma non con java.sql.PreparedStatement. In Java si devono usare gli indici dei parametri:

PreparedStatement statement = connection.prepareStatement(
    "SELECT id FROM Company WHERE name LIKE ?"); 
statement.setString(1, "IBM"); 

Esiste una soluzione per lavorare con variabili stringa come nel primo esempio? "$ {. *}" Non è utilizzato da qualche altra parte nel linguaggio SQL o ci sono conflitti? Perchè allora lo implementerei da solo (analizzando la stringa SQL e sostituendo ogni variabile con "?" E poi facendo in modo Java).

saluti, Kai

+4

Mi perplesso troppo. http://www.javaworld.com/javaworld/jw-04-2007/jw-04-jdbc.html ha qualcosa che ho usato più volte. – akarnokd

+0

Hey kd304, mi chiedo perché non hai lasciato il tuo messaggio come risposta invece di usare un commento. Perché penso che sia il modo per me di risolvere questo problema. – Zardoz

+0

@tokel: Non ero sicuro che la tua domanda fosse teorica o meno e il mio commento in realtà non risponde alla tua domanda scritta. – akarnokd

risposta

5

Utilizzando un PreparedStatement cruda, questo non è possibile, come dici tu. È possibile con CallableStatement, ma richiede una stored procedure piuttosto che una semplice istruzione SQL.

I livelli ORM come Hibernate forniscono anche la sostituzione dei parametri con nome e Hibernate consente anche di eseguire SQL nativo, ignorando completamente la funzionalità di mappatura OR.

Quindi se si desidera veramente utilizzare i parametri denominati, è possibile utilizzare Hibernate come metodo per farlo; useresti solo una piccola parte della sua funzionalità.

+0

Dimentica la mia idea, @laz ha uno molto migliore. – skaffman

+0

Penso che il driver JDBC Oracle supporti il ​​richiamo di istruzioni SQL regolari con parametri denominati quando si utilizza CallableStatement, non solo per le procedure. PostgreSQL dice "Non ancora implementato" (postgresql-9.1-901.jdbc4.jar) – Oliv

+0

Questo è così triste, come supporta DBMS, almeno il server SQL, e JSBC intrnaly crea parametri con nome, come segue: '@ P0 nvarchar (4000), @ P1 varchar (8000), @ P2 nvarchar (4000), @ P3 smallint, @ P4 nvarchar (4000), @ P5 int' –

26

Gli Standard JDBC PreparedStatements non hanno questa capacità. Spring JDBC fornisce questa funzionalità tramite NamedParameterJdbcTemplate.

+0

Grazie per l'ottima soluzione. Il problema per me è che farà parte di un altro framework open source e non voglio importare così tanto codice lì. Altrimenti avrei usato la tua soluzione :-) – Zardoz

Problemi correlati