JDBC sta per Java Database Connectivity, un'API Java standard per la connettività indipendente dal database tra il linguaggio di programmazione Java e un'ampia gamma di database.

Generale L'architettura JDBC è costituita da due livelli API JDBC (fornisce la connessione applicazione a JDBC Manager) e API driver JDBC (supporta la connessione JDBC Manager-driver).

L'API JDBC è costituita dalle seguenti interfacce e classi DriverManager, Driver, Connection, Statement, ResultSet, SQLException.

JDBC DriverManager è una classe che gestisce un elenco di driver di database. Corrisponde alle richieste di connessione dall'applicazione Java con il driver del database appropriato utilizzando il sottoprotocollo di comunicazione.

Il driver JDBC è un'interfaccia che consente a un'applicazione Java di interagire con un database. Per connettersi ai singoli database, JDBC richiede driver per ogni database. Il driver JDBC fornisce la connessione al database e implementa il protocollo per trasferire la query e il risultato tra client e database.

L'interfaccia di connessione consiste in metodi per contattare un database. L'oggetto connessione rappresenta il contesto di comunicazione.

L'istruzione incapsula un'istruzione SQL che viene passata al database per essere analizzata, compilata, pianificata ed eseguita.

Questi oggetti contengono i dati recuperati da un database dopo aver eseguito una query SQL utilizzando gli oggetti Statement. Agisce come un iteratore per consentirti di spostarti tra i suoi dati. L'interfaccia java.sql.ResultSet rappresenta la serie di risultati di una query di database.

Ci sono tre costanti che, quando definite nel set di risultati, possono spostare il cursore nel set di risultati indietro, avanti e anche in una determinata riga.

  • ResultSet.TYPE_FORWARD_ONLY - Il cursore può spostarsi solo in avanti nel set di risultati.

  • ResultSet.TYPE_SCROLL_INSENSITIVE - Il cursore può scorrere avanti e indietro e il set di risultati non è sensibile alle modifiche apportate da altri al database che si verificano dopo la creazione del set di risultati.

  • ResultSet.TYPE_SCROLL_SENSITIVE - Il cursore può scorrere avanti e indietro e il set di risultati è sensibile alle modifiche apportate da altri al database che si verificano dopo la creazione del set di risultati.

Di seguito sono riportati i passaggi di base per creare un'applicazione JDBC

  • Importare i pacchetti contenenti le classi JDBC necessarie per la programmazione del database.

  • Registrare il driver JDBC, in modo da poter aprire un canale di comunicazione con il database.

  • Apri una connessione utilizzando il metodo DriverManager.getConnection ().

  • Eseguire una query utilizzando un oggetto di tipo Statement.

  • Estrarre i dati dal set di risultati utilizzando il metodo ResultSet.getXXX () appropriato.

  • Ripulire l'ambiente chiudendo tutte le risorse del database che si basano sulla raccolta dei rifiuti di JVM.

Esistono quattro tipi di driver JDBC

  • JDBC-ODBC Bridge plus ODBC driver - chiamato anche Tipo 1 chiama il codice nativo del driver ODBC disponibile localmente.

  • Native-API, partly Java driver- chiamato anche Tipo 2 chiama la libreria nativa del fornitore di database sul lato client. Questo codice comunica quindi al database tramite la rete.

  • JDBC-Net, pure Java driver - chiamato anche Type 3 il driver puro java che dialoga con il middleware lato server che poi dialoga con il database.

  • Native-protocol, pure Java driver - chiamato anche Type 4 il driver pure-java che utilizza il protocollo nativo del database.

Di seguito è riportato un elenco di quando è possibile utilizzare i quattro tipi di driver

  • Se stai accedendo a un tipo di database, come Oracle, Sybase o IBM, il tipo di driver preferito è 4.

  • Se l'applicazione Java accede a più tipi di database contemporaneamente, il tipo 3 è il driver preferito.

  • I driver di tipo 2 sono utili nelle situazioni in cui un driver di tipo 3 o di tipo 4 non è ancora disponibile per il database.

  • Il driver di tipo 1 non è considerato un driver a livello di distribuzione e viene in genere utilizzato solo per scopi di sviluppo e test.

Il driver Java JDBC Net puro (tipo 4) è il driver più veloce perché converte le chiamate JDBC in chiamate di protocollo specifiche del fornitore e interagisce direttamente con il database.

No. È possibile aprire un solo oggetto Statement per connessione quando si utilizza il bridge JDBC-ODBC.

I livelli di isolamento standard sono

  • TRANSACTION_NONE

  • TRANSACTION_READ_COMMITTED

  • TRANSACTION_READ_UNCOMMITTED

  • TRANSACTION_REPEATABLE_READ

  • TRANSACTION_SERIALIZABLE

L'architettura JDBC disaccoppia un'astrazione dalla sua implementazione. Quindi JDBC segue un modello di progettazione del ponte. L'API JDBC fornisce l'astrazione ei driver JDBC forniscono l'implementazione. È possibile collegare nuovi driver all'API JDBC senza modificare il codice client.

I tipi di dichiarazioni sono

  • Statement - istruzione SQL regolare.

  • PreparedStatement - più efficiente dell'istruzione grazie alla precompilazione dell'SQL.

  • CallableStatement - per chiamare stored procedure nel database.

Le istruzioni preparate offrono prestazioni migliori, poiché sono precompilate. Le istruzioni preparate riutilizzano lo stesso piano di esecuzione per argomenti diversi anziché creare ogni volta un nuovo piano di esecuzione. Le istruzioni preparate utilizzano argomenti di bind, che vengono inviati al motore di database. Ciò consente di mappare richieste diverse con la stessa istruzione preparata ma argomenti diversi per eseguire lo stesso piano di esecuzione. Le istruzioni preparate sono più sicure perché utilizzano variabili di bind, che possono impedire l'attacco di SQL injection.

  • Class.forName()- Questo metodo carica dinamicamente il file di classe del driver in memoria, che lo registra automaticamente. Questo metodo è preferibile perché consente di rendere configurabile e portabile la registrazione del driver.

  • DriverManager.registerDriver() - Questo metodo statico viene utilizzato nel caso in cui si utilizzi una JVM non conforme a JDK, come quella fornita da Microsoft.

Ecco alcuni vantaggi di JDBC 4.0

  • Caricamento automatico della classe driver JDBC. Nelle versioni precedenti dovevamo registrare e caricare manualmente i driver usando class.forName.

  • Miglioramenti alla gestione della connessione. Nuovi metodi aggiunti a javax.sql.PooledConnection.

  • DataSet Implementazione di SQL mediante annotazioni.

  • Supporto XML SQL.

Le prestazioni o la solidità del driver JDBC dipendono da una serie di problemi Qualità del codice driver, dimensione del codice driver, server database e relativo carico, topologia di rete, numero di volte in cui la richiesta viene tradotta in un'API diversa.

Racconta la tua esperienza in tempo reale.

Esistono 3 metodi DriverManager.getConnection () sovraccaricati per creare un oggetto di connessione

getConnection (String url, String user, String password) Utilizzo di un URL di database con un nome utente e una password. Per esempio

String URL = "[email protected]";
String USER = "username";
String PASS = "password"
Connection conn = DriverManager.getConnection(URL, USER, PASS);
getConnection(String url)Using only a database URL. For example
String URL = "jdbcoraclethinusername/[email protected]";
Connection conn = DriverManager.getConnection(URL);
getConnection(String url, Properties prop)Using a database URL and a Properties object. For example
String URL = "[email protected]";
Properties info = new Properties( );
info.put( "user", "username" );
info.put( "password", "password" );

Utilizzare i metodi DatabaseMetaData supportsOpenStatementsAcrossCommit () e supportsOpenStatementsAcrossRollback () per controllare.

La specifica non fa menzione di alcuna limitazione di dimensione per Statement.addBatch (), questo dipende dal driver.

Esistono diversi metodi nell'interfaccia ResultSet che implicano lo spostamento del cursore, come beforeFirst (), afterLast (), first (), last (), absolute (int row), relative (int row), previous (), next () , getRow (), moveToInsertRow (), moveToCurrentRow ().

L'interfaccia ResultSet contiene metodi get per ciascuno dei possibili tipi di dati e ogni metodo get ha due versioni

  • Uno che accetta un nome di colonna.

  • Uno che accetta un indice di colonna.

Ad esempio, getInt (String columnName), getInt (int columnIndex)

L'interfaccia ResultSet contiene una raccolta di metodi di aggiornamento per aggiornare i dati di una serie di risultati. Ogni metodo di aggiornamento ha due versioni per ogni tipo di dati

  • Uno che accetta un nome di colonna.

  • Uno che accetta un indice di colonna.

Questi metodi modificano le colonne della riga corrente nell'oggetto ResultSet, ma non nel database sottostante. Per aggiornare le modifiche alla riga nel database, è necessario richiamare uno dei seguenti metodi

updateRow (), deleteRow (), refreshRow (), cancelRowUpdates (), insertRow ()

Il driver JDBC converte il tipo di dati Java nel tipo JDBC appropriato prima di inviarlo al database. Utilizza una mappatura predefinita per la maggior parte dei tipi di dati. Ad esempio, un int Java viene convertito in un INTEGER SQL.

"Nessun driver adatto" si verifica durante una chiamata al metodo DriverManager.getConnection, può essere uno dei seguenti motivi

  • A causa del mancato caricamento dei driver JDBC appropriati prima di chiamare il metodo getConnection.

  • Può specificare un URL JDBC non valido, non riconosciuto dal driver JDBC.

  • Questo errore può verificarsi se non è possibile caricare una o più librerie condivise necessarie per il bridge.

L'uso da parte di SQL di valori NULL e l'uso di null da parte di Java sono concetti diversi. Ci sono tre tattiche che puoi usare

  • Evita di utilizzare metodi getXXX () che restituiscono tipi di dati primitivi.

  • Utilizzare classi wrapper per tipi di dati primitivi e utilizzare il metodo wasNull () dell'oggetto ResultSet per verificare se la variabile della classe wrapper che ha ricevuto il valore restituito dal metodo getXXX () deve essere impostata su null.

  • Utilizzare i tipi di dati primitivi e il metodo wasNull () dell'oggetto ResultSet per verificare se la variabile primitiva che ha ricevuto il valore restituito dal metodo getXXX () deve essere impostata su un valore accettabile che si è scelto di rappresentare un NULL.

Quando viene creata una connessione, è in modalità di commit automatico. Ciò significa che ogni singola istruzione SQL viene trattata come una transazione e verrà automaticamente confermata subito dopo essere stata eseguita. Impostando l'auto-commit su false non verrà eseguito il commit di istruzioni SQL finché non si chiama esplicitamente il metodo commit.

Di seguito sono i motivi

  • Per aumentare le prestazioni.

  • Per mantenere l'integrità dei processi aziendali.

  • Per utilizzare transazioni distribuite.

Un punto di salvataggio contrassegna un punto in cui la transazione corrente può essere ripristinata. Invece di annullare tutte le modifiche, può scegliere di ripristinare solo alcune di esse. Ad esempio, supponi di te

  • avviare una transazione.

  • inserire 10 righe in una tabella.

  • imposta un punto di salvataggio.

  • inserire altre 5 righe.

  • rollback al savepoint.

  • eseguire il commit della transazione.

Dopo aver fatto ciò, la tabella conterrà le prime 10 righe che hai inserito. Le altre 5 righe saranno state eliminate dal rollback. Un punto di salvataggio è solo un indicatore su cui la transazione corrente può essere ripristinata.

Gli oggetti SQLWarning sono una sottoclasse di SQLException che si occupa degli avvisi di accesso al database. Gli avvisi non interrompono l'esecuzione di un'applicazione, come fanno le eccezioni. Avvisano semplicemente l'utente che qualcosa non è successo come previsto. È possibile segnalare un avviso su un oggetto Connection, un oggetto Statement (inclusi gli oggetti PreparedStatement e CallableStatement) o un oggetto ResultSet. Ciascuna di queste classi ha un metodo getWarnings.

L'elaborazione in batch consente di raggruppare le istruzioni SQL correlate in un batch e di inviarle con una chiamata al database.

Le sequenze tipiche di passaggi per utilizzare l'elaborazione batch con Statement o PrepareStatement Object sono

  • In caso di elaborazione in batch utilizzando l'oggetto PrepareStatement, creare istruzioni SQL con segnaposto.

  • Creare un oggetto Statement o PrepareStatement utilizzando rispettivamente i metodi createStatement () o prepareStatement ().

  • Imposta il commit automatico su false utilizzando setAutoCommit ().

  • Aggiungi tutte le istruzioni SQL che desideri in batch utilizzando il metodo addBatch () sull'oggetto istruzione creato.

  • Eseguire tutte le istruzioni SQL utilizzando il metodo executeBatch () sull'oggetto istruzione creato.

  • Infine, eseguire il commit di tutte le modifiche utilizzando il metodo commit ().

Una procedura memorizzata è un gruppo di istruzioni SQL che formano un'unità logica ed eseguono una particolare attività. Ad esempio, le operazioni su un database dei dipendenti (assunzione, licenziamento, promozione, ricerca) potrebbero essere codificate come procedure memorizzate eseguite dal codice dell'applicazione. Le stored procedure possono essere chiamate utilizzando la classe CallableStatement nell'API JDBC. Ad esempio, il codice seguente lo dimostra

CallableStatement cs = con.prepareCall("{call MY_SAMPLE_STORED_PROC}");
ResultSet rs = cs.executeQuery();

La sintassi di escape offre la flessibilità di utilizzare le funzioni specifiche del database non disponibili utilizzando metodi e proprietà JDBC standard.

Il formato della sintassi di escape SQL generale è il seguente

{keyword 'parameters'}.

JDBC definisce le sequenze di escape che contengono la sintassi standard per le seguenti funzioni del linguaggio

  • Valori letterali data, ora e timestamp (d, t, ts parole chiave).

  • Funzioni scalari come funzioni numeriche, di stringa e di conversione del tipo di dati (parola chiave fn).

  • Outer join (oj parola chiave)

  • Caratteri di escape per i caratteri jolly utilizzati nelle clausole LIKE (parola chiave di escape).

  • Chiamate di procedura (chiamata parola chiave).

Una transazione è un'unità logica di lavoro. Per completare un'unità logica di lavoro, potrebbe essere necessario eseguire diverse azioni su un database. Le transazioni vengono utilizzate per fornire integrità dei dati, semantica corretta dell'applicazione e una visualizzazione coerente dei dati durante l'accesso simultaneo.

Segui i passaggi come sotto

//turn off the implicit commit
Connection.setAutoCommit(false);
//..your insert/update/delete goes here
Connection.Commit();
//a new transaction is implicitly started.

Quando viene emessa una richiesta di connessione, DriverManager chiede a ciascun driver caricato se comprende l'URL inviato. Quando l'URL passato non è costruito correttamente, viene restituito il messaggio "Nessun driver adatto".

  • boolean execute() - Esegue qualsiasi tipo di istruzione SQL.

  • ResultSet executeQuery()- Viene utilizzato generalmente per leggere il contenuto del database. L'output sarà sotto forma di ResultSet. Generalmente viene utilizzata l'istruzione SELECT.

  • int executeUpdate()- Questo è generalmente utilizzato per alterare i database. In genere verranno utilizzate le istruzioni DROP TABLE o DATABASE, INSERT into TABLE, UPDATE TABLE, DELETE from TABLE. L'output sarà nella forma di int che denota il numero di righe interessate dalla query.

È necessario chiudere il gruppo di risultati, l'istruzione e la connessione. Se la connessione proviene da un pool, chiudendola viene effettivamente rimandata al pool per il riutilizzo. Possiamo farlo nel blocco finalmente {}, in modo tale che se viene lanciata un'eccezione, hai ancora la possibilità di chiuderla.

Questi sono usati per memorizzare grandi quantità di dati nel database come immagini, film ecc. Che sono di dimensioni estremamente grandi.

Ogni fornitore di database fornisce l'implementazione di ResultSet e altre interfacce, tramite il driver.

Il pool di connessioni è una tecnica utilizzata per riutilizzare le connessioni fisiche e ridurre il sovraccarico per l'applicazione. La funzionalità di pool di connessioni riduce al minimo le operazioni costose nella creazione e chiusura di sessioni. Il fornitore di database aiuta più client a condividere un insieme di oggetti di connessione memorizzati nella cache che fornisce l'accesso a un database. I client non devono creare una nuova connessione ogni volta per interagire con il database.

Se si utilizza un server delle applicazioni come WebLogic, WebSphere, jBoss, Tomcat. , quindi il server delle applicazioni fornisce le funzionalità da configurare per il pool di connessioni. Se non si utilizza un server delle applicazioni, è possibile utilizzare componenti come il componente DBCP di Apache Commons.

java.sql.Blob ha prestazioni migliori in quanto non estrae alcun dato dal database fino a quando non lo chiedi esplicitamente.

java.sql.Clob ha prestazioni migliori in quanto non estrae alcun dato dal database fino a quando non lo chiedi esplicitamente.

Utilizzare il metodo Statement.setFetchSize per indicare la dimensione di ogni recupero del database.

Class.forName ("MyClass")

  • Carica la classe MyClass.

  • Esegui qualsiasi codice blocco statico di MyClass.

  • Restituisce un'istanza di MyClass.

No, non è così. Una dichiarazione di importazione dice al compilatore quale classe cercare. Class.forName () indica alla classe Class di trovare un caricatore di classi e di caricare quel particolare oggetto Class nella memoria utilizzata dalla JVM.

La concorrenza del ResultSet determina se il ResultSet può essere aggiornato o solo letto. Un ResultSet può avere uno dei due livelli di concorrenza

  • ResultSet.CONCUR_READ_ONLY - significa che il ResultSet può essere solo letto.

  • ResultSet.CONCUR_UPDATABLE - significa che il ResultSet può essere sia letto che aggiornato.

La differenza tra setFetchSize (int) e setMaxRow (int) sono

  • setFetchSize (int) definisce il numero di righe che verranno lette dal database quando il ResultSet necessita di più righe. setFetchSize (int) influenza il modo in cui il database restituisce i dati ResultSet.

  • Il metodo setMaxRows (int) del ResultSet specifica il numero di righe che un ResultSet può contenere alla volta. setMaxRows (int) influisce sull'oggetto JDBC lato client.

Un oggetto RowSet JDBC contiene dati tabulari in un modo che lo rende più flessibile e più facile da usare rispetto a un set di risultati. Gli oggetti RowSet sono componenti JavaBeans.

Esistono due tipi di RowSet

  • ConnectedUn oggetto RowSet connesso è di natura permanente. Non termina fino a quando non viene chiusa l'applicazione.

  • DisconnectedUn oggetto RowSet disconnesso è di natura ad-hoc. Ogni volta che richiede il recupero dei dati dal database, stabilisce la connessione e la chiude al termine dell'attività richiesta. I dati modificati durante lo stato disconnesso vengono aggiornati dopo che la connessione viene ristabilita.

Nelle transazioni di database tipiche, supponiamo che una transazione legga e modifichi il valore mentre la seconda transazione legge il valore prima di eseguire il commit o il rollback della prima transazione. Questo processo di lettura è chiamato "lettura sporca". Perché c'è sempre la possibilità che la prima transazione possa annullare la modifica che fa sì che la seconda transazione legga un valore non valido.

TRANSACTION_READ_COMMITTED impedisce le letture sporche.

L'API JDBC ha due interfacce di metadati DatabaseMetaData e ResultSetMetaData. I metadati forniscono informazioni complete sul database nel suo insieme. L'implementazione di queste interfacce viene implementata dai fornitori di driver di database per consentire agli utenti di conoscere le capacità di un database.

Segui i passaggi seguenti

Prima imposta la nuova origine dati ODBC. Vai a Strumenti di amministrazione -> Origini dati (ODBC) -> scheda DSN di sistema -> Aggiungi -> Driver fai Microsoft Excel (*. Xls) -> Fine. Ora dai il nome dell'origine dati (SampleExcel) e la descrizione. Quindi, fai clic su Seleziona cartella di lavoro e punta al tuo foglio Excel.

Nel codice fare alle seguenti aggiunte di codice

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn = DriverManager.getConnection("jdbcodbcSampleExcel","","");
stmt = conn.createStatement();
sql = "select * from [Sheet1$]";
rs=stmt.executeQuery(sql);

Dove Sheet1 è il nome del foglio Excel.

  • Hibernate è uno strumento di mappatura relazionale di oggetti. Associa gli oggetti ai dati relazionali.

  • Java Naming and Directory Interface (JNDI) è un'API per accedere a diversi servizi di denominazione e directory. Lo usi per accedere a qualcosa archiviato in una directory o in un servizio di denominazione senza dover codificare specificamente per quel servizio di denominazione o directory.

  • L'API JDBC (Java DataBase Connectivity) è un'API per accedere a diversi database relazionali. Lo si utilizza per accedere ai database relazionali senza incorporare una dipendenza da un tipo di database specifico nel codice.