[JAVA] [JDBC ③] J'ai essayé d'entrer à partir de la méthode principale en utilisant des espaces réservés et des arguments.

Dans Article précédent, l'instruction SQL INSERT, l'instruction UPDATE, l'instruction DELETE et l'instruction SELECT sont séparées par méthode et l'instruction SQL est exécutée par la méthode main. J'ai réussi à le faire. Ce n'était pas pratique car les données que je voulais ajouter, modifier ou supprimer étaient fixées dans l'instruction SQL.

Par conséquent, j'ai pensé que si je pouvais transmettre les données que je voulais ajouter lors de l'appel de chaque méthode de l'instruction SQL à partir de la méthode principale, ce serait un code source plus utile, alors je l'ai essayé.

environnement

L'environnement cette fois est le suivant.


Regardant en arrière sur la dernière fois

Tout d'abord, examinons la méthode de l'instruction INSERT dans le code précédent.

Méthode de l'instruction INSERT précédente


/**
 *Instruction INSERT
 */
public static void insertData() {
    try {
        // create a database connection
        connection = DriverManager.getConnection(URL);
        Statement statement = connection.createStatement();
        statement.setQueryTimeout(30);  // set timeout to 30 sec.

        statement.executeUpdate("INSERT INTO person VALUES(1, 'Satou')");
        statement.executeUpdate("INSERT INTO person VALUES(2, 'Tanaka')");
        statement.executeUpdate("INSERT INTO person VALUES(3, 'Suzuki')");
    } catch(SQLException e) {
        // if the error message is "out of memory", 
        // it probably means no database file is found
        System.err.println(e.getMessage());
    } finally {
        try {
            if(connection != null)
            connection.close();
        } catch(SQLException e) {
            // connection close failed.
            System.err.println(e);
        }
    }
}

Comme vous pouvez le voir, les données que vous souhaitez ajouter sont fixées dans l'instruction SQL, vous ne pouvez donc pas ajouter de données arbitraires simplement en l'appelant à partir de la méthode principale.


Ce dont vous avez besoin pour transmettre des données

Afin de transmettre les données que vous souhaitez ajouter lors de l'appel à partir de la méthode principale, il est nécessaire de satisfaire les deux éléments suivants.

--Utiliser des espaces réservés --Utilisez PreparedStatement au lieu deStatement

Les espaces réservés vous permettent de transmettre des chaînes arbitraires aux instructions SQL. De plus, lorsque vous utilisez des espaces réservés, il est nécessaire de définir des instructions SQL à l'avance, il est donc maintenant possible de transmettre des données en utilisant PreparedStatement au lieu deStatement comme suit.

Code utilisant Statement


// ...

Statement statement = connection.createStatement();
statement.setQueryTimeout(30);  // set timeout to 30 sec.

statement.executeUpdate("INSERT INTO person VALUES(1, 'Satou')");
statement.executeUpdate("INSERT INTO person VALUES(2, 'Tanaka')");
statement.executeUpdate("INSERT INTO person VALUES(3, 'Suzuki')");

// ...

Code utilisant PreparedStatement


// ...

String sql = "INSERT INTO person (name) VALUES(?)";
try {
PreparedStatement ps = null;
ps = connection.prepareStatement(sql);
ps.setString(1, "Satou");
ps.executeUpdate();
connection.commit();
ps.close();
} catch (SQLException e){

// ...

Note) À ce stade, «INCREMENT AUTOMATIQUE DE CLÉ PRIMAIRE» est ajouté à l'identifiant pour rendre le code source aussi facile à comprendre que possible.


Augmenter la réutilisabilité de la méthode

Ensuite, afin de transmettre les données de la méthode main, en passant la partie data de ps.setString (1," Satou "); comme argument, la partie data de l'instruction SQL peut être arbitrairement définie par l'opération de la méthode main. J'ai pu le changer.

Le code source et le résultat de l'exécution sont décrits ci-dessous.

Ce but


import java.sql.*;

/**
 * TestDataBaseAccess
 */
public class TestDataBaseAccess {
    static Connection connection;
    static PreparedStatement ps;
    static String URL = "jdbc:sqlite:sample.db";

    public static void main(String[] args) throws ClassNotFoundException {
       // load the sqlite-JDBC driver using the current class loader
        Class.forName("org.sqlite.JDBC");
        connection = null;
        ps = null;

        dropTable();
        createTable();
        insertData("Satou");
        insertData("Tanaka");
        insertData("Suzuki");
        loadData();

        System.out.println("---------");

        updateData(1, "Takahashi");
        loadData();

        System.out.println("---------");

        deleteData(3);
        loadData();
    }
    /**
     *Instruction SELECT
     */
    public static void loadData() {
        try {
            // create a database connection
            connection = DriverManager.getConnection(URL);
            Statement statement = connection.createStatement();
            statement.setQueryTimeout(30);  // set timeout to 30 sec.

            ResultSet rs = statement.executeQuery("SELECT * FROM person");
            while(rs.next()){
                // read the result set
                System.out.println("id = " + rs.getInt("id") + " | name = " + rs.getString("name"));
            }
        } catch(SQLException e) {
            // if the error message is "out of memory", 
            // it probably means no database file is found
            System.err.println(e.getMessage());
        } finally {
            try {
                if(connection != null)
                connection.close();
            } catch(SQLException e) {
                // connection close failed.
                System.err.println(e);
            }
        }
    }

    /**
     *Instruction INSERT
     */
    public static void insertData(String name) {
        String sql = "INSERT INTO person (name) VALUES(?)";
        
        try {
            connection = DriverManager.getConnection(URL);
            connection.setAutoCommit(false);

            ps = connection.prepareStatement(sql);
            ps.setString(1, name);
            ps.executeUpdate();
            connection.commit();
            ps.close();
        } catch(SQLException e) {
            // if the error message is "out of memory", 
            // it probably means no database file is found
            System.err.println(e.getMessage());
        } finally {
            try {
                if(connection != null)
                connection.close();
            } catch(SQLException e) {
                // connection close failed.
                System.err.println(e);
            }
        }
    }

    /**
     *Instruction UPDATE
     */
    public static void updateData(int id, String name) {
        try {
            String sql = "UPDATE person SET name = ? WHERE id = ?";
            // create a database connection
            connection = DriverManager.getConnection(URL);
            connection.setAutoCommit(false);
            
            ps = connection.prepareStatement(sql);
            ps.setString(1, name);
            ps.setInt(2, id);
            ps.executeUpdate();
            connection.commit();
            ps.close();
        } catch(SQLException e) {
            // if the error message is "out of memory", 
            // it probably means no database file is found
            System.err.println(e.getMessage());
        } finally {
            try {
                if(connection != null)
                connection.close();
            } catch(SQLException e) {
                // connection close failed.
                System.err.println(e);
            }
        }
    }

    /**
     *Instruction DELETE
     */
    public static void deleteData(int id) {
        try {
            String sql = "DELETE FROM person WHERE id = ?";
            // create a database connection
            connection = DriverManager.getConnection(URL);
            connection.setAutoCommit(false);

            ps = connection.prepareStatement(sql);
            ps.setInt(1, id);
            ps.executeUpdate();
            connection.commit();
            ps.close();
        } catch(SQLException e) {
            // if the error message is "out of memory", 
            // it probably means no database file is found
            System.err.println(e.getMessage());
        } finally {
            try {
                if(connection != null)
                connection.close();
            } catch(SQLException e) {
                // connection close failed.
                System.err.println(e);
            }
        }
    }

    /**
     *Créer une table
     */
    public static void createTable() {
        try {
            // create a database connection
            connection = DriverManager.getConnection(URL);
            Statement statement = connection.createStatement();
            statement.setQueryTimeout(30);  // set timeout to 30 sec.

            statement.executeUpdate("CREATE TABLE person (id INTEGER PRIMARY KEY AUTOINCREMENT, name STRING)");
        } catch(SQLException e) {
            // if the error message is "out of memory", 
            // it probably means no database file is found
            System.err.println(e.getMessage());
        } finally {
            try {
                if(connection != null)
                connection.close();
            } catch(SQLException e) {
                // connection close failed.
                System.err.println(e);
            }
        }
    }

    /**
     *Supprimer la table
     */
    public static void dropTable() {
        try {
            // create a database connection
            connection = DriverManager.getConnection(URL);
            Statement statement = connection.createStatement();
            statement.setQueryTimeout(30);  // set timeout to 30 sec.

            statement.executeUpdate("DROP TABLE IF EXISTS person");
        } catch(SQLException e) {
            // if the error message is "out of memory", 
            // it probably means no database file is found
            System.err.println(e.getMessage());
        } finally {
            try {
                if(connection != null)
                connection.close();
            } catch(SQLException e) {
                // connection close failed.
                System.err.println(e);
            }
        }
    }
}
javac TestDataBaseAccess.java && java -cp .:sqlite-jdbc-3.30.1.jar TestDataBaseAccess 
id = 1 | name = Satou
id = 2 | name = Tanaka
id = 3 | name = Suzuki
---------
id = 1 | name = Takahashi
id = 2 | name = Tanaka
id = 3 | name = Suzuki
---------
id = 1 | name = Takahashi
id = 2 | name = Tanaka

Résumé

Je pense que ce changement nous a rapprochés d'un code plus réutilisable. À l'avenir, j'aimerais l'utiliser dans un logiciel et en faire un meilleur code source.


Cette page de tableau d'article

[Database] SQLite3 / JDBC Summary


Site de référence

Recommended Posts

[JDBC ③] J'ai essayé d'entrer à partir de la méthode principale en utilisant des espaces réservés et des arguments.
Je veux appeler la méthode principale en utilisant la réflexion
J'ai essayé d'expliquer la méthode
[JDBC] J'ai essayé d'accéder à la base de données SQLite3 depuis Java.
[Rails] J'ai essayé de faire passer la version de Rails de 5.0 à 5.2
[Rails] J'ai essayé d'utiliser la méthode button_to pour la première fois
J'ai essayé de résumer les bases de kotlin et java
Je veux appeler une méthode et compter le nombre
J'ai essayé de construire l'environnement petit à petit en utilisant docker
J'ai essayé d'intégrer parfaitement Docker et Maven / Netbean en utilisant Jib
J'ai essayé de comprendre comment la méthode des rails "redirect_to" est définie
J'ai essayé de comprendre comment la méthode des rails "link_to" est définie
J'ai essayé de résumer les méthodes de Java String et StringBuilder
[Java] J'ai essayé de faire un labyrinthe par la méthode de creusage ♪
J'ai essayé de résoudre le problème de la campagne paiza "Challenge from Phantom Thief 813"
J'ai essayé d'afficher le calendrier sur la console Eclipse en utilisant Java.
J'ai essayé de résumer les méthodes utilisées
J'ai résumé les points à noter lors de l'utilisation combinée des ressources et des ressources
J'ai présenté WSL2 + Ubuntu à Window10 et essayé d'utiliser GDC, DMD, LDC
J'ai essayé d'utiliser UICollectionViewListCell ajouté à partir de Xcode12.
[Ruby] Des bases à la méthode inject
J'ai essayé de résumer les points clés de la conception et du développement de gRPC
J'ai essayé de créer mon propre guide de transfert en utilisant OpenTrip Planner et GTFS
Je voulais ajouter @VisibleForTesting à la méthode
J'étais accro à la méthode du rouleau
J'ai essayé d'implémenter le modèle Iterator
Je veux passer l'argument d'Annotation et l'argument de la méthode d'appel à aspect
[JDBC] J'ai essayé de faire de l'accès à la base de données SQLite3 depuis Java une méthode pour chaque instruction SQL.
Traitement itératif de Ruby en utilisant chaque méthode (trouver la somme de 1 à 10)
J'ai essayé de résumer l'API Stream
J'ai essayé de traduire la grammaire de R et Java [Mis à jour de temps en temps]
Mode API Rails J'ai essayé d'implémenter la fonction de recherche multiple par mot-clé à l'aide de tableaux et d'un traitement itératif.
J'ai essayé de mesurer et de comparer la vitesse de Graal VM avec JMH
[Rubiy] Je veux créer un tableau à partir d'une chaîne de caractères avec la méthode split. Et vice versa.
[Java] J'ai installé JDBC et essayé de me connecter avec servlet + MySQL. (Il existe une version utilisant DAO / Bean)
J'ai essayé d'organiser la session en Rails
J'ai essayé de lier grafana et postgres [docker-compose]
[Android] J'ai quitté SQLite et essayé d'utiliser Realm
J'ai essayé de frapper une méthode Java d'ABCL
[API] J'ai essayé d'utiliser l'API de recherche par code postal
J'ai essayé de lier JavaFX et Spring Framework.
J'ai essayé de configurer tomcat pour exécuter le servlet.
J'ai essayé d'implémenter un serveur en utilisant Netty
J'ai essayé d'utiliser le profileur d'IntelliJ IDEA
J'ai essayé d'appeler une vidéo YouTube de DB avec haml et de l'afficher intégrée
J'ai essayé d'utiliser Wercker pour créer et publier une image Docker qui lance GlassFish 5
Passez un argument à la méthode et recevez le résultat de l'opération comme valeur de retour
J'ai essayé d'étudier le mécanisme d'Emscripten en l'utilisant avec un solveur allemand
J'ai essayé d'utiliser la fonction Server Push de Servlet 4.0
Tokoro j'ai réécrit dans la migration de Wicket 7 à 8
J'ai essayé de lire et de sortir CSV avec Outsystems
J'ai essayé de faire fonctionner SQS en utilisant AWS Java SDK
05. J'ai essayé de supprimer la source de Spring Boot