SQL Anweisung mittels PreparedStatement

Status
Nicht offen für weitere Antworten.
S

StefanAusKöln

Gast
Hallo,

ich habe ein Problem mit folgenden Befehlen:

Java:
PreparedStatement stmt = null;
stmt = con.prepareStatement("?");
stmt.setString(1, query);

query ist ein String, der als Parameter von einer anderen Funktion übergeben wird. Deshalb kann ich den auch nicht anders zusammensetzen. Wenn nun ein ' im query steht funtioniert der Datenbankbefehl nun nicht mehr. Sonderzeichen versuche ich deshalb mit obiger Konstruktion zu maskieren, was aber nicht klappt...

Vielen Dank schonmal für Hilfe!
Stefan
 

Noctarius

Top Contributor
Ein PreparedStatement ist (wie der Name sagt) ein komplettes Datenbankstatement. Also ein Select, Update, ...
 
S

StefanAusKöln

Gast
Und wie könnte ich alternativ Sonderzeichen maskieren? Kenne das nur aus php, dass es Befehle gibt, die das automatisch erledigen. Muss ich mir sowas für Java selber basteln?
 
S

SlaterB

Gast
du hast ja noch nichtmal den Query-String genannt, worum gehts überhaupt?
funktioniert es unabhängig von Java in einem SQL-Tool?
 

musiKk

Top Contributor
Also ich wundere mich, dass ein prepared Statement (selbst ohne Sonderzeichen) in der Form überhaupt funktioniert. Vor allem mit [c]setString[/c]. Ein Query ist für eine Datenbank ja kein String, sondern ein Konstrukt aus Schlüsselwörtern, Bezeichnern und Parametern mit verschiedenen SQL-Typen wie Zeichenketten und Zahlen. Mit dem Postgres-JDBC-Treiber geht so ein Query z. B. auch gar nicht.

Warum muss das Query derart dynamisch übergeben werden können? Normalerweise steht das Query fest und nur Parameter müssen ausgetauscht werden.
 
S

StefanAusKöln

Gast
Der query String könnte bspw. wie folgt aussehen:

UPDATE Tabelle1 SET name='BFG'hj' WHERE ID=2

Diese Ausweisung konnt zu Stande, in dem aus einem Textfeld der Name ausgelesenund eins zu ein in die query übernommen wird:

Java:
query = "Update Tabelle1 SET name=' " + textfeld_name.getText() + " ' WHERE ID=2";

Wenn der Name nun ein ' enthält klappt die sql-Anweisung nicht.

Wie ich nun sehe ist mein Ansatz allein deshalb zum Scheitern verurteilt, da ja der String für den Namen ebenfalls von ' eingeschlossen ist und deshalb eine Maskierung auch diese Zeichen betreffen würde. Da ich eine Vielzahl von Abfragen machen muss hatte ich mir überlegt, die Anfrage als String zu übergeben und dann weiter zu verarbeiten. In der weiterverarbeitenden Funktion wollte ich dann auch das Problem mit den ' abfangen. Es sieht allerdings so aus, als ob ich als query keinen String, sondern gleich das PreparedStatement übergeben sollte. Dies erfordert dann bei jeden "Bau" der Anweisung ein bisschen mehr Quellcode. Aber ich vermute anders wird's nicht gehen.

Danke für die Denkanstöße
Stefan
 
S

StefanAusKöln

Gast
Hmm, auch dies stellt mich nicht zufrieden, da ich jedesmal auch wieder try-catch-Blöcke schreiben müsste, was viel Code erzeugt. Kann ich vielleicht einfach den String aus dem Textfeld maskieren?
 

Noctarius

Top Contributor
Java:
PreparedStatement statement = connection.prepareStatement("UPDATE Tabelle1 SET name=? WHERE ID=?");
statement.setString(1, txtName.getText());
statement.setInt(2, Integer.parseInt(txtId.getText()));
statement.executeUpdate();

Gesucht wie man die verwendet hast du auch noch nicht, oder?
Using Prepared Statements (The Java™ Tutorials > JDBC(TM) Database Access > JDBC Basics)
Galileo Computing :: Java ist auch eine Insel – 22.10 Vorbereitete Anweisungen (Prepared Statements)
 
S

StefanAusKöln

Gast
Ich hab geschaut und das wäre Grundsätzlich kein Problem. Allerdings führt das zu Unmengen von try-catch-Blöcken, wenn ich das jedes mal schreibe wenn ich mir eine Query baue. Dies möchte ich vermeiden...
 
S

StefanAusKöln

Gast
Ich habe derzeit eine Funktion, die eine query entgegennimmt und diese an die Datenbank weiterreicht. Diese Funktion hat die Signatur:

private boolean performQuery(String query)

und liefert jeweils true or false wenn's klappt oder nicht. Die Abfrage beihaltet einen try-catch-Block.

Nun habe ich ca. 40 verschiedene Anfragen (Funktionen) welche obige Funktion nutzen und dazu ihre Querys übergeben. Wenn ich ich diesen 40 Funktionen jeweils ein PreparedStatement bauen möchte, benötige ich hierfür jeweils wieder try-catch-Blöcke (weil ja durch "reparedStatement updateSales = con.prepareStatement" auf eine Datenbankverbindung zugegriffen wird).

Oder kann ich auch ohne die datenbankverbindung anzugeben ein PreparedStatement basteln?
 

Michael...

Top Contributor
Man kann ja alle 40 PreparedStatements in einen try-catch-Block erzeugen. Vermutlich kannst man sogar einige der Statements zu einem PreparedStatement zusammenfassen - 40 ist ja schon ne ganz schöne Menge.
 
S

SlaterB

Gast
bisher musstest du an diesen 40 Stellen mühsam und unsicher die Query + Parameter zu einem String zusammenkitten,
auch kein Vergnügen

und nun der Sonnenschein: du bist in Java, einer vollständigen Programmiersprache, nichts hindert dich daran, den try/ catches Abhilfe zu schaffen,

schreibe an jede der 40 Stellen:
Java:
NoExcepQuery q = new NoExpQuery("UPDATE Tabelle1 SET name=? WHERE ID=?");
q.setString(1, txtName.getText());
q.setInt(2, txtId.getText()); // parst gleich automatisch
dbHandler.performQuery(q);
mit einer neuen eigenen Klasse NoExcepQuery, die nur den Query-String + die Parameter sauber ablegt,
so dass später daraus ein PreparedStatement erstellt werden kann

Nebenvorteil: falls irgendwann mal eine andere API als JDBC mit PreparedStatement verwendet wird,
z.B. Hibernate, so muss praktisch nur an einer Stelle der Code geändert werden (von Details wie HQL statt SQL abgesehen ;) )
 
Zuletzt bearbeitet von einem Moderator:
S

StefanAusKöln

Gast
Ich denke der Ansatz von SlaterB gefällt mir am besten. Sollte das dann in etwa wie folgt aussehen?
Java:
public class NoExcepQuery
{
    public String query;
    public HashMap values = new HashMap();

    public NoExcepQuery(String q)
    {
        this.query = q;
    }

    public void setString(int position, String value)
    {
        values.put(position, value);
    }

    public void setInt(int position, int value)
    {
        values.put(position, value);
    }
}
In der ensprechenden Funktion zum Ausführen der Query werden dann alle Einträge in der HashMap durchlaufen, der Typ mittels instanceof ermitteln und die Ersetzungen durchgeführt? Entspricht das Deiner Idee?

Die Anzahl der Abfragen lässt sich kaum verringern. Es sind 15 Tabellen in die jeweils Werte eingetragen und aktualisiert werden müssen. Dabei teilweise für einzelne Einträge oder für alle vorhandenen...
 
S

SlaterB

Gast
instanceof ist nicht ganz so schön, aber ja, so in etwa

in meiner Vorstellung wäre das dann etwas typisierter,
Map<Position, Eintrag(Position, Typ, Name, Wert)>

eine Map ist ja auch nicht unbedingt nötig, eine Liste geht genauso,
beim Übertragen ans PreparedStatement wird man kaum mit der Map etwas anfangen können
 
S

StefanAusKöln

Gast
Vielen Dank. Hab's nun mit ner ArrayList gemacht. Viel besser als ne Hashmap. Die war auch ne blöde Idee. Hab die nur letztens neu entdeckt und gleich ein schlechtes Einsatzszenario gefunden...

Es sieht nun wie folgt aus:
Java:
import java.util.ArrayList;

public class NoExcepQuery
{
    public String query;
    public ArrayList<QueryValue> values = new ArrayList<QueryValue>();

    public NoExcepQuery(String q)
    {
        this.query = q;
    }

    public void setString(int position, String value)
    {
        values.add(new QueryValue(position, value));
    }

    public void setInt(int position, int value)
    {
        values.add(new QueryValue(position, value));
    }
}
und
Java:
public class QueryValue
{
    public int position;
    public Object value;

    public QueryValue(int position, Object value)
    {
        this.position = position;
        this.value = value;
    }
}
ergibt
Java:
NoExcepQuery query = new NoExcepQuery("UPDATE TabelleXY SET bezeichnung=? WHERE ID=?");
query.setString(1, bezeichnung);
query.setInt(2, ID);
updateQuery(query);
und
Java:
private boolean updateQuery(NoExcepQuery query)
        {
            try
            {
                stmt = con.prepareStatement(query.query);
                QueryValue qv;
                for(int i = 0; i < query.values.size(); i++)
                {
                    qv = (QueryValue)query.values.get(i);
                    if(qv.value instanceof String)
                    {
                        stmt.setString(qv.position, (String)qv.value);
                    }
                    else if(qv.value instanceof Integer)
                    {
                        stmt.setInt(qv.position, (Integer)qv.value);
                    }
                }
                stmt.executeUpdate();
                return true;
            }
            catch(Exception e)
            {
                System.out.println(e);
		System.out.println("!!!!!!!!! ERROR performing update: " + query + " !!!!!!!!!");
		return false;
            }
            finally
            {
                // Close ResultSet and stmt if neccessary
                try {if(null != stmt) stmt.close();} catch(Exception ex) {System.out.println("Error: " + ex);}
            }
        }
Dies nun mit instanceof, da ich nicht wusste wie ich den Typ speichern kann. Aber so läufts schonmal und sieht dazu noch besser aus als vorher (zumindest nicht schlechter) =)

Danke nochmal auch für die Geduld mit mir
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Fats Waller Compiler-Fehler Kann ich einen String und die Summe zweier Char Werte mittels der println Anweisung ausgeben Java Basics - Anfänger-Themen 4
T If anweisung Java Basics - Anfänger-Themen 5
C Scanner und If-Anweisung in Kombi Java Basics - Anfänger-Themen 3
AlexVo String zu Java Anweisung getString("*** java code ***") Java Basics - Anfänger-Themen 19
R Wie würde hier die if-Anweisung aussehen? Java Basics - Anfänger-Themen 18
B break Anweisung Java Basics - Anfänger-Themen 13
C Wie kann ich einen User Input mit einer If-Anweisung verbinden? Java Basics - Anfänger-Themen 5
T Not a Statement/Illegal Start of expression bei for Anweisung Java Basics - Anfänger-Themen 6
H Cäsar chiffrierung ohne if-Anweisung Java Basics - Anfänger-Themen 5
D kann man vor dem CSVRecord, replace Anweisung anwenden ? Java Basics - Anfänger-Themen 2
B Erste Schritte if Anweisung mit Wert Übernahme Java Basics - Anfänger-Themen 3
C Anweisung Java Basics - Anfänger-Themen 11
C HashMap - alle keys haben values der letzten put-Anweisung Java Basics - Anfänger-Themen 3
W Warum funktioniert meine if Anweisung nicht? Java Basics - Anfänger-Themen 8
K if Anweisung Java Basics - Anfänger-Themen 3
W Erste Schritte Warum funktioniert mein Programm nicht ? ~if Anweisung~ Java Basics - Anfänger-Themen 4
V Erste Schritte Warum geht meine continue Anweisung nicht? Java Basics - Anfänger-Themen 8
DaCrazyJavaExpert [SQL] SQL als Anweisung mit Spezial-Fall EclipseEclipse Java Basics - Anfänger-Themen 8
J If Anweisung in Schleife einbinden Java Basics - Anfänger-Themen 7
JavaNewbie2.0 Zur Anweisung zurück Java Basics - Anfänger-Themen 13
J Erste Schritte Vorsicht Spaghetti-Code! Wie verschachtel ich meine If-Anweisung??? Java Basics - Anfänger-Themen 4
L if-Anweisung Java Basics - Anfänger-Themen 5
DontFeedTheTroll Erste Schritte Verständnisfrage zu If-Anweisung Java Basics - Anfänger-Themen 7
P Erste Schritte Taschenrechner mit if-else Anweisung Java Basics - Anfänger-Themen 6
Q Variablen If Anweisung, kleiner fehler Java Basics - Anfänger-Themen 8
M Probleme mit Anzeigen von String in GUI und if-Anweisung Java Basics - Anfänger-Themen 9
L If Anweisung mit ArrayList Probleme Java Basics - Anfänger-Themen 6
OlafHD String in einer If-Anweisung Vergleichen Java Basics - Anfänger-Themen 2
N Rekursion mit if-Anweisung Java Basics - Anfänger-Themen 10
P if anweisung Java Basics - Anfänger-Themen 8
L Frage zur while Anweisung Java Basics - Anfänger-Themen 10
F Return-Anweisung Java Basics - Anfänger-Themen 2
B If-anweisung per ja eingabe. Java Basics - Anfänger-Themen 2
C Variablen if Anweisung falsch gesetzt Java Basics - Anfänger-Themen 4
1 Bei if-Anweisung: Syntax error on token Java Basics - Anfänger-Themen 5
A for-Schleife, if-Anweisung Java Basics - Anfänger-Themen 4
A if - Anweisung Java Basics - Anfänger-Themen 6
R Erste Schritte Schleife erzeugen (mit If Anweisung) Java Basics - Anfänger-Themen 3
P Bei Switch-Anweisung wird default-Anweisung angezeigt Java Basics - Anfänger-Themen 4
M if, else Anweisung Java Basics - Anfänger-Themen 3
O This in switch anweisung Java Basics - Anfänger-Themen 5
M Throws Anweisung innerhalb eines Methodenkopfes unklar Java Basics - Anfänger-Themen 4
F Erste Schritte Switch case vs. Verschachtelte If Anweisung Java Basics - Anfänger-Themen 11
M If-Anweisung (Objekt nachdem es gegessen wurde, mehrmals auftauchen lassen) Java Basics - Anfänger-Themen 3
F Fehler in der Swich-Anweisung aber Warum? Java Basics - Anfänger-Themen 4
A if-Anweisung zwischen zwei Punkten Java Basics - Anfänger-Themen 1
T Problem mit IF-Anweisung. Java Basics - Anfänger-Themen 3
B Erste Schritte Addition von double in switch-Anweisung Java Basics - Anfänger-Themen 2
W return-Anweisung gibt nichts aus Java Basics - Anfänger-Themen 5
H Leere Anweisung Java Basics - Anfänger-Themen 24
S Methoden Return Anweisung beendet Methode nicht, stattdessen wird diese zweimal durchlaufen Java Basics - Anfänger-Themen 3
F Reset in der switch Anweisung Java Basics - Anfänger-Themen 3
V Frage zur IF Anweisung Java Basics - Anfänger-Themen 40
Bluedaishi Klassen Thread über if Anweisung starten und von anderer Klassen über Button Beenden Java Basics - Anfänger-Themen 34
H Worauf bezieht sich die erste else-Anweisung Java Basics - Anfänger-Themen 9
H Verständnisfrage für oder Anweisung Java Basics - Anfänger-Themen 8
D Denkfehler in der If-Anweisung Java Basics - Anfänger-Themen 3
K if anweisung Java Basics - Anfänger-Themen 13
M Erste Schritte Break-Anweisung bei if-else Java Basics - Anfänger-Themen 6
T Erste Schritte switch case Anweisung und if else Verzweigungen? Java Basics - Anfänger-Themen 6
S probleme mit der return anweisung Java Basics - Anfänger-Themen 20
K Methoden while Anweisung Java Basics - Anfänger-Themen 81
D Frage zu der import Anweisung in Java Java Basics - Anfänger-Themen 15
K Wann genau brauche ich die Anweisung gleich null? Java Basics - Anfänger-Themen 10
W "switch" Anweisung - Rechenzeichen? Java Basics - Anfänger-Themen 5
I Methoden Wochenkalendar switch anweisung fehlt Java Basics - Anfänger-Themen 4
D Verschachtelte IF-Anweisung Java Basics - Anfänger-Themen 10
C If-Anweisung Java Basics - Anfänger-Themen 22
C Switch Anweisung Frage Java Basics - Anfänger-Themen 8
M Bedingte Anweisung mit Boolean Java Basics - Anfänger-Themen 2
Luk10 Frage zu Switch-Anweisung Java Basics - Anfänger-Themen 11
C Umgebungsvariable import anweisung gibt fehlermeldung Java Basics - Anfänger-Themen 2
A if Anweisung in Schleife Java Basics - Anfänger-Themen 10
C Erste Schritte switch Anweisung geht nicht Java Basics - Anfänger-Themen 3
R fif-Anweisung funktioniert nicht wie erwartet Java Basics - Anfänger-Themen 11
B IF-Anweisung hat einen Fehler Java Basics - Anfänger-Themen 5
C unklare anweisung Java Basics - Anfänger-Themen 11
F if Anweisung mit Rückgabewert? Java Basics - Anfänger-Themen 4
C Problem bei if-anweisung Java Basics - Anfänger-Themen 8
J print-Anweisung verschluckt Java Basics - Anfänger-Themen 3
K return-Anweisung am Beispiel eines Palindroms Java Basics - Anfänger-Themen 18
F Problem bei if-Anweisung Java Basics - Anfänger-Themen 5
J Switch mit if anweisung kombinieren Java Basics - Anfänger-Themen 2
D Frage zu Exceptions und der import Anweisung Java Basics - Anfänger-Themen 12
R Return Anweisung übergibt Variablen nicht Java Basics - Anfänger-Themen 4
W Problem While-Anweisung Java Basics - Anfänger-Themen 6
S import - Anweisung; Setzen der Classpath Java Basics - Anfänger-Themen 2
E IF Anweisung mit logischen Operatoren Java Basics - Anfänger-Themen 18
B problem mit der return anweisung Java Basics - Anfänger-Themen 11
M '-1' in switch anweisung Java Basics - Anfänger-Themen 2
B import Anweisung Java Basics - Anfänger-Themen 2
A Super-Anweisung in abstrakter Klasse Java Basics - Anfänger-Themen 12
T Schleife mit return Anweisung Java Basics - Anfänger-Themen 3
S OOP This anweisung Java Basics - Anfänger-Themen 6
B fehlende return anweisung? Java Basics - Anfänger-Themen 17
A Return Anweisung von Methoden Java Basics - Anfänger-Themen 15
L Verstehe den Wert nicht! If-Anweisung Java Basics - Anfänger-Themen 5
J Was genau davon ist Anweisung, was Deklaration? Java Basics - Anfänger-Themen 2
L if else anweisung Java Basics - Anfänger-Themen 2
B If Anweisung (Kasdiert) Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben