[JAVA] [JDBC ③] Ich habe versucht, mithilfe von Platzhaltern und Argumenten Eingaben über die Hauptmethode vorzunehmen.

In Vorheriger Artikel werden die SQL INSERT-Anweisung, die UPDATE-Anweisung, die DELETE-Anweisung und die SELECT-Anweisung nach Methoden getrennt, und die SQL-Anweisung wird von der Hauptmethode ausgeführt. Das ist mir gelungen. Dies war nicht praktikabel, da die Daten, die ich hinzufügen, ändern oder löschen wollte, in der SQL-Anweisung behoben wurden.

Daher dachte ich, wenn ich die Daten, die ich beim Aufrufen jeder Methode der SQL-Anweisung von der Hauptmethode hinzufügen möchte, übergeben könnte, wäre dies ein nützlicherer Quellcode, also habe ich es versucht.

Umgebung

Die Umgebung ist diesmal wie folgt.


Rückblick auf das letzte Mal

Schauen wir uns zunächst die Methode der INSERT-Anweisung im vorherigen Code an.

Methode der vorherigen INSERT-Anweisung


/**
 *INSERT-Anweisung
 */
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);
        }
    }
}


Was Sie brauchen, um Daten zu übergeben

--Verwenden Sie PreparedStatement anstelle vonStatement

Sie können Platzhalter verwenden, um beliebige Zeichenfolgen an SQL-Anweisungen zu übergeben. Wenn Platzhalter verwendet werden, müssen SQL-Anweisungen im Voraus definiert werden, sodass Daten jetzt wie folgt mit "PreparedStatement" anstelle von "Statement" übergeben werden können.

Code mit Anweisung


// ...

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 mit 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){

// ...

Hinweis) Zu diesem Zeitpunkt wird der ID "PRIMARY KEY AUTO INCREMENT" hinzugefügt, um den Quellcode so einfach wie möglich zu verstehen.


Erhöhen Sie die Wiederverwendbarkeit der Methode

Um die Daten von der Hauptmethode zu übergeben, kann der Datenteil der SQL-Anweisung durch die Operation von der Hauptmethode willkürlich festgelegt werden, indem der Datenteil von ps.setString (1," Satou "); als Argument übergeben wird. Ich konnte es ändern.

Der Quellcode und das Ausführungsergebnis werden unten beschrieben.

Dieses Ziel


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();
    }
    /**
     *SELECT-Anweisung
     */
    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);
            }
        }
    }

    /**
     *INSERT-Anweisung
     */
    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);
            }
        }
    }

    /**
     *UPDATE-Anweisung
     */
    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);
            }
        }
    }

    /**
     *DELETE-Anweisung
     */
    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);
            }
        }
    }

    /**
     *Tabelle erstellen
     */
    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);
            }
        }
    }

    /**
     *Tabelle löschen
     */
    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

Zusammenfassung

Ich denke, diese Änderung hat uns dem Code näher gebracht, der wiederverwendbarer ist. In Zukunft möchte ich es tatsächlich in Software verwenden und es zu einem besseren Quellcode machen.


Diese Artikeltabellenseite

[Datenbank] SQLite3 / JDBC-Zusammenfassung


Referenzseite

Recommended Posts

[JDBC ③] Ich habe versucht, mithilfe von Platzhaltern und Argumenten Eingaben über die Hauptmethode vorzunehmen.
Ich möchte die Hauptmethode mit Reflektion aufrufen
Ich habe versucht, die Methode zu erklären
[JDBC] Ich habe versucht, von Java aus auf die SQLite3-Datenbank zuzugreifen.
[Rails] Ich habe versucht, die Version von Rails von 5.0 auf 5.2 zu erhöhen
[Rails] Ich habe zum ersten Mal versucht, die button_to-Methode zu verwenden
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Ich möchte eine Methode aufrufen und die Nummer zählen
Ich habe versucht, die Umgebung nach und nach mit Docker aufzubauen
Ich habe versucht, Docker und Maven / Netbean mit Jib gut zu integrieren
Ich habe versucht zu verstehen, wie die Rails-Methode "redirect_to" definiert ist
Ich habe versucht zu verstehen, wie die Rails-Methode "link_to" definiert ist
Ich habe versucht, die Methoden von Java String und StringBuilder zusammenzufassen
[Java] Ich habe versucht, mit der Grabmethode ein Labyrinth zu erstellen ♪
Ich habe versucht, das Paiza-Kampagnenproblem "Herausforderung von Phantomdieb 813" zu lösen.
Ich habe versucht, den Kalender mit Java auf der Eclipse-Konsole anzuzeigen.
Ich habe versucht, die verwendeten Methoden zusammenzufassen
Ich habe die Punkte zusammengefasst, die bei der kombinierten Verwendung von Ressourcen und Ressourcen zu beachten sind
Ich habe WSL2 + Ubuntu in Window10 eingeführt und versucht, GDC, DMD, LDC zu verwenden
Ich habe versucht, UICollectionViewListCell zu verwenden, das von Xcode12 hinzugefügt wurde.
[Ruby] Von den Grundlagen bis zur Injektionsmethode
Ich habe versucht, die wichtigsten Punkte des gRPC-Designs und der Entwicklung zusammenzufassen
Ich habe versucht, mit OpenTrip Planner und GTFS eine eigene Übertragungsanleitung zu erstellen
Ich wollte der Methode @VisibleForTesting hinzufügen
Ich war süchtig nach der Rollmethode
Ich habe versucht, das Iterator-Muster zu implementieren
Ich möchte das Argument der Annotation und das Argument der aufrufenden Methode an den Aspekt übergeben
[JDBC] Ich habe versucht, den SQLite3-Datenbankzugriff von Java in eine Methode für jede SQL-Anweisung umzuwandeln.
Iterative Verarbeitung von Ruby mit jeder Methode (finde die Summe von 1 bis 10)
Ich habe versucht, die Stream-API zusammenzufassen
Ich habe versucht, die Grammatik von R und Java zu übersetzen [Von Zeit zu Zeit aktualisiert]
Rails-API-Modus Ich habe versucht, die Mehrfachsuchfunktion für Schlüsselwörter mithilfe von Arrays und iterativer Verarbeitung zu implementieren.
Ich habe versucht, die Geschwindigkeit von Graal VM mit JMH zu messen und zu vergleichen
[Rubiy] Ich möchte mit der Split-Methode ein Array aus einer Zeichenfolge erstellen. Und umgekehrt.
[Java] Ich habe JDBC installiert und versucht, eine Verbindung mit Servlet + MySQL herzustellen. (Es gibt eine Version mit DAO / Bean)
Ich habe versucht, die Sitzung in Rails zu organisieren
Ich habe versucht, grafana und postgres [docker-compose] zu verknüpfen
[Android] Ich habe SQLite beendet und versucht, Realm zu verwenden
Ich habe versucht, eine Java-Methode von ABCL zu verwenden
[API] Ich habe versucht, die Postleitzahlensuch-API zu verwenden
Ich habe versucht, JavaFX und Spring Framework zu verknüpfen.
Ich habe versucht, Tomcat so einzustellen, dass das Servlet ausgeführt wird.
Ich habe versucht, einen Server mit Netty zu implementieren
Ich habe versucht, den Profiler von IntelliJ IDEA zu verwenden
Ich habe versucht, YouTube-Video von DB mit haml aufzurufen und es eingebettet anzuzeigen
Ich habe versucht, mit Wercker ein Docker-Image zu erstellen und zu veröffentlichen, mit dem GlassFish 5 gestartet wird
Übergeben Sie ein Argument an die Methode und erhalten Sie das Ergebnis der Operation als Rückgabewert
Ich habe versucht, den Mechanismus von Emscripten mit einem deutschen Löser zu untersuchen
Ich habe versucht, die Server-Push-Funktion von Servlet 4.0 zu verwenden
Tokoro habe ich in der Migration von Wicket 7 auf 8 umgeschrieben
Ich habe versucht, CSV mit Outsystems zu lesen und auszugeben
Ich habe versucht, SQS mit AWS Java SDK zu betreiben
05. Ich habe versucht, die Quelle von Spring Boot zu löschen