Cet article décrit les connaissances et compétences de base de JDBC avec des exemples. Partagez-le avec tout le monde pour votre référence. L’analyse spécifique est la suivante :
1. Qu'est-ce que JDBC ?
En termes simples, la technologie JDBC utilise un programme Java pour envoyer des instructions SQL à la base de données. La base de données exécute les instructions SQL après les avoir reçues et renvoie les résultats au programme Java pour gestion.
2. Quelles sont les conditions d'utilisation de JDBC ?
A) L'adresse de l'hôte de la base de données cible
B) Le numéro de port occupé par le logiciel de base de données sur l'hôte
C) Nom d'utilisateur utilisé pour se connecter à la base de données
D) Mot de passe pour ce nom d'utilisateur
E) Connectez-vous à la base de données
3.Principes de la technologie JDBC
Nous savons qu'il existe différents types de bases de données et que les normes et spécifications de bases de données produites par différents fabricants sont différentes. À l'heure actuelle, si nous utilisons du code JAVA pour envoyer des instructions SQL, nous devons écrire un ensemble après l'autre en fonction de différentes bases de données. Un ensemble de codes de fonctionnement, qui représente un coût de développement énorme pour les développeurs de programmes, donc SU Lorsque la société N a développé la technologie JDBC, elle a stipulé un ensemble d'interfaces standard. Les fabricants de bases de données doivent fournir un pilote pour implémenter cet ensemble d'interfaces. Ensuite, tant que les développeurs de programmes utilisent le pilote de la base de données pendant le développement, ils doivent utiliser une méthode cohérente. . Pour développer, il n'est pas nécessaire d'écrire un ensemble de codes pour s'adapter aux différentes bases de données.
4. API de base dans JDBC
|- Driver : L'interface implémentée par la classe driver.
|-Connection connect(String url, Properties info) --utilisé pour se connecter à la base de données et obtenir l'objet de connexion
Paramètres qui doivent être définis dans Propriétés :
url : chaîne URL de connexion à la base de données. Protocole+sous-protocole de base de données+hôte+port+base de données
user : nom d'utilisateur de la base de données
mot de passe : mot de passe de l'utilisateur
|-Connexion : interface pour se connecter à la base de données
|- Statement createStatement() --Créer un objet Statement pour envoyer des instructions SQL
|- PreparedStatement prepareStatement(String sql) - Crée un objet PreparedStatement pour envoyer des instructions SQL précompilées
|-CallableStatement prepareCall(String sql) --Créez un objet CallableStatement pour appeler des procédures stockées.
|-Statement : utilisé pour exécuter des instructions SQL statiques
|-int executeUpdate(String sql) --Exécuter l'opération de mise à jour (DDL+DML)
|-ResultSet executeQuery(String sql) --Exécuter l'opération de requête (DQL)
|- PreparedStatement : utilisé pour exécuter des instructions SQL précompilées
|- int executeUpdate() -- effectue une opération de mise à jour
|- ResultSet executeQuery() -- Exécuter une opération de requête
|- CallableStatement : SQL utilisé pour exécuter des procédures stockées
|- ResultSet executeQuery() --Appelle la procédure stockée
|- ResultSet : ensemble de résultats. Utilisé pour encapsuler les données de requête de la base de données
|- boolean next() --Déplace le curseur d'enregistrement vers la ligne suivante
|- Object getObject(int columnIndex) -- Récupère la valeur du champ
Après avoir compris quelles API, utilisons JDBC pour envoyer des instructions SQL~
5. Utilisez l'objet Statement pour faire fonctionner la base de données
Opérations DDL et DML
Étape 1
Importez le package, car j'utilise une base de données MySQL, donc pour utiliser la technologie JDBC, vous devez utiliser le pilote de base de données fourni par le fabricant de la base de données MySQL. Par conséquent, la première étape consiste à importer le package du pilote de base de données dans le projet.
Nom du package utilisé : mysql-connector-java-5.1.7-bin.jar
Étape 2
Créez une classe ordinaire, ajoutez-y une méthode et copiez le code dans la méthode comme suit : //URL
URL de chaîne privée = "jdbc:mysql://localhost:3306/vmaxtam";
//utilisateur
utilisateur de chaîne privé = "root" ;
//mot de passe
mot de passe de chaîne privée = "root" ;
public void testDDL() lève une exception{
//1.Enregistrer le pilote
Class.forName("com.mysql.jdbc.Driver");
//2. Obtenez la connexion
Connexion conn = DriverManager.getConnection (url, utilisateur, mot de passe);
//3. Créer un objet Statement
Instruction stmt = conn.createStatement();
//4. Préparer l'instruction SQL
String sql = "CREATE TABLE student(sid INT PRIMARY KEY,sname VARCHAR(20),age INT)";
//5. Envoyez l'instruction SQL via l'objet d'instruction et renvoyez le résultat de l'exécution
int count = stmt.executeUpdate(sql);
//6.Imprimer les résultats de l'exécution
System.out.println("Enregistrements "+count+" concernés");
}
//7. Fermer les ressources
si(instruction!=null)
{
instruction.close();
}
si(conn!=null)
{
conn.close();
}
Si vous souhaitez effectuer des opérations DQL et DDL, vous pouvez écrire l'instruction SQL, puis appeler la méthode executlUpdate de l'instruction pour exécuter l'instruction SQL pour la base de données. Cette méthode renvoie une valeur entière indiquant le nombre de lignes de la base de données affectées.
Si nous ne modifions pas le programme ci-dessus et souhaitons émettre à nouveau des instructions SQL à la base de données, nous devons alors écrire un programme pour nous connecter à nouveau, et après l'opération, nous devons fermer l'objet d'instruction et l'objet de connexion, ce qui est très fastidieux. . Par conséquent, nous extrayons généralement le processus de connexion et le processus de libération d’objet dans une classe d’outils. Le code de la classe d'outils est le suivant :
Copiez le code comme suit : public class sqlUtil {
chaîne statique privée url = "jdbc:mysql://localhost:3306/vmaxtam";
utilisateur de chaîne statique privée = "root" ;
mot de passe de chaîne statique privée = "root" ;
// Obtenir la connexion
Connexion statique publique getconnection() {
Connexion de connexion = null ;
essayer {
// 1. Enregistrez le pilote
Class.forName("com.mysql.jdbc.Driver");
// 2. Obtenez la connexion
conn = DriverManager.getConnection (url, utilisateur, mot de passe);
// 3. Récupère l'objet de déclaration
Déclaration instruction = conn.createStatement();
} attraper (Exception e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
}
connexion de retour ;
}
// 7. Fermez la ressource
public static void close (Instruction de déclaration, connexion de connexion) {
{
essayer {
si (instruction != null)
instruction.close();
si (connexion != null) {
connexion.close();
}
} catch (SQLException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
}
}
}
}
Les éléments à considérer sont :
1) Un utilisateur n'a besoin d'enregistrer le pilote qu'une seule fois. Il n'est pas nécessaire d'enregistrer le pilote à chaque fois qu'il se connecte à la base de données, nous écrivons donc le processus d'enregistrement du pilote dans un bloc de code statique.
2) L'URL, le nom d'utilisateur, le mot de passe et le nom de la classe du pilote sont codés en dur dans le programme. Afin de pouvoir modifier la base de données ou l'utilisateur sans modifier le code, nous écrivons généralement ces informations dans un fichier de configuration.
Le fichier de configuration est écrit dans le répertoire src du projet et est nommé db.properties
Copiez le code comme suit : url=jdbc:mysql://localhost:3306/vmaxtam
utilisateur = racine
mot de passe=root
driverClass=com.mysql.jdbc.Drive
Lisez ensuite le fichier de configuration dans sqlUtil, et enfin optimisez-le dans le code suivant Copiez le code comme suit : public class sqlUtil {.
URL de chaîne statique privée = null ;
utilisateur de chaîne statique privée = null ;
mot de passe de chaîne statique privée = null ;
chaîne statique privée driverClass= null ;
statique{
essayer {
//1. Obtenez l'objet bytecode
Classclazz = sqlUtil.class;
//2. Appelez getResourceAsStream pour obtenir le chemin
InputStream inputStream = clazz.getResourceAsStream("/db.properties");
Propriétés pro = new Properties();
pro.load(inputStream);
//3. Lire les paramètres
url=pro.getProperty("url");
mot de passe=pro.getProperty("mot de passe");
user=pro.getProperty("utilisateur");
driverClass=pro.getProperty("driverClass");
Class.forName(driverClass);
} attraper (Exception e) {
e.printStackTrace();
System.out.println("Échec de l'enregistrement !" + e.getMessage());
lancer une nouvelle RuntimeException(e);
}
}
// Obtenir la connexion
Connexion statique publique getconnection() {
Connexion de connexion = null ;
essayer {
// Obtenir la connexion
conn = DriverManager.getConnection (url, utilisateur, mot de passe);
// Récupère l'objet d'instruction
Déclaration instruction = conn.createStatement();
} attraper (Exception e) {
e.printStackTrace();
}
connexion de retour ;
}
// Ferme la ressource
public static void close (Instruction de déclaration, connexion de connexion) {
{
essayer {
si (instruction != null)
instruction.close();
si (connexion != null) {
connexion.close();
}
} catch (SQLException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
}
}
}
}
Opération DQL
Alors, comment utiliser JDBC pour interroger des données dans la base de données ?
Copiez le code comme suit : @Test
public void testdsl() lève une exception {
//Obtenir la connexion
cnn2=sqlUtil.getconnection();
Déclaration déclaration = cnn2.createStatement();
//Préparer l'instruction SQL
String sql = "sélectionner * dans le sujet" ;
//AppelezexecuteQuery pour exécuter l'instruction de requête
ResultSet res = instruction.executeQuery(sql);
//Une fois la requête terminée, res pointera vers l'en-tête du tableau. Si vous souhaitez obtenir des données, vous devez continuer à pointer vers la ligne suivante du résultat de la requête. Lorsqu'il n'y a pas de ligne de données suivante, 0 est renvoyé.
pendant que(res.next())
{
//Récupérez la valeur du champ "sjid" dans le résultat de la requête et assurez-vous que le type est clair
int id = res.getInt("sjid");
//Récupère la valeur du champ "sjname" dans le résultat de la requête, et le type doit être clair
Nom de la chaîne = res.getString("sjname");
System.out.println("ID:" + id + "NOM:" + nom);
}
sqlUtil.close(instruction, cnn2);
}
Ce qui précède est l'utilisation d'objets Statement pour faire fonctionner la base de données ~
6. Utilisez PreparedStatement pour faire fonctionner la base de données
L'objet PreparedStatement est en fait un objet Statement spécial qui peut précompiler les instructions SQL. Lorsque vous définissez les paramètres, vous pouvez ensuite exécuter l'instruction SQL~.
Le code de copie des opérations DDL et DML est le suivant : package com.vmaxtam.sqltest ;
importer java.sql.Connection ;
importer java.sql.PreparedStatement ;
importer org.junit.Test ;
classe publique PreparedStatementTest {
Connexion connexion = null ;
@Test
public void ddldmlTest() lance une exception {
// 1. Obtenez la connexion
connexion = sqlUtil.getconnection();
// 2. Préparer les instructions SQL, les instructions précompilées et les paramètres ? Espace réservé au numéro
String sql = "INSÉRER DANS LES VALEURS DU SUJET (?,?)" ;
// 3. Récupère l'objet
PreparedStatement PreparedStatement = connexion.prepareStatement(sql);
/*
* 4. Pour définir les paramètres SQL, vous devez connaître le numéro du paramètre et connaître son type. La première phrase ci-dessous indique : le premier paramètre de l'instruction SQL est de type int, et la valeur du paramètre est définie sur 3, et ainsi. sur.
*/
préparéStatement.setInt(1, 3);
PrepareStatement.setString(2, "Anglais");
// 5. Remettez-le à la base de données pour exécuter SQL
int num = préparéStatement.executeUpdate();
System.out.println("Il y a" + num + "enregistrements concernés");
sqlUtil.close(preparedStatement, connexion);
}
}
Ce qui précède consiste à utiliser l'objet PreparedStatement pour envoyer des instructions d'insertion de la même manière, les instructions DDL et DML peuvent être envoyées de cette manière.
Avantages de la précompilation PreparedStatement :
La précompilation de PreparedStatement vous permet d'interroger différentes cibles en définissant différents paramètres côté base de données, seule une instruction précompilée sera enregistrée, mais si vous utilisez Statement pour envoyer une instruction, chaque fois qu'une instruction sera envoyée, une sera stockée dans le fichier. base de données , ce qui peut prendre beaucoup de mémoire.
Le code de copie de l'opération DQL est le suivant : @Test
public void dqlTest() lance une exception {
// 1. Obtenez la connexion
connexion = sqlUtil.getconnection();
// 2. Préparer les instructions SQL, les instructions précompilées et les paramètres ? Espace réservé au numéro
String sql = "select * from subject which sjid=? ou sjname=?";
// 3. Récupère l'objet
PreparedStatement PreparedStatement = connexion.prepareStatement(sql);
/*
* 4. Pour définir les paramètres SQL, vous devez connaître le numéro du paramètre et connaître son type. La première phrase ci-dessous indique : le premier paramètre de l'instruction SQL est de type int, et la valeur du paramètre est définie sur 3, et ainsi. sur.
*/
préparéStatement.setInt(1, 2);
PrepareStatement.setString(2, "Chinois");
// 5. Remettez-le à la base de données pour exécuter SQL
ResultSet rst = préparéStatement.executeQuery();
//6.Itérer le jeu de résultats
while(rst.next())
{
int id = rst.getInt("sjid");
Nom de la chaîne = rst.getString("sjname");
System.out.println("ID:" + id + "NOM:" + nom);
}
//7. Ferme la connexion
sqlUtil.close (preparedStatement, connexion);
}
Vous pouvez également appeler la méthode executeQuery(); et parcourir la sortie après avoir obtenu le jeu de résultats ~
Puisque Statement et PreparedStatement sont si similaires, comparons leurs avantages et leurs inconvénients ~
La différence entre Statement et PreparedStatement :
1. Une grammaire différente
L'instruction ne prend en charge que la compilation statique et les instructions SQL sont codées en dur.
PreparedStatement prend en charge la pré-compilation, utilisez-vous ? Venez vous asseoir.
2. Efficacité différente
L'instruction envoie une instruction SQL à chaque fois, ne prend pas en charge la mise en cache et a une faible efficacité d'exécution.
PreparedStatement prend en charge la pré-compilation et est mis en cache dans la base de données. Il suffit d'envoyer des paramètres et l'efficacité d'exécution est rapide.
3. Une sécurité différente
La déclaration est facilement injectée.
Injection : des éléments astucieux peuvent écrire des instructions SQL spéciales pour compromettre la base de données.
Par exemple : Pour interroger les informations d'un certain utilisateur
Situation générale : SELECT * FROM user_list où username=xxx et password=xxx (xxx doit remplir ici le nom d'utilisateur et le mot de passe de l'utilisateur)
Situation d'injection : SELECT * FROM user_list où username='abc' ou 1=1 -- password=xxx ;
De cette façon, 1=1 est égal, et le signe "--" est ajouté avant le mot de passe, et le contenu suivant devient un commentaire et ne sera pas exécuté. En d’autres termes, toutes les informations utilisateur peuvent être interrogées sans mot de passe.
PreparedStatement, car il spécifie les paramètres dans l'instruction SQL, peut empêcher l'injection.
Conclusion : Il est recommandé d'utiliser PreparedStatement car il est plus rapide et plus sûr .
7. Utilisez CallableStatement pour exécuter des procédures stockées
L'utilisation de CallableStatement exécute uniquement des procédures stockées. Pour créer des procédures stockées, nous devons toujours les créer dans la base de données.
Étape 1
La base de données a maintenant créé une procédure stockée :
Copiez le code comme suit : DELIMITER $
CRÉER UNE PROCÉDURE pro_add(IN a INT , IN b VARCHAR(20),OUT c INT)
COMMENCER
SELECT * FROM SUBJECT WHERE sjid=a OU sjname=b;
ENSEMBLE c=a+a+a+a;
FIN $
Étape 2
Utilisez du code Java pour exécuter et obtenir les paramètres de sortie Copiez le code comme suit : @Test.
public void calaST() lève une exception {
//Obtenir la connexion
connection= sqlUtil.getconnection();
//Préparer l'instruction SQL
Chaîne sql = "APPEL pro_add(?,?,?)";
//Récupère l'objet callableStatement
CallableStatement cbs = connexion.prepareCall(sql);
//Définit les paramètres d'entrée, identiques à PrepareStatement
cbs.setInt(1, 3);
cbs.setString(2, "Mathématiques");
/*Alors, comment définir les paramètres de sortie ?
* Besoin d'enregistrer les paramètres de sortie !
*/
cbs.registerOutParameter(3, java.sql.Types.INTEGER);//Vous devez utiliser des objets intégrés pour définir les types de paramètres
//Exécuter l'instruction SQL
cbs.executeQuery();
//Utilisez la méthode getXXX pour obtenir les paramètres de sortie de la position correspondante
Nombre entier = cbs.getInt(3);
System.out.println("a*4 est " + num);
//Ferme la ressource
sqlUtil.close(cbs, connexion);
}
J'espère que cet article sera utile à la programmation Java de chacun.