当前位置:网站首页>[JDBC from starting to Real combat] JDBC Basic clearance tutoriel (Summary of the first part)

[JDBC from starting to Real combat] JDBC Basic clearance tutoriel (Summary of the first part)

2022-06-21 06:28:00 Xiao Huang, Xiao Huang n'est plus confus.

Page d'accueil personnelle:Page d'accueil du blog de Huang xiaohuang
Soutenez - moi: - Oui. Collection Attention
Devise:Un pas à la fois pour prendre ce qu'on appelle la chance

Cet article vient de la colonne:JDBCDe l'entrée au combat
Bienvenue à la rubrique support Subscription ️
Insérer la description de l'image ici


1 JDBCGénéralités

Introduction:

  • JDBCPour Accès à différentes bases de données Fournit une interface unifiée, Beaucoup de détails sont masqués pour l'utilisateur ;
  • Java Les programmeurs utilisent JDBC,C'est bon. Connectez tout ce qui est fourniJDBCSystème de base de données du pilote, Cela permet d'effectuer diverses opérations sur la base de données .

JDBCSchéma schématique:
Insérer la description de l'image iciDescription: JDBC En fin de compte, il s'agit de permettre aux développeurs de passer à travers Java Le programme accède à divers systèmes de base de données pris en charge .Et pourtant, Les fournisseurs peuvent varier d'une base de données à l'autre , Comme Oracle. 、Microsoft Corporation… … Comme nous ne connaissons pas la structure sous - jacente des systèmes de base de données des fournisseurs , Et si vous utilisez une base de données différente , Les méthodes utilisées ne sont pas uniformes , Ce n'est pas bon pour la gestion du programme .Réfléchis.,Si vous êtes Java Développeurs de fabricants , J'ai fini d'écrire le support MysqlCode,Mais Mysql Version itération mise à jour … … Vous devez réécrire le Code , Pour prendre en charge la version haute de la base de données !
  Pour résoudre les problèmes susmentionnés,C'est bon. Par Java Procédure la société établit une série de spécifications , Fournir des interfaces pour la mise en œuvre par les fournisseurs de bases de données . Les fournisseurs de bases de données pris en charge peuvent implémenter les interfaces correspondantes ,De faireJava Le programme est accessible 、Fonctionnement de la base de données.


2 JDBCDémarrage rapide

2.1 JDBCÉtapes de programmation

  1. Enregistrer le pilote - Chargement Driver Catégorie;
  2. Obtenir la connexion - Je l'ai. Connection;
  3. Effectuer des opérations d'ajout, de suppression, de modification et de recherche - Envoyer SQL Voilà. mysql Mise en œuvre;
  4. Libérer des ressources - Fermer les connexions associées

2.2 JDBCLe premier programme de

On passe par là.JDBC- Oui. student Ajouter,Supprimer et modifier les actions, Voici les codes associés à la création d'une structure de tableau :

CREATE DATABASE mysqlforjdbctest;
USE mysqlforjdbctest;
CREATE TABLE student
(                                             -- Formulaire étudiant
    id       INT PRIMARY KEY AUTO_INCREMENT,  -- Numéro d'étudiant
    name     VARCHAR(20) NOT NULL DEFAULT '', -- Nom
    sex      CHAR(1)     NOT NULL DEFAULT '', -- Sexe
    birthday DATETIME,                        -- Anniversaire
    phone    VARCHAR(12)                      -- Numéro de téléphone portable
);

Et puis,On ouvre d'abord. idea Préparation opérationnelle ,Oui. mysql Le pilote de connexion correspondant est importé dans le Répertoire du projet , Pour plus de détails, voir la première section de cet article du blogueur :
Comment passerJDBCAccès àMysqlBase de données?

JDBCtest01Code:

Pour le Code url Quelques remarques:

  1. jdbc:mysql Représente l'accord,AdoptionjdbcPour se connectermysql;
  2. localhost Hôte,C'est possible.ipAdresse;
  3. 3306 Représentation mysql Port sur écoute;
  4. mysqlforjdbctest Connectez - vous à mysql Quelle base de données .

Pour le reste, voir les notes de code :

package com.hxh.jdbc;

import com.mysql.jdbc.Driver;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/** * @author  Xiao Huang Xiao Huang n'est plus confus  * @version 1.0 */
public class JDBC01 {
    
    public static void main(String[] args) throws SQLException {
    
        // 1. Enregistrer le pilote
        Driver driver = new Driver();  // CréationdriverObjet

        // 2. Connectez - vous.
        // jdbc:mysql Représente l'accord,AdoptionjdbcPour se connectermysql
        // localhost Hôte,C'est possible.ipAdresse
        // 3306 Représentation mysql Port sur écoute
        // mysqlforjdbctest Connectez - vous à mysql  Quelle base de données 
        String url = "jdbc:mysql://localhost:3306/mysqlforjdbctest";
        // Oui.  Nom d'utilisateur et mot de passe dans  Properties Dans l'objet
        Properties properties = new Properties();
        properties.setProperty("user", "root");  // Utilisateurs
        properties.setProperty("password", "111");  // Mot de passe( Saisissez le mot de passe correspondant à votre nom d'utilisateur )
        // Selon le url Connexion à la base de données
        Connection connect = driver.connect(url, properties);

        // 3. Mise en œuvre sql
        String sql = "INSERT INTO student VALUES(null, ' Tes haricots ', 'Femme', '2005-05-17', '13521987643')";
        // statement Pour l'exécution statiqueSQL Instruction et renvoie l'objet dont le résultat a été généré 
        Statement statement = connect.createStatement();
        int rows = statement.executeUpdate(sql);  // Si oui DML Déclarations, Renvoie le nombre de lignes affectées 
        System.out.println(rows > 0 ? "Opération réussie!" : "L'opération a échoué!");

        // 4. Fermer la connexion
        statement.close();
        connect.close();
    }
}

Résultats de l'opération et changements dans le tableau :
Insérer la description de l'image ici
Insérer la description de l'image ici

2.3 Obtenir la connexion à la base de données5Comment?

Comment 1️⃣ Accès Driver Implémenter des objets de classe

Driver driver = new com.mysql.jdbc.Driver();
String url = "jdbc:mysql://localhost:3306/mysqlforjdbctest";
Properties properties = new Properties();
properties.setProperty("user", "root");  // Utilisateurs
properties.setProperty("password", "111");  // Mot de passe
Connection connection = driver.connect(url, properties);

  Utilisé dans le Code com.mysql.jdbc.Driver(), Appartient à une charge statique,Faible flexibilité,Forte dépendance, Donc le mode 2 .

Comment 2️⃣ Utilisez le mécanisme de réflexion pour obtenir

Class clazz = Class.forName("com.mysql.jdbc.Driver");
Driver driver = (Driver)clazz.newInstance(); 
String url = "jdbc:mysql://localhost:3306/mysqlforjdbctest";
Properties properties = new Properties();
properties.setProperty("user", "root");  // Utilisateurs
properties.setProperty("password", "111");  // Mot de passe
Connection connection = driver.connect(url, properties);

Comment 3️⃣ Utiliser DriverManager Remplacer Driver Gestion unifiée, En termes relatifs,Plus extensible

Class clazz = Class.forName("com.mysql.jdbc.Driver");
Driver driver = (Driver)clazz.newInstance();
String url = "jdbc:mysql://localhost:3306/mysqlforjdbctest";
String user = "root";
String password = "111";
DriverManager.registerDriver(driver);  // InscriptionDriverDrive
Connection connection = DriverManager.getConnection(url, user, password);

Comment 4️⃣ Utiliser Class.forName Compléter automatiquement le pilote d'inscription,Code plus concis

Class clazz = Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/mysqlforjdbctest";
String user = "root";
String password = "111";
Connection connection = DriverManager.getConnection(url, user, password);

  La figure ci - dessous montre Driver Code source de la classe,Comme vous pouvez le voir,, Exception dans le bloc de code statique , Une fois que la classe est chargée .Et DriverManager.register(new Driver()) En fait, c'est en train d'enregistrer le pilote , Grâce à la simplicité du Code , Le mode 4 est également le mode le plus utilisé dans le développement réel .
Insérer la description de l'image ici

Comment 5️⃣ Utiliser le profil, En fait, pour l'optimisation du mode 4 , Rendre la connexion à la base de données plus flexible ~

  1. Tout d'abord,,In src Nouveau fichier dans le répertoiremysql.properties;

  2. mysql.properties Enregistrer le nom d'utilisateur dans le fichier de configuration 、Mot de passe、urlAvecdriverInformation,Et sauvegardez.Comme le montre la figure ci - dessous::
    Insérer la description de l'image ici

  3. Dans la classe correspondante ,Écrivez le code approprié

// Adoption Properties Objet obtenir des informations sur le profil
Properties properties = new Properties();
properties.load(new FileInputStream("src\\mysql.properties"));
// Obtenir les valeurs associées
String user = properties.getProperty("user");
String password = properties.getProperty("password");
String url = properties.getProperty("url");
String driver = properties.getProperty("driver");
Class.forName(driver);
Connection connection = DriverManager.getConnection(url, user, password);

3 ResultSetEnsemble de résultats

3.1 ResultSetDescription de l'ensemble de résultats

Introduction:

  • Représentation Table de données pour l'ensemble de résultats de la base de données , Généralement généré par l'exécution d'une instruction pour interroger une base de données;
  • ResultSet Objet Gardez un curseur pointant vers sa ligne de données actuelle .Au départ,Le curseur précède la première ligne;
  • next Méthode pour déplacer le curseur vers la ligne suivante,Et parce que ResultSet Dans l'objet Renvoie quand il n'y a plus de lignes false, Union while La boucle peut traverser l'ensemble de résultats .

3.2 ResultSetCas de jeu de résultats

Tout d'abord,,Exécutez d'abord le code suivant,Pour student Tableau ajouter des données,Facile à tester.

INSERT INTO student VALUES (NULL, 'Lufy', 'Hommes', '2001-06-18', '13624567845');
INSERT INTO student VALUES (NULL, 'Joba.', 'Hommes', '2006-05-21', '13824063845');

Voici un exemple de code::
Dans le Code,statementMéthodeexecuteQuery(sql)Retour à un seulResultSetObjet de. Voir la note de code pour plus de détails :

package com.hxh.jdbc;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.*;
import java.util.Date;
import java.util.Properties;

/** * @author  Xiao Huang Xiao Huang n'est plus confus  * @version 1.0 */
public class ResultSetTest {
    
    public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
    
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql.properties"));
        // Obtenir les valeurs associées
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String url = properties.getProperty("url");
        String driver = properties.getProperty("driver");

        // 1. Enregistrer le pilote
        Class.forName(driver);

        // 2. Connectez - vous.
        Connection connection = DriverManager.getConnection(url, user, password);

        // 3. Je l'ai.Statement
        Statement statement = connection.createStatement();

        // 4. OrganisationSql
        String sql = "SELECT id, name, sex, birthday FROM student";
        // Exécuter unSQLDéclarations,L'instruction renvoie un seul ResultSet Objet
        ResultSet resultSet = statement.executeQuery(sql);

        // 5. UtiliserwhileExtraire les données
        while (resultSet.next()){
      //  Déplacez le curseur vers l'arrière , S'il n'y a plus de lignes ,Alors quittez le cycle
            int id = resultSet.getInt(1);  //  Obtenez la première colonne de la ligne 
            String name = resultSet.getString(2);  //  Obtenez la deuxième colonne de la ligne 
            String sex = resultSet.getString(3);  //  Obtenez la troisième colonne de la ligne 
            Date date = resultSet.getDate(4);  //  Obtenez la quatrième colonne de cette ligne 
            System.out.println(id + "\t" + name + "\t" + sex + "\t" + date);
        }

        // 6. Fermer la connexion
        resultSet.close();
        statement.close();
        connection.close();
    }
}

Résultats obtenus:
Insérer la description de l'image ici


4 Statement

4.1 Statement Description et SQLInjection

Introduction:

  • StatementObjet utilisé pour l'exécution statiqueSQL Instruction et renvoie l'objet dont le résultat a été généré ;
  • Une fois la connexion établie,Besoin d'accéder à la base de données. Qu'il s'agisse d'exécuter des ordres ou SQLDéclarations,Tout peut passer parStatement(ExistesqlInjection)、PreparedStatement(Prétraitement)、CallableStatement(Procédures stockées) Pour le faire.;
  • AdoptionStatementExécution de l'objetSQLDéclarations,ExisteSQLRisque d’injection! Attention!SQLInjection,En utilisantStatementUne extensionPreparedStatementRemplacerStatementC'est tout..

Pourquoi?SQLInjection?
Réponse:SQLL'injection est l'utilisation de certains systèmes qui ne vérifient pas suffisamment les données saisies par l'utilisateur,Et injecter illégalement dans les données d'entrée de l'utilisateurSQLSegment d'instruction ou commande,Attaques malveillantes contre la base de données!
Insérer la description de l'image ici

4.2 UtiliserStatementConnexion analogique,PrésentationSQLRisque d’injection

Tout d'abord,,Par l'énoncé suivant,Créer une nouvelle table dans la base de données,admin, Stocker le nom d'utilisateur et le mot de passe :

CREATE TABLE admin
(                                             -- Tableau des administrateurs
    name     VARCHAR(20) NOT NULL DEFAULT '', -- Nom d'utilisateur
    pwd      VARCHAR(20) NOT NULL DEFAULT ''  -- Mot de passe
);

INSERT INTO admin VALUES ('nezuko', '123456');
INSERT INTO admin VALUES ('lingling', '111111');

Insérer la description de l'image ici

Voici un exemple de code::

package com.hxh.jdbc;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.*;
import java.util.Date;
import java.util.Properties;
import java.util.Scanner;

/** * @author  Xiao Huang Xiao Huang n'est plus confus  * @version 1.0 */
public class LoginTest {
    
    public static void main(String[] args) throws IOException, SQLException, ClassNotFoundException {
    
        Scanner scanner = new Scanner(System.in);

        // L'utilisateur entre le nom d'utilisateur et le mot de passe
        System.out.print("Nom d'utilisateur:");
        String admin_name = scanner.nextLine();
        System.out.print("Mot de passe:");
        String admin_pwd = scanner.nextLine();

        // AdoptionProperties Objet obtenir des informations de profil 
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql.properties"));
        // Obtenir les valeurs associées
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String url = properties.getProperty("url");
        String driver = properties.getProperty("driver");

        // 1. Enregistrer le pilote
        Class.forName(driver);

        // 2. Connectez - vous.
        Connection connection = DriverManager.getConnection(url, user, password);

        // 3. Je l'ai.Statement
        Statement statement = connection.createStatement();

        // 4. OrganisationSql
        String sql = "SELECT name, pwd FROM admin WHERE name ='"
                + admin_name + "' AND pwd = '" + admin_pwd + "'";
        // Exécuter unSQLDéclarations,L'instruction renvoie un seul ResultSet Objet
        ResultSet resultSet = statement.executeQuery(sql);
        if(resultSet.next()){
    // Si un enregistrement est interrogé, Cela signifie que l'utilisateur existe 
            System.out.println("Connexion réussie!");
        }else {
    
            System.out.println("Échec de la connexion!");
        }

        // 5. Fermer la connexion
        resultSet.close();
        statement.close();
        connection.close();
    }
}

Séance de démonstration:

  1. Essayez. Saisissez le nom d'utilisateur et le mot de passe corrects
    Insérer la description de l'image ici
  2. Essayez. Saisissez le mauvais nom d'utilisateur et mot de passe
    Insérer la description de l'image ici
  3. L'utilisateur est malveillant SQLInjection:
    Insérer la description de l'image ici

Parce que Statement L'entrée de l'utilisateur n'est pas pré - traitée , Et la logique qui détermine si vous êtes connecté est une mosaïque de noms d'utilisateur et de mots de passe entrés par l'utilisateur , Cela a conduit l'utilisateur à injecter malicieusement un nom d'utilisateur et un mot de passe universels , Réussite de l'inspection ~~


4.3 PreparedStatement Requête de prétraitement

Introduction:

  • PreparedStatement Diagramme de classe:
    Insérer la description de l'image ici
  • PreparedStatement Exécuté SQL Les paramètres de l'instruction sont utilisés avec (?)Pour représenter,AppelezPreparedStatementObjetsetXxx()Paramètres de réglage de la méthode.Le premier paramètre est à définir SQL Index des paramètres dans l'instruction (De1C'est parti.),La deuxième est mise en placeSQLValeur du paramètre dans l'instruction;
  • executeQuery(),Retour ResultSetObjet de l'ensemble de résultats;
  • executeUpdate(),Effectuer des mises à jour, Par exemple, ajouter, supprimer et modifier .

PreparedStatement Avantages:

  1. N'est plus nécessaire + Pour assembler sql Déclarations, Les erreurs de syntaxe peuvent être réduites dans une certaine mesure ;
  2. Ça marche.sqlProblèmes d’injection;
  3. Réduit considérablement les temps de compilation,Plus efficace.

4.4 Résolution par prétraitement SQLInjection

Ou un exemple de connexion précédente ,Il suffit d'utiliserPreparedStatement,Les codes spécifiques sont les suivants:, Étapes voir les commentaires :

package com.hxh.jdbc;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.*;
import java.util.Date;
import java.util.Properties;
import java.util.Scanner;

/** * @author  Xiao Huang Xiao Huang n'est plus confus  * @version 1.0 */
public class LoginTest {
    
    public static void main(String[] args) throws IOException, SQLException, ClassNotFoundException {
    
        Scanner scanner = new Scanner(System.in);

        // L'utilisateur entre le nom d'utilisateur et le mot de passe
        System.out.print("Nom d'utilisateur:");
        String admin_name = scanner.nextLine();
        System.out.print("Mot de passe:");
        String admin_pwd = scanner.nextLine();

        // AdoptionProperties Objet obtenir des informations de profil 
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql.properties"));
        // Obtenir les valeurs associées
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String url = properties.getProperty("url");
        String driver = properties.getProperty("driver");

        // 1. Enregistrer le pilote
        Class.forName(driver);

        // 2. Connectez - vous.
        Connection connection = DriverManager.getConnection(url, user, password);

        // 3. Je l'ai. PreparedStatement
        // 3.1 OrganisationSql, ? équivalent à un substituant
        String sql = "SELECT name, pwd FROM admin WHERE name = ? AND pwd = ?";
        // 3.2 preparedStatement Objet implémenté PreparedStatementInterface
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        // 3.3 Voilà. ? Affectation
        preparedStatement.setString(1, admin_name);
        preparedStatement.setString(2, admin_pwd);

        // 4. Mise en œuvre select Utiliser executeQuery, Si l'exécution est dmlDéclarations, Utiliser executeUpdate
        ResultSet resultSet = preparedStatement.executeQuery();
        if(resultSet.next()){
    // Si un enregistrement est interrogé, Cela signifie que l'utilisateur existe 
            System.out.println("Connexion réussie!");
        }else {
    
            System.out.println("Échec de la connexion!");
        }

        // 5. Fermer la connexion
        resultSet.close();
        preparedStatement.close();
        connection.close();
    }
}

Résultats obtenus:
Insérer la description de l'image ici
C'est réglé.sqlProblèmes d’injection!


À la fin

C'est tout ce qui précède , Le suivi se poursuivra Mise à jour gratuite,Si l'article vous aide,Bouge tes mains.Fais - moi plaisir. + Attention,Merci beaucoup! ️ ️ ️ !
En cas de problème, Message privé ou zone de commentaires sont les bienvenus !
Insérer la description de l'image ici

Co - encouragement:“ Vos efforts intermittents et votre confusion , C'est une remise à zéro des efforts précédents .”
Insérer la description de l'image ici

原网站

版权声明
本文为[Xiao Huang, Xiao Huang n'est plus confus.]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/172/202206210615019705.html