24
jdbc #jdbc

jdbc - riptutorial.com · Kapitel 1: Erste Schritte mit jdbc Bemerkungen JDBC oder Java DataBase Connectivity ist die Java-Spezifikation für die Verbindung zu (relationalen) Datenbanken

  • Upload
    others

  • View
    22

  • Download
    0

Embed Size (px)

Citation preview

jdbc

#jdbc

Inhaltsverzeichnis

Über 1

Kapitel 1: Erste Schritte mit jdbc 2

Bemerkungen 2

Versionen 2

Examples 2

Verbindung herstellen 2

Kapitel 2: Anweisungsausgabe 4

Einführung 4

Bemerkungen 4

Examples 4

Stapeleinfügung mit PreparedStatement 4

Stapelverarbeitung mit Statement 5

Kapitel 3: Datenbankverbindung erstellen 6

Syntax 6

Examples 6

Einführung (SQL) 6

Verwendung der Verbindung (und Anweisungen) 7

Erstellen einer Verbindung mit java.sql.DriverManager 8

Verbindung zu MySQL herstellen 9

Verbindung zu einer Microsoft Access-Datenbank mit UCanAccess 10

Oracle JDBC-Verbindung 11

Treiber: 11

Initialisierung der Treiberklasse: 11

Verbindungs-URL 11

Beispiel 12

Kapitel 4: Ergebnissatz 13

Einführung 13

Examples 13

Ergebnissatz 13

Erzeuge ResultSet mit Anweisung 13

Erstellen Sie ResultSet mit PrepapredStatement 13

Prüfen Sie, ob Ihr ResultSet Informationen enthält oder nicht 13

Informationen erhalten Sie von ResultSet 14

Kapitel 5: JDBC - Statement Injection 15

Einführung 15

Examples 15

Statement & SQL Injection übel 15

Einfaches Login mit Statement 15

Melden Sie sich mit falschem Benutzernamen und Passwort an 16

FÜGEN Sie einen neuen Benutzer ein 16

LÖSCHEN Alle Benutzer 16

DROP Table-Benutzer 16

DROP-DATENBANK 17

Warum das alles? 17

Kapitel 6: PreparedStatement 18

Bemerkungen 18

Examples 18

Parameter für PreparedStatement einstellen 18

Sonderfälle 18

NULL-Wert einstellen: 18

LOBs einstellen 19

Ausnahmen bei set* -Methoden 19

Grundlegende Verwendung einer vorbereiteten Anweisung 19

Kapitel 7: ResultSetMetaData 20

Einführung 20

Examples 20

ResultSetMetaData 20

Credits 21

Über

You can share this PDF with anyone you feel could benefit from it, downloaded the latest version from: jdbc

It is an unofficial and free jdbc ebook created for educational purposes. All the content is extracted from Stack Overflow Documentation, which is written by many hardworking individuals at Stack Overflow. It is neither affiliated with Stack Overflow nor official jdbc.

The content is released under Creative Commons BY-SA, and the list of contributors to each chapter are provided in the credits section at the end of this book. Images may be copyright of their respective owners unless otherwise specified. All trademarks and registered trademarks are the property of their respective company owners.

Use the content presented in this book at your own risk; it is not guaranteed to be correct nor accurate, please send your feedback and corrections to [email protected]

https://riptutorial.com/de/home 1

Kapitel 1: Erste Schritte mit jdbc

Bemerkungen

JDBC oder Java DataBase Connectivity ist die Java-Spezifikation für die Verbindung zu (relationalen) Datenbanken. JDBC bietet eine gemeinsame API in Form einer Reihe von Schnittstellen und Ausnahmen sowie Erwartungen (oder Anforderungen) an Treiber.

Die JDBC-Spezifikation besteht aus zwei Teilen:

Ein Spezifikationsdokument, verfügbar auf der JSR-221-Seite1. Die API und ihre Dokumentation, die in der Java SE-API enthalten sind (Pakete java.sql und javax.sql )

2.

Die meisten relationalen Datenbanken und einige nicht relationale Datenbanken stellen einen Treiber bereit, der JDBC implementiert.

Versionen

Ausführung Veröffentlichungsdatum

3,0 2002-02-06

4,0 2006-12-11

4.1 2011-07-07

4.2 2014-03-18

Examples

Verbindung herstellen

Um JDBC verwenden zu können, benötigen Sie den JDBC-Treiber Ihrer Datenbank im Klassenpfad Ihrer Anwendung.

Es gibt mehrere Möglichkeiten, eine Verbindung zu einer Datenbank javax.sql.DataSource . Die übliche java.sql.DriverManager , entweder java.sql.DriverManager oder eine datenbankspezifische Implementierung von javax.sql.DataSource zu konfigurieren und zu verwenden.

Ein einfaches Beispiel, um eine Verbindung zu einer Datenbank mit der URL jdbc:somedb://localhost/foobar und eine Aktualisierungsanweisung auszuführen, um alle Mitarbeiter um 5% zu erhöhen:

try (Connection connection = DriverManager.getConnection(

https://riptutorial.com/de/home 2

"jdbc:somedb://localhost/foobar", "anna", "supersecretpassword"); Statement updateStatement = connection.createStatement()) { updateStatement.executeUpdate("update employees set salary = salary * 1.05"); }

Weitere Informationen finden Sie unter Erstellen einer Datenbankverbindung

Erste Schritte mit jdbc online lesen: https://riptutorial.com/de/jdbc/topic/1685/erste-schritte-mit-jdbc

https://riptutorial.com/de/home 3

Kapitel 2: Anweisungsausgabe

Einführung

Beim Anweisungsbatching werden entweder mehrere Anweisungen als eine Einheit (mit einem normalen java.sql.Statement ) oder eine einzelne Anweisung mit mehreren Parametersätzen (mit einem java.sql.PreparedStatement ) ausgeführt.

Bemerkungen

Das Anweisungsbatching ermöglicht einem Programm, zusammengehörige Anweisungen zu sammeln, oder bei vorbereiteten Anweisungen, Parameterwertesätze, und diese als eine einzige Ausführung an den Datenbankserver zu senden.

Die Vorteile des Anweisungsstapelns können eine verbesserte Leistung umfassen. Ob und wie diese Leistungsvorteile erzielt werden, hängt von der Treiber- und Datenbankunterstützung ab. Dazu gehören:

Senden Sie alle Anweisungen (oder alle Wertesätze) in einem Befehl•Die Anweisung (en) umschreiben, damit sie wie eine große Anweisung ausgeführt werden können

Examples

Stapeleinfügung mit PreparedStatement

Die Stapelverarbeitung mit java.sql.PreparedStatement ermöglicht Ihnen die Ausführung einer einzelnen DML-Anweisung mit mehreren java.sql.PreparedStatement für ihre Parameter.

In diesem Beispiel wird veranschaulicht, wie eine Einfügeanweisung vorbereitet und zum Einfügen mehrerer Zeilen in einen Stapel verwendet wird.

Connection connection = ...; // obtained earlier connection.setAutoCommit(false); // disabling autoCommit is recommend for batching int orderId = ...; // The primary key of inserting and order List<OrderItem> orderItems = ...; // Order item data try (PreparedStatement insert = connection.prepareStatement( "INSERT INTO orderlines(orderid, itemid, quantity) VALUES (?, ?, ?)")) { // Add the order item data to the batch for (OrderItem orderItem : orderItems) { insert.setInt(1, orderId); insert.setInt(2, orderItem.getItemId()); insert.setInt(3, orderItem.getQuantity()); insert.addBatch(); } insert.executeBatch();//executing the batch

https://riptutorial.com/de/home 4

} connection.commit();//commit statements to apply changes

Stapelverarbeitung mit Statement

Die Stapelverarbeitung mit java.sql.Statement ermöglicht das gleichzeitige Ausführen mehrerer DML-Anweisungen ( update , insert , delete ). Dies wird erreicht, indem ein einzelnes Anweisungsobjekt erstellt, die auszuführenden Anweisungen hinzugefügt und der Stapel dann als eine ausgeführt wird.

Connection connection = ...; // obtained earlier connection.setAutoCommit(false); // disabling autocommit is recommended for batch execution try (Statement statement = connection.createStatement()) { statement.addBatch("INSERT INTO users (id, username) VALUES (2, 'anna')"); statement.addBatch("INSERT INTO userrole(userid, rolename) VALUES (2, 'admin')"); statement.executeBatch();//executing the batch } connection.commit();//commit statements to apply changes

Hinweis:

statement.executeBatch(); gibt int[] , um die zurückgegebenen Werte zu speichern. Sie können den Stapel so ausführen:

int[] stmExc = statement.executeBatch();//executing the batch

Anweisungsausgabe online lesen: https://riptutorial.com/de/jdbc/topic/2992/anweisungsausgabe

https://riptutorial.com/de/home 5

Kapitel 3: Datenbankverbindung erstellen

Syntax

DB_URL = "jdbc: DBMS: // DB_HOST: DB_PORT / DB_NAME"•

DBMS: Data Base Driver Manager, dies kann ein beliebiges DBMS sein (mysql, oracle, postgresql, sqlite, ...), zum Beispiel mysql: "com.mysql.jdbc.Driver"

DB_HOST: Ihr Datenbank-Basishost, die IP-Adresse Ihres Datenbankbeispiels: 10.6.0.1, der Standardwert ist localhost oder 127.0.0.1

DB_PORT: Datenbankport, jedes DBMS hat einen defeaut-Port, zum Beispiel mysql = 3306, postegesql = 5432

DB_NAME: Der Name Ihrer Datenbank•

Um eine Verbindung herzustellen, erhalten Sie einen Verweis auf das Klassenobjekt.•

Class.forName (DRIVER);•

Und um eine Verbindung zur Datenbank herzustellen, müssen Sie eine Verbindung herstellen

java.sql.Connection con = DriverManager.getConnection (DB_URL, DB_USER_NAME, DB_PASSWORD);

DB_USER_NAME: der Benutzername Ihrer Datenbank•

DB_PASSWORD: das Passwort Ihrer Datenbank•

Examples

Einführung (SQL)

Seit Java 6 ist der Zugriff auf eine SQL-basierte Datenbank in Java die Verwendung der JDBC-API (Java DataBase Connectivity).

Diese API ist in zwei Paketen erhältlich: java.sql und javax.sql .

JDBC definiert Datenbankinteraktionen in Bezug auf Connections und Drivers .

Ein Driver interagiert mit der Datenbank und stellt eine vereinfachte Schnittstelle zum Öffnen und Verwalten von Verbindungen bereit. Die meisten Datenbankservervarianten (PostgreSQL, MySQl usw.) verfügen über eigene Drivers , die das Setup, den Abbau und die Übersetzung für diesen Server durchführen. Drivers wird normalerweise nicht direkt zugegriffen. DriverManager wird stattdessen die vom DriverManager Objekt bereitgestellte Schnittstelle verwendet.

https://riptutorial.com/de/home 6

Das DriverManager Objekt ist im Wesentlichen der Kern von JDBC. Es bietet eine (meistens) datenbankunabhängige Schnittstelle zum Erstellen von Connections . Bei älteren Versionen der JDBC-API mussten datenbankspezifische Drivers geladen werden, bevor DeviceManager eine Verbindung zu diesem Datenbanktyp herstellen konnte.

Eine Connection ist, wie der Name schon sagt, eine Darstellung einer offenen Verbindung zur Datenbank. Connections sind datenbankunabhängig und werden vom DriverManager erstellt und bereitgestellt. Sie bieten eine Reihe von "Shortcut" -Methoden für gängige Abfragetypen sowie eine unformatierte SQL-Schnittstelle.

Verwendung der Verbindung (und Anweisungen)

Sobald wir die Connection , verwenden wir sie hauptsächlich zum Erstellen von Statement . Statements repräsentieren eine einzelne SQL-Transaktion. Sie werden zum Ausführen einer Abfrage und zum Abrufen der Ergebnisse (falls vorhanden) verwendet. Schauen wir uns einige Beispiele an:

public void useConnection() throws SQLException{ Connection conn = getConnection(); //We can use our Connection to create Statements Statement state = conn.getStatement(); //Statements are most useful for static, "one-off" queries String query = "SELECT * FROM mainTable"; boolean sucess = state.execute(query); //The execute method does exactly that; it executes the provided SQL statement, and returns true if the execution provided results (i.e. was a SELECT) and false otherwise. ResultSet results = state.getResultSet(); //The ResultSet object represents the results, if any, of an SQL statement. //In this case, the ResultSet contains the return value from our query statement. //A later example will examine ResultSets in more detail. ResultSet newResults = state.executeQuery(query) //The executeQuery method is a 'shortcut' method. It combines the execute and getResultSet methods into a single step. //Note that the provided SQL query must be able to return results; typically, it is a single static SELECT statement. //There are a number of similar 'shortcut' methods provided by the Statement interface, including executeUpdate and executeBatch //Statements, while useful, are not always the best choice. String newQuery = "SELECT * FROM mainTable WHERE id=?"; PreparedStatement prepStatement = conn.prepareStatement(newQuery); //PreparedStatements are the prefed alternative for variable statements, especially ones that are going to be executed multiple times

https://riptutorial.com/de/home 7

for(int id:this.ids){ prepStatement.setInt(1,id); //PreparedStatements allow you to set bind variables with a wide variety of set methods. //The first argument to any of the various set methods is the index of the bind variable you want to set. Note that this starts from 1, not 0. ResultSet tempResults = prepStatement.executeQuery() //Just like Statements, PreparedStatements have a couple of shortcut methods. //Unlike Statements, PreparedStatements do not not take a query string as an argument to any of their execute methods. //The statement that is executed is always the one passed to the Connector.prepareStatement call that created the PreparedStatement } }

Erstellen einer Verbindung mit java.sql.DriverManager

Für die Verbindung mit java.sql.DriverManager benötigen Sie eine JDBC-URL, um eine Verbindung zu Ihrer Datenbank java.sql.DriverManager . JDBC-URLs sind datenbankspezifisch, haben jedoch alle die Form

jdbc:<subprotocol>:<subname>

Dabei bezeichnet <subprotocol> den Treiber oder die Datenbank (z. B. postgresql , mysql , firebirdsql usw.) und <subname> ist subprotokollspezifisch.

Sie müssen die Dokumentation Ihrer Datenbank und Ihres JDBC-Treibers auf das spezifische URL-Subprotokoll und das Format für Ihren Treiber überprüfen.

Ein einfaches Beispiel zum Erstellen einer Verbindung zu einer Datenbank mit der URL jdbc:somedb://localhost/foobar :

try (Connection connection = DriverManager.getConnection( "jdbc:somedb://localhost/foobar", "anna", "supersecretpassword")) { // do something with connection }

Wir verwenden hier eine Try-With-Ressource , so dass die Verbindung automatisch geschlossen wird, sobald wir damit fertig sind, selbst wenn Ausnahmen auftreten.

4,0

Auf Java 6 (JDBC 4.0) und früheren Versionen sind Try-With-Ressourcen nicht verfügbar. In diesen Versionen müssen Sie einen finally Block verwenden, um eine Verbindung explizit zu schließen:

Connection connection = DriverManager.getConnection( "jdbc:somedb://localhost/foobar", "anna", "supersecretpassword"); try {

https://riptutorial.com/de/home 8

// do something with connection } finally { // explicitly close connection connection.close(); }

4,0

Mit JDBC 4.0 (Java 6) wurde das Konzept des automatischen Treiberladens eingeführt. Wenn Sie Java 5 oder eine frühere Version oder einen älteren JDBC-Treiber verwenden, der keine JDBC 4-Unterstützung implementiert, müssen Sie die Treiber explizit laden:

Class.forName("org.example.somedb.jdbc.Driver");

Diese Zeile muss (mindestens) einmal in Ihrem Programm vorhanden sein, bevor eine Verbindung hergestellt wird.

Selbst in Java 6 und höher mit JDBC 4.0 kann es erforderlich sein, einen Treiber explizit zu laden: beispielsweise in Webanwendungen, wenn der Treiber nicht in den Container, sondern als Teil der Webanwendung geladen wird.

Alternativ können Sie auch ein Properties für die Verbindung angeben:

Properties props = new Properties(); props.setProperty("user", "anna"); props.setProperty("password", "supersecretpassword"); // other, database specific, properties try (Connection connection = DriverManager.getConnection( "jdbc:somedb://localhost/foobar", props)) { // do something with connection }

Oder auch ohne Eigenschaften, zum Beispiel, wenn die Datenbank keinen Benutzernamen und kein Passwort benötigt:

try (Connection connection = DriverManager.getConnection( "jdbc:somedb://localhost/foobar")) { // do something with connection }

Verbindung zu MySQL herstellen

Um sich mit MySQL zu verbinden, müssen Sie den MySQL Connector / J-Treiber verwenden. Sie können es von http://dev.mysql.com/downloads/connector/j/ herunterladen oder Sie können Maven verwenden:

<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.39</version> </dependency>

https://riptutorial.com/de/home 9

Die grundlegende JDBC-URL für MySQL lautet:

jdbc:mysql://<hostname>[:<port>]/<database>[?<propertyName>=<propertyValue>[&<propertyName>=<propertyValue>]...]

Woher:

Schlüssel Beschreibung Beispiel

<hostname> Hostname des MySQL-Servers localhost

<port> Port des MySQL-Servers (optional, Standard: 3306) 3306

<database> Name der Datenbank foobar

<propertyName> Name einer Verbindungseigenschaft useCompression

<propertyValue> Wert einer Verbindungseigenschaft true

Die unterstützte URL ist komplexer als oben angegeben, dies reicht jedoch für die meisten "normalen" Anforderungen aus.

Verbinden Sie sich mit:

try (Connection connection = DriverManager.getConnection( "jdbc:mysql://localhost/foobardb", "peter", "nicepassword")) { // do something with connection }

4,0

Für ältere Java / JDBC-Versionen:

4,0

// Load the MySQL Connector/J driver Class.forName("com.mysql.jdbc.Driver");

Connection connection = DriverManager.getConnection( "jdbc:mysql://localhost/foobardb", "peter", "nicepassword"); try { // do something with connection } finally { // explicitly close connection connection.close(); }

Verbindung zu einer Microsoft Access-Datenbank mit UCanAccess

UCanAccess ist ein reiner Java- JDBC Treiber, mit dem Access-Datenbanken ohne ODBC gelesen und darin geschrieben werden können. Es verwendet zwei andere Pakete, Jackcess und HSQLDB ,

https://riptutorial.com/de/home 10

um diese Aufgaben auszuführen.

Nach dem Einrichten * können wir mit Daten in .accdb- und .mdb-Dateien mit folgendem Code arbeiten:

import java.sql.*; Connection conn=DriverManager.getConnection("jdbc:ucanaccess://C:/__tmp/test/zzz.accdb"); Statement s = conn.createStatement(); ResultSet rs = s.executeQuery("SELECT [LastName] FROM [Clients]"); while (rs.next()) { System.out.println(rs.getString(1)); }

* Weitere Einzelheiten finden Sie in der folgenden Frage:

Bearbeiten einer Access-Datenbank von Java ohne ODBC

Oracle JDBC-Verbindung

Treiber:

12c R1•11g R2•

( Hinweis: Der Treiber ist nicht in Maven Central enthalten!)

Initialisierung der Treiberklasse:

Class.forName("oracle.jdbc.driver.OracleDriver");

Verbindungs-URL

Älteres Format mit SID

"jdbc:oracle:thin:@<hostname>:<port>:<SID>"

Neueres Format mit Dienstname

"jdbc:oracle:thin:@//<hostname>:<port>/<servicename>"

TNS-Namen wie Eintrag

"jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=<hostname>)(PORT=<port>))" +"(CONNECT_DATA=(SERVICE_NAME=<servicename>)))"

RAC-Cluster-Verbindungszeichenfolge für Failover

https://riptutorial.com/de/home 11

"jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(LOAD_BALANCE=OFF)(FAILOVER=ON)" +"(ADDRESS=(PROTOCOL=TCP)(HOST=<hostname1>)(PORT=<port1>))" +"(ADDRESS=(PROTOCOL=TCP)(HOST=<hostname2>)(PORT=<port2>)))" +"(CONNECT_DATA=SERVICE_NAME=<servicename>)(SERVER=DEDICATED)))"

Beispiel

connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "HR", "HRPASS");

Datenbankverbindung erstellen online lesen: https://riptutorial.com/de/jdbc/topic/2640/datenbankverbindung-erstellen

https://riptutorial.com/de/home 12

Kapitel 4: Ergebnissatz

Einführung

Ein ResultSet-Objekt verwaltet einen Cursor, der auf die aktuelle Datenzeile zeigt. Anfangs steht der Cursor vor der ersten Zeile. Die nächste Methode verschiebt den Cursor in die nächste Zeile. Da das Ergebnisergebnis false zurückgibt, wenn es keine weiteren Zeilen im ResultSet-Objekt enthält, kann es in einer while-Schleife verwendet werden, um das Ergebnis zu durchlaufen

Examples

Ergebnissatz

Um ein ResultSet zu erstellen, ResultSet Sie eine Statement oder PrepapredStatement :

Erzeuge ResultSet mit Anweisung

try { Class.forName(driver); Connection connection = DriverManager.getConnection( "jdbc:somedb://localhost/databasename", "username", "password"); Statement statement = connection.createStatement(); ResultSet result = statement.executeQuery("SELECT * FROM my_table"); } catch (ClassNotFoundException | SQLException e) { }

Erstellen Sie ResultSet mit PrepapredStatement

try { Class.forName(driver); Connection connection = DriverManager.getConnection( "jdbc:somedb://localhost/databasename", "username", "password"); PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM my_table"); ResultSet result = preparedStatement.executeQuery(); } catch (ClassNotFoundException | SQLException e) { }

Prüfen Sie, ob Ihr ResultSet Informationen

https://riptutorial.com/de/home 13

enthält oder nicht

if (result.next()) { //yes result not empty }

Informationen erhalten Sie von ResultSet

Es gibt verschiedene Arten von Informationen, die Sie von Ihrem ResultSet wie String, int, boolean, float, Blob ResultSet , um Informationen zu erhalten, die Sie für die Verwendung einer Schleife oder eines einfachen Falls ResultSet :

if (result.next()) { //get int from your result set result.getInt("id"); //get string from your result set result.getString("username"); //get boolean from your result set result.getBoolean("validation"); //get double from your result set result.getDouble("price"); }

Ergebnissatz online lesen: https://riptutorial.com/de/jdbc/topic/9172/ergebnissatz

https://riptutorial.com/de/home 14

Kapitel 5: JDBC - Statement Injection

Einführung

SQL-Injection ist eine Code-Injection-Technik, mit der datengesteuerte Anwendungen angegriffen werden, bei der schädliche SQL-Anweisungen zur Ausführung in ein Eingabefeld eingefügt werden (z. B. zum Speichern des Datenbankinhalts für den Angreifer).

In diesem Abschnitt werden wir darüber und seine Beziehung zur JDBC-Anweisung sprechen.

Examples

Statement & SQL Injection übel

Beachten Sie, dass in diesem Beispiel PostgreSQL DBMS verwendet wird. Sie können jedoch beliebige DBMS verwenden

Wir werden eine Datenbank verwenden bd_test Hexe enthält ein Schema: sch_test und zwei Tabellen users und test :

CREATE TABLE sch_test.users ( id serial NOT NULL, username character varying, password character varying, CONSTRAINT utilisateur_pkey PRIMARY KEY (id) ) CREATE TABLE sch_test.test ( id serial NOT NULL, "column" character varying )

Einfaches Login mit Statement

static String DRIVER = "org.postgresql.Driver"; static String DB_USERNAME = "postgres"; static String DB_PASSWOR = "admin"; static String DB_URL = "jdbc:postgresql://localhost:5432/bd_test"; public static void sqlInjection() { try { Class.forName(DRIVER); Connection connection = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWOR); Statement statement = connection.createStatement(); String username = "admin"; String password = "admin"; String query = "SELECT * FROM sch_test.users where username = '"

https://riptutorial.com/de/home 15

+ username + "' and password = '" + password + "'"; ResultSet result = statement.executeQuery(query); if (result.next()) { System.out.println("id = " + result.getInt("id") + " | username = " + result.getString("username") + " | password = " + result.getString("password")); }else{ System.out.println("Login not correct"); } } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } }

Bis jetzt ist alles normal und sicher.

Melden Sie sich mit falschem Benutzernamen und Passwort an

Der Hacker oder der Tester kann sich einfach anmelden oder alle Benutzer mit dieser Liste auflisten:

String username = " ' or ''='"; String password = " ' or ''='";

FÜGEN Sie einen neuen Benutzer ein

Sie können Daten in Ihre Tabelle einfügen mit:

String username = "'; INSERT INTO sch_test.utilisateur(id, username, password) VALUES (2, 'hack1', 'hack2');--"; String password = "any";

LÖSCHEN Alle Benutzer

Beachten Sie, dass der Hacker das Schema Ihrer Datenbank kennt, damit er alle Benutzer löschen kann

String username = "'; DELETE FROM sch_test.utilisateur WHERE id>0;--"; String password = "any";

DROP Table-Benutzer

https://riptutorial.com/de/home 16

Der Hacker kann Ihre Tabelle auch löschen

String username = "'; drop table sch_test.table2;--"; String password = "any";

DROP-DATENBANK

Das Schlimmste ist das Löschen der Datenbank

String username = "'; DROP DATABASE bd_test;--"; String password = "any";

und es gibt viele andere.

Warum das alles?

Da Statement nicht so sicher ist, dass es die Abfrage so ausführt, wie es ist, wird empfohlen, stattdessen PreparedStatement zu verwenden. PreparedStatement ist jedoch sicherer als Statement .

Weitere Informationen finden Sie hier PreparedStatement

JDBC - Statement Injection online lesen: https://riptutorial.com/de/jdbc/topic/9238/jdbc---statement-injection

https://riptutorial.com/de/home 17

Kapitel 6: PreparedStatement

Bemerkungen

Ein PreparedStatement deklariert die Anweisung vor ihrer Ausführung und erlaubt Platzhalter für Parameter. Dadurch kann die Anweisung einmal auf dem Server vorbereitet (und optimiert) und dann mit verschiedenen Parametersätzen wiederverwendet werden.

Der zusätzliche Vorteil der Parameterplatzhalter besteht darin, dass sie Schutz vor der SQL-Injection bietet. Dies wird entweder durch das separate Senden der Parameterwerte oder durch die korrekte Eingabe der Werte durch den Treiber erreicht.

Examples

Parameter für PreparedStatement einstellen

Platzhalter in der Abfragezeichenfolge müssen mithilfe der set* -Methoden festgelegt werden:

String sql = "SELECT * FROM EMP WHERE JOB = ? AND SAL > ?"; //Create statement to make your operations PreparedStatement statement = connection.prepareStatement(sql); statement.setString(1, "MANAGER"); // String value statement.setInt(2, 2850); // int value

Sonderfälle

NULL-Wert einstellen:

Das Festlegen eines Nullwerts kann nicht beispielsweise mit den Methoden setInt und setLong werden, da diese primitive Typen ( int und long ) anstelle von Objekten ( Integer und Long ) verwenden und eine NullPointerException ausgelöst wird:

void setFloat(int parameterIndex, float x) void setInt(int parameterIndex, int x) void setLong(int parameterIndex, long x)

Diese Fälle können mit setNull .

setNull(int parameterIndex, int sqlType)

Es wird eingegeben, daher muss der zweite Parameter angegeben werden, siehe java.sql.Types

//setting a NULL for an integer value statement.setNull(2, java.sql.Types.INTEGER);

https://riptutorial.com/de/home 18

LOBs einstellen

Für LOBs müssen spezielle Objekte verwendet werden.

Clob longContent = connection.createClob(); Writer longContentWriter = longContent.setCharacterStream(1); // position: beginning longContentWriter.write("This will be the content of the CLOB"); pstmt = connection.prepareStatement("INSERT INTO CLOB_TABLE(CLOB_VALUE) VALUES (?)"); pstmt.setClob(1, longContent);

Ausnahmen bei set* -Methoden

SQLException - wenn parameterIndex keiner Parametermarkierung in der SQL-Anweisung entspricht; Wenn ein Datenbankzugriffsfehler auftritt oder diese Methode bei einem geschlossenen PreparedStatement aufgerufen wird

SQLFeatureNotSupportedException - Wenn sqlType ein Datentyp vom Typ ARRAY , BLOB , CLOB , DATALINK , JAVA_OBJECT , NCHAR , NCLOB , NVARCHAR , LONGNVARCHAR , REF , ROWID , SQLXML oder STRUCT und dieser Datentyp nicht unterstützt wird

Grundlegende Verwendung einer vorbereiteten Anweisung

Dieses Beispiel zeigt, wie Sie eine vorbereitete Anweisung mit einer Einfügeanweisung mit Parametern erstellen, diesen Parametern Werte zuweisen und dann die Anweisung ausführen.

Connection connection = ... // connection created earlier try (PreparedStatement insert = connection.prepareStatement( "insert into orders(id, customerid, totalvalue, comment) values (?, ?, ?, ?)")) { //NOTE: Position indexes start at 1, not 0 insert.setInt(1, 1); insert.setInt(2, 7934747); insert.setBigDecimal(3, new BigDecimal("100.95")); insert.setString(4, "quick delivery requested"); insert.executeUpdate(); }

Die Fragezeichen ( ? ) In der Einfügeanweisung sind die Parameterplatzhalter. Sie sind Positionsparameter, auf die später (mithilfe eines Indexes auf 1-Basis) setXXX , wobei die setXXX Methoden verwendet werden, um Werte für diese Parameter setXXX .

Die Verwendung von try-with-resources stellt sicher, dass die Anweisung geschlossen wird und alle für diese Anweisung verwendeten Ressourcen freigegeben werden.

PreparedStatement online lesen: https://riptutorial.com/de/jdbc/topic/2939/preparedstatement

https://riptutorial.com/de/home 19

Kapitel 7: ResultSetMetaData

Einführung

Wie wir alle wissen, bedeuten Metadaten Daten zu Daten.

Die ResultSetMetaData-Schnittstelle ist nützlich, um Metadaten einer Tabelle abzurufen, wie zum Beispiel die Gesamtanzahl der Spalten, den Spaltennamen, den Spaltentyp usw.

Examples

ResultSetMetaData

import java.sql.*; class Rsmd { public static void main(String args[]) { try { Class.forName("oracle.jdbc.driver.OracleDriver"); Connection con = DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:xe", "system", "oracle"); PreparedStatement ps = con.prepareStatement("select * from emp"); ResultSet rs = ps.executeQuery(); ResultSetMetaData rsmd = rs.getMetaData(); System.out.println("Total columns: " + rsmd.getColumnCount()); System.out.println("Column Name of 1st column: " + rsmd.getColumnName(1)); System.out.println("Column Type Name of 1st column: " + rsmd.getColumnTypeName(1)); con.close(); } catch (Exception e) { System.out.println(e); } } }

ResultSetMetaData online lesen: https://riptutorial.com/de/jdbc/topic/10126/resultsetmetadata

https://riptutorial.com/de/home 20

Credits

S. No

Kapitel Contributors

1 Erste Schritte mit jdbc Community, Mark Rotteveel, YCF_L

2 Anweisungsausgabe KIRAN KUMAR MATAM, Mark Rotteveel, ppeterka, YCF_L

3Datenbankverbindung erstellen

F. Stephen Q, Gherbi Hicham, Gord Thompson, Mark Rotteveel, ppeterka, YCF_L

4 Ergebnissatz KIRAN KUMAR MATAM, YCF_L

5JDBC - Statement Injection

YCF_L

6 PreparedStatement Gord Thompson, Gus, Mark Rotteveel, ppeterka, YCF_L

7 ResultSetMetaData KIRAN KUMAR MATAM, YCF_L

https://riptutorial.com/de/home 21