JDBC signifie Java Database Connectivity, qui est une API Java standard pour la connectivité indépendante de la base de données entre le langage de programmation Java et un large éventail de bases de données.

L'architecture JDBC générale se compose de deux couches API JDBC (Cela fournit la connexion application-à-JDBC Manager) et JDBC Driver API (Cela prend en charge la connexion JDBC Manager-to-Driver).

L'API JDBC comprend les interfaces et les classes suivantes: DriverManager, Driver, Connection, Statement, ResultSet, SQLException.

JDBC DriverManager est une classe qui gère une liste de pilotes de base de données. Il fait correspondre les demandes de connexion de l'application java avec le pilote de base de données approprié en utilisant le sous-protocole de communication.

Le pilote JDBC est une interface permettant à une application Java d'interagir avec une base de données. Pour se connecter à des bases de données individuelles, JDBC nécessite des pilotes pour chaque base de données. Le pilote JDBC donne la connexion à la base de données et implémente le protocole de transfert de la requête et du résultat entre le client et la base de données.

L'interface de connexion comprend des méthodes pour contacter une base de données. L'objet de connexion représente le contexte de communication.

L'instruction encapsule une instruction SQL qui est transmise à la base de données pour être analysée, compilée, planifiée et exécutée.

Ces objets contiennent des données extraites d'une base de données après avoir exécuté une requête SQL à l'aide d'objets Statement. Il agit comme un itérateur pour vous permettre de parcourir ses données. L'interface java.sql.ResultSet représente l'ensemble de résultats d'une requête de base de données.

Il existe trois constantes qui, lorsqu'elles sont définies dans le jeu de résultats, peuvent déplacer le curseur du jeu de résultats vers l'arrière, vers l'avant et également dans une ligne particulière.

  • ResultSet.TYPE_FORWARD_ONLY - Le curseur ne peut avancer que dans le jeu de résultats.

  • ResultSet.TYPE_SCROLL_INSENSITIVE - Le curseur peut faire défiler vers l'avant et vers l'arrière, et le jeu de résultats n'est pas sensible aux modifications apportées par d'autres à la base de données après la création du jeu de résultats.

  • ResultSet.TYPE_SCROLL_SENSITIVE - Le curseur peut faire défiler vers l'avant et vers l'arrière, et l'ensemble de résultats est sensible aux modifications apportées par d'autres à la base de données qui se produisent après la création de l'ensemble de résultats.

Voici les étapes de base pour créer une application JDBC

  • Importez des packages contenant les classes JDBC nécessaires à la programmation de la base de données.

  • Enregistrez le pilote JDBC afin de pouvoir ouvrir un canal de communication avec la base de données.

  • Ouvrez une connexion à l'aide de la méthode DriverManager.getConnection ().

  • Exécutez une requête à l'aide d'un objet de type Statement.

  • Extrayez les données de l'ensemble de résultats à l'aide de la méthode ResultSet.getXXX () appropriée.

  • Nettoyez l'environnement en fermant toutes les ressources de la base de données reposant sur le garbage collection de la JVM.

Il existe quatre types de pilotes JDBC

  • JDBC-ODBC Bridge plus ODBC driver - également appelé Type 1 appelle le code natif du pilote ODBC disponible localement.

  • Native-API, partly Java driver- également appelé Type 2 appelle la bibliothèque native du fournisseur de base de données côté client. Ce code communique ensuite avec la base de données sur le réseau.

  • JDBC-Net, pure Java driver - également appelé Type 3, le pilote pur-java qui communique avec le middleware côté serveur qui communique ensuite avec la base de données.

  • Native-protocol, pure Java driver - également appelé Type 4, le pilote pur-java qui utilise le protocole natif de la base de données.

Voici une liste des cas où les quatre types de pilotes peuvent être utilisés

  • Si vous accédez à un type de base de données, tel qu'Oracle, Sybase ou IBM, le type de pilote préféré est 4.

  • Si votre application Java accède à plusieurs types de bases de données en même temps, le type 3 est le pilote préféré.

  • Les pilotes de type 2 sont utiles dans les situations où un pilote de type 3 ou de type 4 n'est pas encore disponible pour votre base de données.

  • Le pilote de type 1 n'est pas considéré comme un pilote de niveau déploiement et est généralement utilisé uniquement à des fins de développement et de test.

Le pilote JDBC Net pur Java (Type 4) est le pilote le plus rapide car il convertit les appels JDBC en appels de protocole spécifiques au fournisseur et interagit directement avec la base de données.

Non. Vous ne pouvez ouvrir qu'un seul objet Statement par connexion lorsque vous utilisez le pont JDBC-ODBC.

Les niveaux d'isolement standard sont

  • TRANSACTION_NONE

  • TRANSACTION_READ_COMMITTED

  • TRANSACTION_READ_UNCOMMITTED

  • TRANSACTION_REPEATABLE_READ

  • TRANSACTION_SERIALIZABLE

L'architecture JDBC dissocie une abstraction de son implémentation. Par conséquent, JDBC suit un modèle de conception de pont. L'API JDBC fournit l'abstraction et les pilotes JDBC fournissent l'implémentation. Les nouveaux pilotes peuvent être connectés à l'API JDBC sans changer le code client.

Les types de déclarations sont

  • Statement - instruction SQL régulière.

  • PreparedStatement - plus efficace que l'instruction en raison de la pré-compilation de SQL.

  • CallableStatement - pour appeler des procédures stockées sur la base de données.

Les relevés préparés offrent de meilleures performances, car ils sont pré-compilés. Les instructions préparées réutilisent le même plan d'exécution pour différents arguments plutôt que de créer un nouveau plan d'exécution à chaque fois. Les instructions préparées utilisent des arguments de liaison, qui sont envoyés au moteur de base de données. Cela permet de mapper différentes requêtes avec la même instruction préparée mais des arguments différents pour exécuter le même plan d'exécution. Les instructions préparées sont plus sécurisées car elles utilisent des variables de liaison, ce qui peut empêcher les attaques par injection SQL.

  • Class.forName()- Cette méthode charge dynamiquement le fichier de classe du pilote dans la mémoire, qui l'enregistre automatiquement. Cette méthode est préférable car elle vous permet de rendre l'enregistrement du pilote configurable et portable.

  • DriverManager.registerDriver() - Cette méthode statique est utilisée si vous utilisez une JVM non compatible JDK, telle que celle fournie par Microsoft.

Voici quelques avantages de JDBC 4.0

  • Chargement automatique de la classe de pilote JDBC. Dans les versions antérieures, nous devions enregistrer et charger manuellement les pilotes à l'aide de class.forName.

  • Améliorations de la gestion des connexions. Nouvelles méthodes ajoutées à javax.sql.PooledConnection.

  • DataSet Implémentation de SQL à l'aide d'annotations.

  • Prise en charge de SQL XML.

Les performances ou la rapidité du pilote JDBC dépendent d'un certain nombre de problèmes. Qualité du code du pilote, taille du code du pilote, serveur de base de données et sa charge, topologie du réseau, nombre de fois que votre demande est traduite vers une API différente.

Parlez de votre expérience en temps réel.

Il existe 3 méthodes DriverManager.getConnection () surchargées pour créer un objet de connexion

getConnection (String url, String user, String password) Utilisation d'une URL de base de données avec un nom d'utilisateur et un mot de passe. Par exemple

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

Utilisez les méthodes DatabaseMetaData supportsOpenStatementsAcrossCommit () et supportsOpenStatementsAcrossRollback () pour vérifier.

La spécification ne mentionne aucune limitation de taille pour Statement.addBatch (), cela dépend du pilote.

Il existe plusieurs méthodes dans l'interface ResultSet qui impliquent de déplacer le curseur, comme beforeFirst (), afterLast (), first (), last (), absolute (int row), relative (int row), previous (), next () , getRow (), moveToInsertRow (), moveToCurrentRow ().

L'interface ResultSet contient des méthodes get pour chacun des types de données possibles, et chaque méthode get a deux versions

  • Celui qui prend un nom de colonne.

  • Celui qui prend dans un index de colonne.

Par exemple, getInt (String columnName), getInt (int columnIndex)

L'interface ResultSet contient une collection de méthodes de mise à jour pour mettre à jour les données d'un jeu de résultats. Chaque méthode de mise à jour a deux versions pour chaque type de données

  • Celui qui prend un nom de colonne.

  • Celui qui prend dans un index de colonne.

Ces méthodes modifient les colonnes de la ligne actuelle dans l'objet ResultSet, mais pas dans la base de données sous-jacente. Pour mettre à jour vos modifications apportées à la ligne dans la base de données, vous devez appeler l'une des méthodes suivantes

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

Le pilote JDBC convertit le type de données Java en type JDBC approprié avant de l'envoyer à la base de données. Il utilise un mappage par défaut pour la plupart des types de données. Par exemple, un int Java est converti en un INTEGER SQL.

"Aucun pilote approprié" se produit lors d'un appel à la méthode DriverManager.getConnection, peut être de l'une des raisons suivantes

  • En raison de l'échec du chargement des pilotes JDBC appropriés avant d'appeler la méthode getConnection.

  • Il peut s'agir de spécifier une URL JDBC non valide, qui n'est pas reconnue par le pilote JDBC.

  • Cette erreur peut se produire si une ou plusieurs bibliothèques partagées nécessaires au pont ne peuvent pas être chargées.

L'utilisation par SQL des valeurs NULL et l'utilisation par Java de null sont des concepts différents. Vous pouvez utiliser trois tactiques

  • Évitez d'utiliser les méthodes getXXX () qui renvoient des types de données primitifs.

  • Utilisez des classes wrapper pour les types de données primitifs et utilisez la méthode wasNull () de l'objet ResultSet pour tester si la variable de classe wrapper qui a reçu la valeur renvoyée par la méthode getXXX () doit être définie sur null.

  • Utilisez des types de données primitifs et la méthode wasNull () de l'objet ResultSet pour tester si la variable primitive qui a reçu la valeur renvoyée par la méthode getXXX () doit être définie sur une valeur acceptable que vous avez choisie pour représenter un NULL.

Lorsqu'une connexion est créée, elle est en mode de validation automatique. Cela signifie que chaque instruction SQL individuelle est traitée comme une transaction et sera automatiquement validée juste après son exécution. En définissant auto-commit sur false, aucune instruction SQL ne sera validée jusqu'à ce que vous appeliez explicitement la méthode de validation.

Voici les raisons

  • Pour augmenter les performances.

  • Maintenir l'intégrité des processus métier.

  • Pour utiliser des transactions distribuées.

Un point de sauvegarde marque un point auquel la transaction en cours peut revenir. Au lieu d'annuler toutes ses modifications, il peut choisir de n'en annuler qu'une partie. Par exemple, supposons que vous

  • démarrer une transaction.

  • insérez 10 lignes dans un tableau.

  • définir un point de sauvegarde.

  • insérez encore 5 lignes.

  • revenir au point de sauvegarde.

  • valider la transaction.

Après cela, le tableau contiendra les 10 premières lignes que vous avez insérées. Les 5 autres lignes auront été supprimées par la restauration. Un point de sauvegarde est juste un marqueur sur lequel la transaction actuelle peut revenir.

Les objets SQLWarning sont une sous-classe de SQLException qui traitent les avertissements d'accès à la base de données. Les avertissements n'arrêtent pas l'exécution d'une application, comme le font les exceptions. Ils alertent simplement l'utilisateur que quelque chose ne s'est pas produit comme prévu. Un avertissement peut être signalé sur un objet Connection, un objet Statement (y compris les objets PreparedStatement et CallableStatement) ou un objet ResultSet. Chacune de ces classes a une méthode getWarnings.

Le traitement par lots vous permet de regrouper les instructions SQL associées dans un lot et de les soumettre en un seul appel à la base de données.

Les séquences typiques d'étapes pour utiliser le traitement par lots avec un objet Statement ou PrepareStatement sont

  • En cas de traitement par lots à l'aide de l'objet PrepareStatement, créez des instructions SQL avec des espaces réservés.

  • Créez un objet Statement ou PrepareStatement à l'aide des méthodes createStatement () ou prepareStatement () respectivement.

  • Définissez l'auto-commit sur false à l'aide de setAutoCommit ().

  • Ajoutez autant d'instructions SQL que vous le souhaitez dans le lot en utilisant la méthode addBatch () sur l'objet instruction créé.

  • Exécutez toutes les instructions SQL à l'aide de la méthode executeBatch () sur l'objet instruction créé.

  • Enfin, validez toutes les modifications en utilisant la méthode commit ().

Une procédure stockée est un groupe d'instructions SQL qui forment une unité logique et exécutent une tâche particulière. Par exemple, les opérations sur une base de données d'employés (embaucher, licencier, promouvoir, rechercher) pourraient être codées comme des procédures stockées exécutées par le code d'application. Les procédures stockées peuvent être appelées à l'aide de la classe CallableStatement dans l'API JDBC. Par exemple, le code suivant illustre cela

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

La syntaxe d'échappement vous donne la flexibilité d'utiliser des fonctionnalités spécifiques à la base de données qui ne vous sont pas disponibles en utilisant les méthodes et propriétés JDBC standard.

Le format général de la syntaxe d'échappement SQL est le suivant

{keyword 'parameters'}.

JDBC définit des séquences d'échappement contenant la syntaxe standard des fonctionnalités de langage suivantes

  • Littéraux de date, d'heure et d'horodatage (mots clés d, t, ts).

  • Fonctions scalaires telles que les fonctions de conversion numérique, chaîne et type de données (mot-clé fn).

  • Jointures externes (mot-clé oj)

  • Caractères d'échappement pour les caractères génériques utilisés dans les clauses LIKE (mot-clé d'échappement).

  • Appels de procédure (appel mot-clé).

Une transaction est une unité logique de travail. Pour terminer une unité de travail logique, plusieurs actions peuvent être nécessaires sur une base de données. Les transactions sont utilisées pour fournir l'intégrité des données, une sémantique d'application correcte et une vue cohérente des données lors d'un accès simultané.

Suivez les étapes ci-dessous

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

Lorsqu'une demande de connexion est émise, le DriverManager demande à chaque pilote chargé s'il comprend l'URL envoyée. Lorsque l'URL transmise n'est pas correctement construite, le message «Aucun pilote approprié» est renvoyé.

  • boolean execute() - Exécute tout type d'instruction SQL.

  • ResultSet executeQuery()- Ceci est généralement utilisé pour lire le contenu de la base de données. La sortie sera sous la forme de ResultSet. L'instruction SELECT est généralement utilisée.

  • int executeUpdate()- Ceci est généralement utilisé pour modifier les bases de données. Généralement, les instructions DROP TABLE ou DATABASE, INSERT into TABLE, UPDATE TABLE, DELETE from TABLE seront utilisées. La sortie sera sous la forme de int qui indique le nombre de lignes affectées par la requête.

Vous devez fermer l'ensemble de résultats, l'instruction et la connexion. Si la connexion provient d'un pool, sa fermeture la renvoie en fait au pool pour une réutilisation. Nous pouvons le faire dans le bloc finally {}, de sorte que si une exception est levée, vous avez toujours la possibilité de la fermer.

Ceux-ci sont utilisés pour stocker une grande quantité de données dans une base de données comme des images, des films, etc. qui sont de très grande taille.

Chaque fournisseur de base de données fournit la mise en œuvre de ResultSet et d'autres interfaces, via le pilote.

Le regroupement de connexions est une technique utilisée pour la réutilisation des connexions physiques et la réduction des frais généraux pour votre application. La fonctionnalité de regroupement de connexions minimise les opérations coûteuses lors de la création et de la fermeture des sessions. Le fournisseur de base de données aide plusieurs clients à partager un ensemble d'objets de connexion mis en cache qui donne accès à une base de données. Les clients n'ont pas besoin de créer une nouvelle connexion à chaque fois pour interagir avec la base de données.

Si vous utilisez un serveur d'applications tel que WebLogic, WebSphere, jBoss, Tomcat. , votre serveur d'applications fournit les fonctionnalités à configurer pour le regroupement de connexions. Si vous n'utilisez pas de serveur d'applications, des composants tels que Apache Commons DBCP Component peuvent être utilisés.

java.sql.Blob a de meilleures performances car il n'extrait aucune donnée de la base de données jusqu'à ce que vous le lui demandiez explicitement.

java.sql.Clob a de meilleures performances car il n'extrait aucune donnée de la base de données jusqu'à ce que vous le lui demandiez explicitement.

Utilisez la méthode Statement.setFetchSize pour indiquer la taille de chaque extraction de base de données.

Class.forName ("MaClasse")

  • Charge la classe MyClass.

  • Exécutez tout code de bloc statique de MyClass.

  • Renvoie une instance de MyClass.

Non, ce n'est pas le cas. Une instruction d'importation indique au compilateur la classe à rechercher. Class.forName () demande à la classe de trouver un chargeur de classe et de charger cet objet de classe particulier dans la mémoire utilisée par la JVM.

La simultanéité ResultSet détermine si le ResultSet peut être mis à jour ou uniquement en lecture. Un ResultSet peut avoir l'un des deux niveaux de concurrence

  • ResultSet.CONCUR_READ_ONLY - signifie que le ResultSet ne peut être lu.

  • ResultSet.CONCUR_UPDATABLE - signifie que le ResultSet peut être lu et mis à jour.

La différence entre setFetchSize (int) et setMaxRow (int) est

  • setFetchSize (int) définit le nombre de lignes qui seront lues à partir de la base de données lorsque le ResultSet a besoin de plus de lignes. setFetchSize (int) affecte la manière dont la base de données renvoie les données ResultSet.

  • La méthode setMaxRows (int) du ResultSet spécifie le nombre de lignes qu'un ResultSet peut contenir à la fois. setMaxRows (int) affecte l'objet JDBC côté client.

Un objet JDBC RowSet contient des données tabulaires d'une manière qui le rend plus flexible et plus facile à utiliser qu'un jeu de résultats. Les objets RowSet sont des composants JavaBeans.

Il existe deux types de RowSet

  • ConnectedUn objet RowSet connecté est de nature permanente. Il ne se termine pas tant que l'application n'est pas terminée.

  • DisconnectedUn objet RowSet déconnecté est de nature ad hoc. Chaque fois qu'il a besoin de récupérer des données de la base de données, il établit la connexion et la ferme une fois la tâche requise terminée. Les données modifiées pendant l'état déconnecté sont mises à jour une fois la connexion rétablie.

Dans les transactions de base de données typiques, disons qu'une transaction lit et change la valeur tandis que la deuxième transaction lit la valeur avant de valider ou de revenir en arrière par la première transaction. Ce processus de lecture est appelé «lecture sale». Parce qu'il y a toujours une chance que la première transaction puisse annuler la modification qui provoque la deuxième transaction lit une valeur non valide.

TRANSACTION_READ_COMMITTED empêche les lectures modifiées.

L'API JDBC a deux interfaces de métadonnées DatabaseMetaData et ResultSetMetaData. Les métadonnées fournissent des informations complètes sur la base de données dans son ensemble. L'implémentation de ces interfaces est implémentée par les fournisseurs de pilotes de base de données pour informer les utilisateurs des capacités d'une base de données.

Suivez les étapes ci-dessous

Commencez par configurer la nouvelle source de données ODBC. Allez dans Outils d'administration -> Sources de données (ODBC) -> Onglet DSN système -> Ajouter -> Pilote pour Microsoft Excel (*. Xls) -> Terminer Donnez maintenant le nom de la source de données (SampleExcel) et la description. Ensuite, cliquez sur Sélectionner un classeur et pointez sur votre feuille Excel.

Dans le code, faites les ajouts de code suivants

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

Où Sheet1 est le nom de la feuille Excel.

  • Hibernate est un outil de mappage objet-relationnel. Il mappe les objets aux données relationnelles.

  • L'interface de nommage et d'annuaire Java (JNDI) est une API permettant d'accéder à différents services de dénomination et d'annuaire. Vous l'utilisez pour accéder à quelque chose stocké dans un annuaire ou un service de dénomination sans avoir à coder spécifiquement pour ce service de dénomination ou d'annuaire.

  • L'API Java DataBase Connectivity (JDBC) est une API permettant d'accéder à différentes bases de données relationnelles. Vous l'utilisez pour accéder aux bases de données relationnelles sans incorporer une dépendance à un type de base de données spécifique dans votre code.