Benutzer-Werkzeuge

Webseiten-Werkzeuge


api:documentation:database:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
api:documentation:database:start [2022/06/08 10:35] – [4. Prepared Statements] Martin Pabstapi:documentation:database:start [2023/05/15 13:16] (aktuell) – [3. Daten in die Datenbank schreiben] Martin Pabst
Zeile 1: Zeile 1:
 ====== Datenbankverbindung ====== ====== Datenbankverbindung ======
 <WRAP center round warning 80%> <WRAP center round warning 80%>
-Legt man in der SQL-IDE eine Datenbank an, so kann man von Java-Programmen in der Online-IDE aus lesend und schreibend darauf zugreifen. Dies ist leider nicht von den Programmierkästen der Embedded-IDE aus möglich, daher lassen sich die Beispiele unten nicht direkt auf dieser Seite ausführen, sondern nur, wenn man sie in die Online-IDE kopiert und den Code "XYZ" durch einen korrekten Datenbankzugriffscode aus der SQL-IDE ersetzt.+Legt man in der SQL-IDE eine Datenbank an, so kann man von Java-Programmen in der Online-IDE aus lesend und schreibend darauf zugreifen. Dies ist leider nicht von den Programmierkästen der Embedded-IDE aus möglich, daher lassen sich die Beispiele unten nicht direkt auf dieser Seite ausführen, sondern nur, wenn man sie in die Online-IDE kopiert und den Code "1Ts8qXH77X" durch einen korrekten Datenbankzugriffscode aus der SQL-IDE ersetzt.
 </WRAP> </WRAP>
  
Zeile 83: Zeile 83:
 </HTML> </HTML>
  
 +==== Schreibender Zugriff mit prepared statement: ====
 +<HTML>
  
 +<div class="java-online" style="height: 350px; width: 80%" data-java-online="{'withBottomPanel': false, 'id': 'db2a'}">
 +
 +<script type="text/plain" title="DBWriteWithPreparedStatements.java">
 +Connection c = DatabaseManager.getConnection("asdfj82hkhlTi");
 +
 +String statement = """
 +update fluss set name = ? where FNR = ?
 +""";
 +
 +PreparedStatement st = c.prepareStatement(statement);
 +String neuerName = "Sanga_neu";
 +String fnr = "SAG";
 +
 +st.setString(1, neuerName);
 +st.setString(2, fnr);
 +st.executeUpdate();
 +
 +</script>
 +
 +</div>
 +
 +</HTML>
 ===== 4. Prepared Statements ===== ===== 4. Prepared Statements =====
  
Zeile 99: Zeile 123:
 </code> </code>
 Da ''and'' stärker bindet als ''or'', ergibt der Wert des Terms in Klammern immer ''true''. Dadurch bekommt der Nutzer Zugriff auf den Datensatz von Barack Obama. \\ \\  Da ''and'' stärker bindet als ''or'', ergibt der Wert des Terms in Klammern immer ''true''. Dadurch bekommt der Nutzer Zugriff auf den Datensatz von Barack Obama. \\ \\ 
-Ein gutes Mittel, um dies zu verhindern, sind **Prepared Statements**. Die Idee besteht darin, vom Benutzer eingegebene Bestandteile nicht durch Aneinanderhängen von Zeichenketten in eine SQL-Anweisung einzubauen, sondern als Parameterwert mit an die Datenbank zu übergeben. Die Datenbank behandelt diese Parameter dann wie Zeichenketten Werte. Diese dürfen beliebige Zeichen enthalten und werden nie als SQL-Schlüsselwörter interpretiert, sondern immer als Konstante. +Ein gutes Mittel, um dies zu verhindern, sind **Prepared Statements**. Die Idee besteht darin, vom Benutzer eingegebene Bestandteile nicht durch Aneinanderhängen von Zeichenketten in eine SQL-Anweisung einzubauen, sondern als Parameterwert mit an die Datenbank zu übergeben. Die Datenbank behandelt diese Parameter dann wie Zeichenketten Werte. Diese dürfen beliebige Zeichen enthalten und werden nie als SQL-Schlüsselwörter interpretiert, sondern immer als Konstante. \\ \\  
 +Die Stellen, an denen in der SQL-Anweisung Parameterwerte eingefügt werden sollen, werden mit ''?'' gekennzeichnet, z.B. 
 +<code java> 
 +String statement = """ 
 +select name from fluss  
 +where name like ? 
 +"""; 
 + 
 +PreparedStatement st = c.prepareStatement(statement); 
 +</code> 
 + 
 +Mittels ''st.setString(index, value)'', ''st.setInt(index, value)'' usw. können dann die Werte definiert werden, die statt der ''?'' eingefügt werden sollen. Der ''index'' startet dabei ungewöhnlicherweise nicht bei ''0'', sondern bei ''1''. Mittels 
 +<code java> 
 +st.setString(1, "Donau");   // Ersetzt den Wert des ersten Fragezeichens im statement 
 +</code> 
 +wird das erste ''?'' durch '' 'Donau' '' ersetzt. Anschließend wird das Statement durch 
 +<code java> 
 +ResultSet rs = st.executeQuery(); 
 +</code> 
 +an die Datenbank geschickt. Natürlich gibt es auch ''st.executeUpdate()'' für datenverändernde Anweisungen (''insert'', ''update'', ...).
 </WRAP> </WRAP>
  
Zeile 105: Zeile 148:
 <HTML> <HTML>
  
-<div class="java-online" style="height: 350px; width: 80%" data-java-online="{'withBottomPanel': false, 'id': 'db3'}">+<div class="java-online" style="height: 400px; width: 80%" data-java-online="{'withBottomPanel': false, 'id': 'db3'}">
  
 <script type="text/plain" title="DBRead.java"> <script type="text/plain" title="DBRead.java">
Zeile 118: Zeile 161:
  
 PreparedStatement st = c.prepareStatement(statement); PreparedStatement st = c.prepareStatement(statement);
-st.setString(1, "S%");+ 
 +String flussName = Input.readString("Bitte geben Sie den Namen eines Flusses ein:"); 
 +st.setString(1, flussName);   // Ersetzt den Wert des ersten Fragezeichens im statement
  
 ResultSet rs = st.executeQuery(); ResultSet rs = st.executeQuery();
Zeile 132: Zeile 177:
  
  
 +<WRAP center round tip 80%>
 +Möchte man von Java aus viele gleichartige Statements hintereinander an die Datenbank schicken, z.B. zum Verändern von Daten, so bringen Prepared Statements nicht nur einen Sicherheitsgewinn, sondern auch einen Geschwindigkeitsvorteil: Man ruft ''PreparedStatement st = c.prepareStatement(statement);'' nur ein Mal auf, gefolgt von vielen abwechselnden ''st.setString'' und ''st.executeUpdate()''-Aufrufen. Das SQL-Statement wird von der Datenbank in diesem Fall nur ein einziges Mal kompiliert (beim Aufruf von ''prepareStatement'').
 +</WRAP>
  
api/documentation/database/start.1654677348.txt.gz · Zuletzt geändert: 2022/06/08 10:35 von Martin Pabst

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki