Pourquoi utilisons-nous Class.forName ("oracle.jdbc.driver.OracleDriver") lors de la connexion à une base de données?
Qu'est-ce que l'utilisation réelle de Class.forName("oracle.jdbc.driver.OracleDriver")
lors de la connexion à une base de données? Pourquoi ne peux-nous il suffit d'importer la même classe, au lieu de cela, pourquoi nous sommes chargement.
source d'informationauteur vidyashi | 2013-11-19
Vous devez vous connecter pour publier un commentaire.
L'idée de base derrière l'utilisation de
Class.forName()
est de charger un pilote JDBC de mise en œuvre. Un (normal) pilote JDBC doit contenir un initialiseur statique qui enregistre une instance du pilote de mise en œuvre avecjava.sql.DriverManager
:(à partir de JDBC 4.1, section 9.2)
Depuis JDBC 4.0 cependant, il est une nouvelle façon d'inscrire les pilotes: le jar du pilote JDBC doit inclure un fichier
/META-INF/services/java.sql.Driver
qui contient le nom(s) de l'java.sql.Driver
mises en œuvre dans ce pot. Lorsque vous créez une connexion à l'aide de laDriverManager
il utiliserajava.util.ServiceLoader
pour énumérer tous les/META-INF/services/java.sql.Driver
les fichiers dans le chemin de classe et de charger tous les pilotes afin qu'ils vous inscrire.(à partir de JDBC 4.1, section 9.2.1)
Les raisons les pilotes sont chargés de cette façon, c'est qu'il vous permet de vous détacher une application à partir du pilote (et base de données) qu'il utilise. Cela signifie que vous pouvez écrire, compiler et même de distribuer une application sans pilotes, vous ne devez utiliser les interfaces fournies dans le
java.sql
(etjavax.sql
) - qui fait partie de Java sans avoir besoin d'accéder à la mise en œuvre directement.L'utilisateur de l'application, puis ajoute un valide de pilote JDBC dans le classpath (et la configuration des choses comme une chaîne de connexion) pour que l'application puisse fait pour se connecter à une base de données. Avant de JDBC 4.0, l'utilisateur devra spécifier le nom du pilote, de sorte que l'application peut charger à l'aide de
Class.forName
avec JDBC 4.0 compatible pilote et Java 6 ou plus, cette découverte est automatique.Lorsque vous chargez un pilote littéralement avec
Class.forName("oracle.jdbc.driver.OracleDriver")
il peut sembler exagéré, mais si vous gardez à l'esprit qu'il pourrait également être une chaîne tiré à partir d'un fichier de configuration (ou de la saisie de l'utilisateur), vous pourriez commencer à comprendre pourquoi il est si puissant.Bien sûr, ce pilote d'indépendance n'est pas à 100%, et surtout pas si votre application utilise le fournisseur SQL spécifique. Mais la théorie est que votre demande puisse être indépendante de base de données. JDBC fournit également certains des mécanismes supplémentaires pour répondre à cela, par exemple JDBC échappe à fournir une syntaxe commune que le conducteur se traduit par la syntaxe spécifique, et
DatabaseMetaData
qui vous permet de découvrir les caractéristiques, les mots réservés, etc, qui vous permettent de créer ou générer compatible requêtes.Un couple de raisons d'utiliser
Class.forName("")
au lieu de simplement le référencement de la classe:À l'aide de
Class.forName("")
vous donne plus évident de contrôler exactement où la première tentative de charger la classe spécifiée sera faite dans votre code. De ce fait, il est plus évident de l'endroit où le code sera un échec (lever une exception) si cette classe n'est pas présent dans le classpath lors que ce code s'exécute.Si vous il suffit d'importer la classe, puis de référence dans votre code, il devient un peu moins évident, d'où le code va lever une exception si la classe n'est pas présent.
Également, à l'aide de
Class.forName("")
est un moyen de contourner le potentiel de compiler des restrictions de temps. Si, par exemple, la personne de la compilation le code n'est pas (pour, disons, l'octroi de licences de propriété intellectuelle ou les raisons) ont accès à la classe oracle.jdbc.le pilote.OracleDriver, ils peuvent trouver plus facile de compiler du code qui fait référence à la classe parClass.forName("")
plutôt que directement.Si vous n'avez pas besoin d'utiliser toutes les méthodes, champs, ou à l'intérieur des classes de la classe spécifiée, puis
Class.forName("")
peut-être la façon la plus claire d'exprimer que la seule chose désirée est à la charge de la classe (et les initialiseurs statiques), et rien d'autre.Je ne pense pas que la Classe.forName présente différentes comportement fonctionnel de référencement dans la classe. Il utilise l'appel de la classe classloader par défaut, qui doit être le même chargeur de classe qui est utilisée lors de la référence à la classe directement. Il y a quelques surcharges de Classe.forName("") qui vous permettent de personnaliser le comportement de chargement de classe un peu plus.
C'est un héritage façon de le faire. L'importation de classe, vous aurez supplémentaire de dépendance
De La Java Tutoriel:
Classe.forName(“oracle.jdbc.le pilote.OracleDriver”) prend le nom de la classe comme un argument de type chaîne et le charge en mémoire. Deuxième moyen de chargement d'une classe est simplement la création d'une instance de l'aide
new
. Inconvénient de la deuxième méthode est l'instance nouvellement créée sera d'aucune utilité si vous n'en avez pas besoin.Il y a un bon tutoriel explique Connexion JDBC bases.
Parfois, il est nécessaire de charger une classe pendant le temps d'exécution. j'.e, toute classe peut être chargé dans l'emplacement de la mémoire dynamiquement lors de l'exécution de l'application java. Le
Class.forName
est utilisé pour charger une classe (à l'intérieur de guillemets doubles comme une Chaîne de caractères) au moment de l'exécution. Par exemple, lorsque nous utilisons l'IDE, nous voir, il y aura un GUI builder qui nous permet de glisser et déposer les boutons, champs de texte, etc. Ce glisser-déposer mécanisme interne ne nécessite certaines classes soient chargées au moment de l'exécution.Dans la Classe.forName (
sun.jdbc.odbc.JdbcOdbcDriver
), la Classe appartient le paquetjava.lang.Class
et laforName()
est une méthode statique de lajava.lang.Class
. Les Pilotes JDBC (String) sera chargé dans la classe dynamiquement au moment de l'exécution et de la méthode forName contient statique de l'édifice, qui crée le Pilote objet de classe et d'enregistrer avec leDriverManager
Service automatiquement. Depuis leforName()
est statique, nous l'appelons en utilisant le nom de la classe (Classe).Lorsque l'on veut exécuter le bloc statique d'une classe, sans la création de son objet, alors nous pouvons utiliser
class.forName()
. La plupart des travaux queDriver
classe, existe dans sa statique bloc.Maintenant ce que nous avons besoin dans notre connectivité JDBC est d'obtenir le pilote enregistré avec
DriverManager
et d'obtenir des connexions avec elle, de sorte que cela peut être réalisé simplement en obtenant statique bloc exécuté et il n'est pas nécessaire de créer un objet de cette classe. Cette approche permettra de donner un meilleur rendement.Ce est utilisé pour ouvrir une classe ou dans d'autres mots de l'appeler par son nom de format de chaîne de caractères.
Par exemple:
Et il va commencer à la classe à l'intérieur de l'emballage com/android/example/MainClass.java