JDBC - Guida rapida
Cos'è JDBC?
JDBC sta per Java Database Connectivity, che è un'API Java standard per la connettività indipendente dal database tra il linguaggio di programmazione Java e un'ampia gamma di database.
La libreria JDBC include API per ciascuna delle attività comunemente associate all'utilizzo del database:
Effettuare una connessione a un database
Creazione di istruzioni SQL o MySQL
Esecuzione di query SQL o MySQL nel database
Visualizzazione e modifica dei record risultanti
Pre-requisito:
È necessario avere una buona comprensione dei seguenti due argomenti per imparare JDBC:
JDBC - Configurazione dell'ambiente:
Assicurati di aver eseguito la seguente configurazione:
Installazione di Core JAVA
Installazione del database SQL o MySQL
Oltre a quanto sopra, devi impostare un database che useresti per il tuo progetto. Supponendo che questo sia EMP e che tu abbia creato sulla tabella Employees all'interno dello stesso database.
Creazione dell'applicazione JDBC:
Ci sono sei passaggi coinvolti nella creazione di un'applicazione JDBC che descriverò in questo tutorial:
Importa i pacchetti:
Ciò richiede l'inclusione dei pacchetti contenenti le classi JDBC necessarie per la programmazione del database. Molto spesso, l'utilizzo di import java.sql. * Sarà sufficiente come segue:
//STEP 1. Import required packages
import java.sql.*;
Registrare il driver JDBC:
Ciò richiede l'inizializzazione di un driver in modo da poter aprire un canale di comunicazione con il database. Di seguito è riportato lo snippet di codice per ottenere ciò:
//STEP 2: Register JDBC driver
Class.forName("com.mysql.jdbc.Driver");
Apri una connessione:
Ciò richiede l'utilizzo del metodo DriverManager.getConnection () per creare un oggetto Connection, che rappresenta una connessione fisica con il database come segue:
//STEP 3: Open a connection
// Database credentials
static final String USER = "username";
static final String PASS = "password";
System.out.println("Connecting to database...");
conn = DriverManager.getConnection(DB_URL,USER,PASS);
Esegui una query:
Ciò richiede l'utilizzo di un oggetto di tipo Statement o PreparedStatement per la creazione e l'invio di un'istruzione SQL al database come segue:
//STEP 4: Execute a query
System.out.println("Creating statement...");
stmt = conn.createStatement();
String sql;
sql = "SELECT id, first, last, age FROM Employees";
ResultSet rs = stmt.executeQuery(sql);
Se è richiesta un'istruzione SQL UPDATE, INSERT o DELETE, sarà richiesto il seguente frammento di codice:
//STEP 4: Execute a query
System.out.println("Creating statement...");
stmt = conn.createStatement();
String sql;
sql = "DELETE FROM Employees";
ResultSet rs = stmt.executeUpdate(sql);
Estrai i dati dal set di risultati:
Questo passaggio è necessario nel caso in cui si stiano recuperando dati dal database. È possibile utilizzare il metodo ResultSet.getXXX () appropriato per recuperare i dati dal set di risultati come segue:
//STEP 5: Extract data from result set
while(rs.next()){
//Retrieve by column name
int id = rs.getInt("id");
int age = rs.getInt("age");
String first = rs.getString("first");
String last = rs.getString("last");
//Display values
System.out.print("ID: " + id);
System.out.print(", Age: " + age);
System.out.print(", First: " + first);
System.out.println(", Last: " + last);
}
Pulisci l'ambiente:
È necessario chiudere esplicitamente tutte le risorse del database anziché affidarsi alla garbage collection della JVM come segue:
//STEP 6: Clean-up environment
rs.close();
stmt.close();
conn.close();
Primo programma JDBC:
Sulla base dei passaggi precedenti, possiamo avere il seguente codice di esempio consolidato che possiamo utilizzare come modello durante la scrittura del nostro codice JDBC:
Questo codice di esempio è stato scritto in base all'ambiente e alla configurazione del database eseguita nel capitolo Ambiente.
//STEP 1. Import required packages
import java.sql.*;
public class FirstExample {
// JDBC driver name and database URL
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost/EMP";
// Database credentials
static final String USER = "username";
static final String PASS = "password";
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try{
//STEP 2: Register JDBC driver
Class.forName("com.mysql.jdbc.Driver");
//STEP 3: Open a connection
System.out.println("Connecting to database...");
conn = DriverManager.getConnection(DB_URL,USER,PASS);
//STEP 4: Execute a query
System.out.println("Creating statement...");
stmt = conn.createStatement();
String sql;
sql = "SELECT id, first, last, age FROM Employees";
ResultSet rs = stmt.executeQuery(sql);
//STEP 5: Extract data from result set
while(rs.next()){
//Retrieve by column name
int id = rs.getInt("id");
int age = rs.getInt("age");
String first = rs.getString("first");
String last = rs.getString("last");
//Display values
System.out.print("ID: " + id);
System.out.print(", Age: " + age);
System.out.print(", First: " + first);
System.out.println(", Last: " + last);
}
//STEP 6: Clean-up environment
rs.close();
stmt.close();
conn.close();
}catch(SQLException se){
//Handle errors for JDBC
se.printStackTrace();
}catch(Exception e){
//Handle errors for Class.forName
e.printStackTrace();
}finally{
//finally block used to close resources
try{
if(stmt!=null)
stmt.close();
}catch(SQLException se2){
}// nothing we can do
try{
if(conn!=null)
conn.close();
}catch(SQLException se){
se.printStackTrace();
}//end finally try
}//end try
System.out.println("Goodbye!");
}//end main
}//end FirstExample
Ora compiliamo l'esempio sopra come segue:
C:\>javac FirstExample.java
C:\>
Quando corri FirstExample, produce il seguente risultato:
C:\>java FirstExample
Connecting to database...
Creating statement...
ID: 100, Age: 18, First: Zara, Last: Ali
ID: 101, Age: 25, First: Mahnaz, Last: Fatma
ID: 102, Age: 30, First: Zaid, Last: Khan
ID: 103, Age: 28, First: Sumit, Last: Mittal
C:\>
Metodi SQLException:
Una SQLException può verificarsi sia nel driver che nel database. Quando si verifica una tale eccezione, un oggetto di tipo SQLException verrà passato alla clausola catch.
L'oggetto SQLException passato ha i seguenti metodi disponibili per recuperare informazioni aggiuntive sull'eccezione:
Metodo | Descrizione |
---|---|
getErrorCode () | Ottiene il numero di errore associato all'eccezione. |
getMessage () | Ottiene il messaggio di errore del driver JDBC per un errore gestito dal driver o ottiene il numero di errore Oracle e il messaggio per un errore del database. |
getSQLState () | Ottiene la stringa XOPEN SQLstate. Per un errore del driver JDBC, non vengono restituite informazioni utili da questo metodo. Per un errore del database, viene restituito il codice XOPEN SQLstate a cinque cifre. Questo metodo può restituire null. |
getNextException () | Ottiene il successivo oggetto Exception nella catena di eccezioni. |
printStackTrace () | Stampa l'eccezione corrente, o lanciabile, e il suo backtrace in un flusso di errore standard. |
printStackTrace (PrintStream s) | Stampa questo oggetto lanciabile e il suo backtrace nel flusso di stampa specificato. |
printStackTrace (PrintWriter w) | Stampa questo oggetto lanciabile e il suo backtrace nel programma di scrittura specificato. |
Utilizzando le informazioni disponibili dall'oggetto Eccezione, è possibile rilevare un'eccezione e continuare il programma in modo appropriato. Ecco la forma generale di un blocco try:
try {
// Your risky code goes between these curly braces!!!
}
catch(Exception ex) {
// Your exception handling code goes between these
// curly braces, similar to the exception clause
// in a PL/SQL block.
}
finally {
// Your must-always-be-executed code goes between these
// curly braces. Like closing database connection.
}
JDBC - Tipi di dati:
La seguente tabella riepiloga il tipo di dati JDBC predefinito in cui viene convertito il tipo di dati Java quando si richiama il metodo setXXX () dell'oggetto PreparedStatement o CallableStatement o il metodo ResultSet.updateXXX ().
SQL | JDBC / Java | setXXX | updateXXX |
---|---|---|---|
VARCHAR | java.lang.String | setString | updateString |
CHAR | java.lang.String | setString | updateString |
LONGVARCHAR | java.lang.String | setString | updateString |
PO | booleano | setBoolean | updateBoolean |
NUMERICO | java.math.BigDecimal | setBigDecimal | updateBigDecimal |
TINYINT | byte | setByte | updateByte |
PICCOLO | corto | setShort | updateShort |
NUMERO INTERO | int | setInt | updateInt |
BIGINT | lungo | setLong | updateLong |
VERO | galleggiante | setFloat | updateFloat |
GALLEGGIANTE | galleggiante | setFloat | updateFloat |
DOPPIO | Doppio | setDouble | updateDouble |
VARBINARIA | byte [] | setBytes | updateBytes |
BINARIO | byte [] | setBytes | updateBytes |
DATA | java.sql.Date | impostare la data | data di aggiornamento |
TEMPO | java.sql.Time | tempo impostato | tempo di aggiornamento |
TIMESTAMP | java.sql.Timestamp | setTimestamp | updateTimestamp |
CLOB | java.sql.Clob | setClob | updateClob |
BLOB | java.sql.Blob | setBlob | updateBlob |
VETTORE | java.sql.Array | setARRAY | updateARRAY |
RIF | java.sql.Ref | SetRef | updateRef |
STRUTTURA | java.sql.Struct | SetStruct | updateStruct |
JDBC 3.0 ha un supporto migliorato per i tipi di dati BLOB, CLOB, ARRAY e REF. L'oggetto ResultSet ora dispone dei metodi updateBLOB (), updateCLOB (), updateArray () e updateRef () che consentono di manipolare direttamente i rispettivi dati sul server.
I metodi setXXX () e updateXXX () consentono di convertire tipi Java specifici in tipi di dati JDBC specifici. I metodi, setObject () e updateObject (), consentono di mappare quasi tutti i tipi Java su un tipo di dati JDBC.
L'oggetto ResultSet fornisce il metodo getXXX () corrispondente per ciascun tipo di dati per recuperare il valore della colonna. Ciascun metodo può essere utilizzato con il nome della colonna o in base alla sua posizione ordinale.
SQL | JDBC / Java | setXXX | getXXX |
---|---|---|---|
VARCHAR | java.lang.String | setString | getString |
CHAR | java.lang.String | setString | getString |
LONGVARCHAR | java.lang.String | setString | getString |
PO | booleano | setBoolean | getBoolean |
NUMERICO | java.math.BigDecimal | setBigDecimal | getBigDecimal |
TINYINT | byte | setByte | getByte |
PICCOLO | corto | setShort | getShort |
NUMERO INTERO | int | setInt | getInt |
BIGINT | lungo | setLong | getLong |
VERO | galleggiante | setFloat | getFloat |
GALLEGGIANTE | galleggiante | setFloat | getFloat |
DOPPIO | Doppio | setDouble | getDouble |
VARBINARIA | byte [] | setBytes | getBytes |
BINARIO | byte [] | setBytes | getBytes |
DATA | java.sql.Date | impostare la data | getDate |
TEMPO | java.sql.Time | tempo impostato | prendi tempo |
TIMESTAMP | java.sql.Timestamp | setTimestamp | getTimestamp |
CLOB | java.sql.Clob | setClob | getClob |
BLOB | java.sql.Blob | setBlob | getBlob |
VETTORE | java.sql.Array | setARRAY | getARRAY |
RIF | java.sql.Ref | SetRef | getRef |
STRUTTURA | java.sql.Struct | SetStruct | getStruct |
JDBC - Elaborazione batch:
L'elaborazione in batch consente di raggruppare le istruzioni SQL correlate in un batch e di inviarle con una chiamata al database.
Quando si inviano contemporaneamente più istruzioni SQL al database, si riduce la quantità di sovraccarico di comunicazione, migliorando così le prestazioni.
I driver JDBC non sono necessari per supportare questa funzione. È necessario utilizzare il metodo DatabaseMetaData.supportsBatchUpdates () per determinare se il database di destinazione supporta l'elaborazione dell'aggiornamento batch. Il metodo restituisce true se il driver JDBC supporta questa funzione.
Il addBatch()Il metodo Statement, PreparedStatement e CallableStatement viene utilizzato per aggiungere singole istruzioni al batch. IlexecuteBatch() serve per avviare l'esecuzione di tutte le istruzioni raggruppate insieme.
Il executeBatch() restituisce una matrice di numeri interi e ogni elemento della matrice rappresenta il conteggio degli aggiornamenti per la rispettiva istruzione di aggiornamento.
Proprio come puoi aggiungere istruzioni a un batch per l'elaborazione, puoi rimuoverle con l'estensione clearBatch()metodo. Questo metodo rimuove tutte le istruzioni che hai aggiunto con il metodo addBatch (). Tuttavia, non è possibile scegliere in modo selettivo quale istruzione rimuovere.
JDBC - Streaming di dati:
Un oggetto PreparedStatement ha la capacità di utilizzare flussi di input e output per fornire i dati dei parametri. Ciò consente di inserire interi file in colonne di database che possono contenere valori di grandi dimensioni, come i tipi di dati CLOB e BLOB.
Esistono i seguenti metodi che possono essere utilizzati per lo streaming dei dati:
setAsciiStream(): Questo metodo viene utilizzato per fornire valori ASCII di grandi dimensioni.
setCharacterStream(): Questo metodo viene utilizzato per fornire valori UNICODE di grandi dimensioni.
setBinaryStream(): Questo metodo viene utilizzato per fornire valori binari di grandi dimensioni.
Il metodo setXXXStream () richiede un parametro aggiuntivo, la dimensione del file, oltre al segnaposto del parametro. Questo parametro informa il driver della quantità di dati da inviare al database utilizzando il flusso.
Per un dettaglio su tutti questi concetti, è necessario seguire il tutorial completo.