English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Una volta ottenuta la connessione, possiamo interagire con il database. Gli interfacce JDBC Statement, CallableStatement e PreparedStatement definiscono metodi e attributi che ti permettono di inviare comandi SQL o PL/SQL e ricevere dati dal database.
esse metodi definiscono le tecniche utili per superare le differenze di tipo di dati tra i tipi di dati Java e SQL utilizzati nei database.
La tabella seguente riassume l'uso di ogni interfaccia per determinare l'interfaccia da utilizzare.
Interfaccia | Raccomandato |
---|---|
Statement | Utilizzarlo per l'accesso generico al database. È molto utile quando si utilizzano query SQL statiche in tempo di esecuzione. L'interfaccia Statement non accetta parametri. |
PreparedStatement | Utilizzare questa opzione quando si prevede di utilizzare più volte una query SQL. L'interfaccia PreparedStatement accetta parametri di input in tempo di esecuzione. |
CallableStatement | Utilizzare questa opzione quando si desidera accedere a procedure memorizzate nel database. L'interfaccia CallableStatement può anche accettare parametri di input in tempo di esecuzione. |
Prima di poter eseguire query SQL con l'oggetto Statement, è necessario creare una query SQL utilizzando il metodo createStatement() dell'oggetto Connection, come nell'esempio seguente -
Statement stmt = null; try { stmt = conn.createStatement( ); . . . } catch (SQLException e) { . . . } finally { . . . }
Una volta creato l'oggetto Statement, è possibile eseguire query SQL utilizzando uno dei tre metodi di esecuzione.
boolean execute (String SQL)Ritorna true se è possibile recuperare l'oggetto ResultSet; altrimenti ritorna false. Utilizzare questo metodo quando si desidera eseguire SQL DDL con SQL dinamico.
int executeUpdate (String SQL)Ritorna il numero di righe influenzate dalla query SQL. Utilizzare questo metodo per eseguire query SQL che influenzano righe, come INSERT, UPDATE o DELETE.
ResultSet executeQuery (String SQL)Ritorna un oggetto ResultSet. Utilizzare questo metodo quando si desidera ottenere un insieme di risultati, come con una query SELECT.
Come chiudere l'oggetto Connection per risparmiare risorse del database, per lo stesso motivo, si dovrebbe anche chiudere l'oggetto Statement.
Basta chiamare il metodo close() per un uso semplice. Se si chiude prima l'oggetto Connection, anche l'oggetto Statement verrà chiuso. Tuttavia, si dovrebbe sempre chiudere esplicitamente l'oggetto Statement per garantire una pulizia corretta.
Statement stmt = null; try { stmt = conn.createStatement( ); . . . } catch (SQLException e) { . . . } finally { stmt.close(); }
Per una migliore comprensione, raccomandiamo di studiareEsempio di tutorial Statement。
L'interfaccia PreparedStatement espande l'interfaccia Statement, fornendoti funzionalità aggiuntive e alcuni vantaggi rispetto agli oggetti Statement generici.
Questa statement ti permette di fornire parametri in modo flessibile e dinamico.
PreparedStatement pstmt = null; try { String SQL = "Update Employees SET age = ? WHERE id = ?"; pstmt = conn.prepareStatement(SQL); . . . } catch (SQLException e) { . . . } finally { . . . }
Tutti i parametri in JDBC sono creati da?simboli rappresentano, questo simbolo si chiama etichetta di parametro. Dovrai fornire un valore per ogni parametro prima di eseguire la statement SQL.
QuestisetXXX()Il metodo binda i valori ai parametri, doveXXXRappresenta il tipo di dati Java che desideri associare al parametro input. Se dimentichi di fornire un valore, viene sollevata un'eccezione SQLException.
Ogni etichetta di parametro è riferita dalla sua posizione numerica. La prima etichetta rappresenta la posizione 1, la seconda rappresenta la posizione 2, ecc. Questo metodo è diverso dal metodo di indici degli array Java, che inizia da 0.
Tutti i metodi degli oggetti Statement utilizzati per interagire con il database (a) execute (), (b) executeQuery () e (c) executeUpdate () possono essere utilizzati anche con l'oggetto PreparedStatement. Tuttavia, questi metodi sono modificati per utilizzare una statement SQL con parametri input.
Come per il chiudere l'oggetto Statement, per le stesse ragioni, dovrebbe essere chiuso anche l'oggetto PreparedStatement.
Un semplice chiamata al metodo close() è sufficiente. Se chiudi prima l'oggetto Connection, anche l'oggetto PreparedStatement verrà chiuso. Tuttavia, dovresti sempre chiudere esplicitamente l'oggetto PreparedStatement per garantire una pulizia corretta.
PreparedStatement pstmt = null; try { String SQL = "Update Employees SET age = ? WHERE id = ?"; pstmt = conn.prepareStatement(SQL); . . . } catch (SQLException e) { . . . } finally { pstmt.close(); }
Per comprendere meglio, impariamo aEsempio di codice PreparedStatement。
Anche come l'oggetto Connection crea gli oggetti Statement e PreparedStatement, esso crea anche l'oggetto CallableStatement, che verrà utilizzato per eseguire chiamate a procedure memorizzate nel database.
Supponiamo che tu debba eseguire la seguente procedura memorizzata Oracle-
CREATE OR REPLACE PROCEDURE getEmpName (EMP_ID IN NUMBER, EMP_FIRST OUT VARCHAR) AS BEGIN SELECT first INTO EMP_FIRST FROM Employees WHERE ID = EMP_ID; END;
NOTE: La procedura memorizzata sopra è stata scritta per Oracle, ma stiamo utilizzando un database MySQL, quindi, scriviamo la stessa procedura memorizzata per MySQL, come segue, per crearla nel database EMP-
DELIMITER $$ DROP PROCEDURE IF EXISTS `EMP`.`getEmpName` $$ CREATE PROCEDURE `EMP`.`getEmpName` (IN EMP_ID INT, OUT EMP_FIRST VARCHAR(255)) BEGIN SELECT first INTO EMP_FIRST FROM Employees WHERE ID = EMP_ID; END $$ DELIMITER ;
Ci sono tre tipi di parametri: IN, OUT e INOUT. Gli oggetti PreparedStatement utilizzano solo i parametri IN. Gli oggetti CallableStatement possono utilizzare tutti e tre.
Questa è la definizione di ciascuno-
Intervallo | Descrizione |
---|---|
IN | I parametri non sono noti al momento della creazione della statement SQL. Bindingare i valori al IN something utilizzando il metodo setXXX () |
OUT | Il valore è fornito dai parametri forniti dalla statement SQL. Recupera i valori dai parametri utilizzando il metodo getXXX () |
INOUT | Fornisce contemporaneamente parametri con valori di input e output. Puoi bindingare le variabili utilizzando il metodo setXXX () e recuperare i valori utilizzando il metodo getXXX () |
Il seguente frammento di codice mostra come utilizzare il metodo Connection.prepareCall () per istanziare un oggetto CallableStatement in base alla procedura memorizzata precedente.
CallableStatement cstmt = null; try { String SQL = "{call getEmpName (?, ?)}"; cstmt =conn.prepareCall(SQL); . . . } catch (SQLException e) { . . . } finally { . . . }
La variabile di stringa SQL, che rappresenta un'procedura memorizzata con segnaposto parametrici.
L'uso dell'oggetto CallableStatement è molto simile a quello dell'oggetto PreparedStatement. Devi bindingare i valori a tutti i parametri prima di eseguire la statement, altrimenti riceverai un SQLException.
Se esiste un parametro IN, è sufficiente seguire le stesse regole e tecniche applicate agli oggetti PreparedStatement; utilizzare il metodo setXXX () corrispondente al tipo di dati Java associato.
在使用 OUT 和 INOUT 参数时,必须使用附加的 CallableStatement 方法 registerOutParameter()。registerOutParameter() 方法将 JDBC 数据类型绑定到预期存储过程返回的数据类型。
调用存储过程后,可以使用适当的 getXXX() 方法从 OUT 参数中检索值。此方法将检索到的 SQL 类型的值转换为 Java 数据类型。
就像关闭其他 Statement 对象一样,出于同样的原因,您也应该关闭 CallableStatement 对象。
简单地调用 close() 方法就可以了。如果先关闭 Connection 对象,它也会关闭 CallableStatement 对象。但是,您应该始终显式关闭 CallableStatement 对象,以确保正确清理。
CallableStatement cstmt = null; try { String SQL = "{call getEmpName (?, ?)}"; cstmt =conn.prepareCall(SQL); . . . } catch (SQLException e) { . . . } finally { cstmt.close(); }
为了更好地理解,我建议学习CallableStatement 示例代码。