Mysql Update wenn es nicht existiert insert

Emrullah

Mitglied
Hallo zusammen,

wollte bei meiner Datenbank ein update ausführen wenn eine Datei nicht existieren sollte, sollte sie mit insert eingefügt werden leider macht er bei mir weder ein update noch versucht er die Funktion insert.



[CODE lang="java" title="Update /Insert"]public void kontrolle(String[] Aboziel){
Integer.parseInt(Aboziel[3]+1);

Connection con;
con= Erstelle_verbindung();




try {

System.out.println("systeme.ABoziele.aboZielzahlen()"+Aboziel[3]);


String query = "update abos set FirmenID = ?,Heftname = ?,HeftID = ?,Ausgabe = ?,Jahr = ?,ABOZiel = ? ";
PreparedStatement preparedStmt=con.prepareStatement(query);

preparedStmt.setInt (1,Integer.parseInt(Aboziel[0]));
preparedStmt.setInt (3,Integer.parseInt(Aboziel[2]));
preparedStmt.setInt (4,Integer.parseInt(Aboziel[3]));
preparedStmt.setInt (5,Integer.parseInt(Aboziel[4]));
preparedStmt.setString(6,Aboziel[5]);
preparedStmt.setString(2,Aboziel[1]);

preparedStmt.executeUpdate();

System.out.println("systeme.ABoziele.kontrolle(aaaaaaaaa)-----" +Aboziel[0]+"--FirmenID---"
+Aboziel[2]+"---HeftID---"
+Aboziel[3]+"---Ausgaben---"
+Aboziel[4]+"---Jahr---"
+Aboziel[5]+"---ABOZiel---"
+Aboziel[1]+"--Heftname---");
System.out.println("systeme.ABoziele.kontrolle(query)"+query);
if(query == null){
System.out.println("systeme.ABoziele.kontrolle(null) ---"+Aboziel[3]);
Statement stmt = con.createStatement();
stmt.executeUpdate("INSERT INTO abos(FirmenID, Heftname, HeftID, Ausgabe, Jahr, ABOZiel) VALUES "

+ "('" + Integer.parseInt(Aboziel[0]) //MitarbeiterId
+ "','" + Aboziel[1] //DatenBanke // Abo = 1 // Anzeigen = 2 // EInzelhandel = 3
+ "','" + Integer.parseInt(Aboziel[2]) //Heftnamen
+ "','" + Integer.parseInt(Aboziel[3]) //FirmenID
+ "','" + Integer.parseInt(Aboziel[4])
+ "','" + Aboziel[5]+"')");


System.out.println("systeme.ABoziele.kontrolle(speichern)");
}



mySQL.schliesse_verbindung();


}catch(Exception e) {
System.out.println("firmen : Konnte keine Verbindung hergestellt werden");
e.printStackTrace();

}[/CODE]


danke um die schnelle Hilfe schonmal im Vorraus
 

LimDul

Top Contributor
Diese Zeile sieht nach kompletten Unfug aus:
Java:
        Integer.parseInt(Aboziel[3]+1);
Die macht auf jeden Fall nichts sinvolles.

Das Query sieht auch "interessant" aus - sicher das da keine Where-Bedingung fehlt? Du aktualisiert damit alle Zeilen in der Tabelle.

Java:
                               if(query == null){
Diese Bedingung kann nie true werden Wie soll query jemals null sein? Du hast oben einen String erzeugt und damit ist der Wert ungleich null.

Du musst schon das Ergebnis des Aufrufes abfragen. Siehe https://docs.oracle.com/en/java/jav...va/sql/PreparedStatement.html#executeUpdate()
Returns:
either (1) the row count for SQL Data Manipulation Language (DML) statements or (2) 0 for SQL statements that return nothing
Das heißt, wenn du 0 kommt gab es in der Tabelle keine Zeilen und es wurde nichts aktualisiert. Das wirst du eher prüfen wollen.

Und das Insert-Statement sollte ebenfalls ein PreparedStatement sein, so öffnet das Tür und Scheunentor für eine SQL-Injection und ist nicht mal syntaktisch korrekt, weil da komplett umschließende einfache Hochkommas um die Values drum sind, anstelle um jeden einzelnen.

Und eine Bitte - halte dich an Java Code Konvention:
* Parameter und Variablen klein (Aboziel => aboziel)
* Methoden im CamelCase und mit Kleinbucstaben beginne: Erstelle_verbindung => erstelleVerbindung

Eine sinnvolle Einrückung (entweder einheitlich mit Leerzeichen oder Tabs) macht den Code auch deutlich lesbarer - so sieht er ziemlich wirr und dahingekackt aus :)
 
M

Mart

Gast
1. verwende Prepared Statements aus Sicherheits/ übersichtlichkeits gründen
2. da weder das eine noch das andere ausgeführt wird hast du wahrschleinich einen sql error der sollte irgendwie abrufbar über stmt sein ka wie die methode heißt da steht drin welcher error passiert ist
3. deine Ifs werden nie ausgeführt vllt
 
M

Mart

Gast
Und das Insert-Statement sollte ebenfalls ein PreparedStatement sein, so öffnet das Tür und Scheunentor für eine SQL-Injection und ist nicht mal syntaktisch korrekt, weil da komplett umschließende einfache Hochkommas um die Values drum sind, anstelle um jeden einzelnen.
so ein query sieht halt einfach shceiße aus, ein prepared statement sieht schicker aus und ist übersichtlicher
 

Oneixee5

Top Contributor
MySQL kann INSERT und UPDATE in einem Statement durchführen, somit ist eine Verzweigung nicht notwendig.
SQL:
INSERT INTO ados
    (firmenid, ...<andere Spaltennamen>...)
VALUES
    (?, ...<? pro Spalte>...)
ON DUPLICATE KEY UPDATE
    <Spalte für Update> = ?,
    <Spalte für Update> = ?,
    <Spalte für Update> = ?;
 

Emrullah

Mitglied
danke für die schnelle Antwort an alle hatte viel unsinniges noch drinnen da ich viel probiert hatte.

@Oneixee5 danke für deine schritt weiße die hab ich eingebunden aber leider tut er mir immer wieder doppelt alles abspeichern

Java:
public void speichern(String[] Aboziel){
        
        
        
        Connection con;
                       con= Erstelle_verbindung();
                
                        try {
                            
                    
                      
            Statement stmt = con.createStatement();
                        stmt.executeUpdate("INSERT INTO abos(FirmenID, HeftID, Ausgabe, Jahr, ABOZiel, Heftname) "
                                + "VALUES"
                        + "('"  + Integer.parseInt(Aboziel[0])                                      //MitarbeiterId
                        + "','" + Integer.parseInt(Aboziel[2])                                          //Heftnamen
                        + "','" + Integer.parseInt(Aboziel[3]+1)                     //FirmenID
                        + "','" + Integer.parseInt(Aboziel[4])
                        + "','" + Integer.parseInt(Aboziel[5])
                        + "','" + Aboziel[1]+"')"
                                + "ON Duplicate KEY UPDATE "
                        + "ABOZiel="+Integer.parseInt(Aboziel[5])); 
                        
                            
            mySQL.schliesse_verbindung();
            
            
        }catch(Exception e) {
            System.out.println("firmen : Konnte keine Verbindung hergestellt werden");
                e.printStackTrace();
                
        }
        
    }
    
}


1640099674880.png

weißt du wo genau der Fehler liegt.
 
M

Mart

Gast
du kannst nicht auf einen einzigartigen key prüfen wenn der key nicht einzigartig ist du hast weder unique noch primary key modifier
 

Emrullah

Mitglied
@Mart
danke für deine Antwort

hab jetzt mir Primary key und Unique key getestet aber es wird immer wieder doppelt angelegt.

hab das noch nie gemacht, kann niemanden fragen bzw. Tipps erfragen und kenn mich leider nicht aus.

könntest du mir einen ungefähren Beispiel auflisten.

danke für deine mühe.
 
M

Mart

Gast
Java:
"ABOZiel="+Integer.parseInt(Aboziel[5]))
hier hast du keine Hochkommatas dh es wird IRGENDWAS gemahct deswegen musst du es mit prepared statements machen weil keiner solche Statements lesen kann
 

Emrullah

Mitglied
@Mart
danke für deine Antwort hab es rum probiert zum Schluss hab ich es mit einem Count gemacht wenn er und eine if schleife

und die String array hab ich rausgenommen und alles einzeln eingefügt.
so funktioniert es jetzt wie ich es wollte.


Java:
    public void kontrolle(int FirmenID,String Heftname,int HeftID,int Ausgabe,int Jahr,int Aboziele){
        
        
        Connection con;
                       con= mySQL.Aboziel_Erstelle_verbindung();
        
        
        int count =0;
                      
                        try {
                            
                      System.out.println("systeme.ABoziele.aboZielzahlen()");
                      
            
                            Statement stat = con.createStatement();
                                    ResultSet rs=stat.executeQuery("Select Count(ID),ID From abos Where "
                                                                        +" FirmenID ='"+ FirmenID
                                                                        +"'AND Heftname='"+ Heftname
                                                                        +"'AND Jahr='"+ Jahr
                                                                        +"'AND Ausgabe='"+Ausgabe+"'");
                                    
                                    if (rs.next())
                                    count =rs.getInt(1);
                                    int ID = rs.getInt(2);
                                    
                                    if(count!=0)
                                    {
                                        System.out.println("systeme.ABoziele.kontrolle(update)");
                                    String UpdateQuery  = "update abos set ABOZiel = ? Where ID =?";
                                    
                                    PreparedStatement preparedStmt2 = con.prepareStatement(UpdateQuery);
                                    preparedStmt2.setInt(1, Aboziele);                     
                                    preparedStmt2.setInt(2, ID);
                                    preparedStmt2.executeUpdate();
                                                }
                                    else{
                                        System.out.println("systeme.ABoziele.kontrolle(insert)");
                                        stat.executeUpdate("INSERT INTO abos(FirmenID, HeftID, Ausgabe, Jahr, ABOZiel, Heftname) "
                                            + "VALUES"
                                    + "('"  + FirmenID                          //FIrmenID
                                    + "','" + HeftID                          //HeftID
                                    + "','" + Ausgabe                           //Ausgabenummer
                                    + "','" + Jahr                              //Jahr
                                    + "','" + Aboziele                           //Aboziel
                                    + "','" + Heftname +"')");                 //Heftname
                                    }
                    
            mySQL.schliesse_verbindung();
            
            
        }catch(Exception e) {
            System.out.println("firmen : Konnte keine Verbindung hergestellt werden");
                e.printStackTrace();
                
        }

danke für eure Hilfe und den ganzen Tipps

Ps. ich weiß ich muss mein Programm etwas ordentlicher gestalten mit Beschriftung und Aufteilung
 
M

Mart

Gast
Ps. ich weiß ich muss mein Programm etwas ordentlicher gestalten mit Beschriftung und Aufteilung
nicht unbedingt, die namensgebung ist ok soweit

methoden in java schreibt man eher nicht wie schliesse_verbindung()
sondern mit camelCase dh -> schliesseVerbindung()

ist halt vkonvention in PL SQL , ABAP oder java static final konstanten schreibt man mit unterstrich

zweitens '" + Heftname +"' hier hängst du hinten und vorne anführungs zeichen an

was ist wenn ich jetzt böse bin und den string hef't übergebe

dann wirft die SQL datenbank einen fehler weil

'hef't');

-> unerwartetes Zeichen "t"

weil ich den string zerschossen habe

wenn ich noch böser bin

über gebe ich
hef';DELETE * FROM abos:

dann steht bei dir das statement bis statement...hef';DELETE * FROM abos;'
jetzt schmiert die datenbank bei dem letzten ' ab aber das delete from wird dennoch ausgeführt

falls es dich interessiert -> SQL injection

um es zu verhindern immer prepared Statements verwenden -> hast du erst einmal
 
M

Mart

Gast
Java:
executeQuery("Select Count(ID),ID From abos Where "
                                                                        +" FirmenID ='"+ FirmenID
                                                                        +"'AND Heftname='"+ Heftname
                                                                        +"'AND Jahr='"+ Jahr
                                                                        +"'AND Ausgabe='"+Ausgabe+"'");
das ist ein Normales Statement -> es wird so in die Datenbank übergeben und nacheinander interpretiert
wenn jemand wie oben beschrieben "blöde" string werte eingibt kann man den String so setzen und dann einfach alles zerschießen => shclecht

ein prepared statement ist zb

prepareStatement( "INSERT name INTO myTable VALUE ?")
=> hier ist plötzlich ein frage zeichen wieso?

prepared auf deutsch heißt "vorbereitet" = > der string wird oben übergeben und von der Datenbank übersetzt ( falls fehlerhaft schmierts da ab)
der befehl liegt dann genau so vor in der Datenbank => kann nicht mehr durch "blöde strings" manipuliert werden

das fragezeichen ist ein Platzhalter das musst du selber googlen

da der befehl vorliegt auf der datenbank kannst du sagen
=> auf das prepared statement setz den wert "bob" ein => datenbank nimmt den fertigen befehl und setzt fürs fragezeichen bob ein
=> jetzt übergibst du "bob2" => datenbank machts wieder ohne wieder zu übersetzen und zu parsen => ist jaschon passiert

du bist sicherer da keine manipulation mehr möglich ist + das einsetzen der fragezeichen ist einfach nach 5 min googlen
+ du bist ungefähr um faktor 10 shcneller wenn du 1mio befehle als prepared statements vs normale statements benutzt

FÜR test code brauchst du keine prepared statements aber alles was in "Produktion" kommt sollte mindestens prepared statement sein
 

Oneixee5

Top Contributor
Ein Count ohne Group By? Das ist nicht OK, es funktioniert vielleicht im Moment ... Auch die HeftID fehlt da irgendwie.
Zeig doch mal das DML der Tabelle, also den Bedehl "create table abos ..." oder wenigsten "desc abos". Offensichtlich benötigst du einen zusammengesetzten Primärschlüssel oder UNIQUE KEY.
Vermutlich muss das so aussehen:
SQL:
INSERT INTO abos
    (FirmenID, HeftID, Ausgabe, Jahr, ABOZiel, Heftname)
VALUES
    (?,?,?,?,?,?)
ON DUPLICATE KEY UPDATE
    ABOZiel = ?;
Es würde bestimmt auch helfen den Quellcode ordentlich zu formatieren. Eine IDE kann das auch für dich machen.
 
M

Mart

Gast
Java:
INSERT INTO abos
    (FirmenID, HeftID, Ausgabe, Jahr, ABOZiel, Heftname)
VALUES
    (?,?,?,?,?,?)
ON DUPLICATE KEY UPDATE
    ABOZiel = ?;
soweit iser ja noch nicht ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C JTable update mit MySQL Datenbank Java Basics - Anfänger-Themen 1
C No suitable driver found for jdbc:odbc:mysql Java Basics - Anfänger-Themen 8
Dimax In Java File (nicht in Java Projekt) mysql Driver importieren Java Basics - Anfänger-Themen 3
H Verbindungsprobleme BluJ und MySQL Java Basics - Anfänger-Themen 1
R Java mit MySQL - Verbindungsprobleme Java Basics - Anfänger-Themen 1
B Arquillian installieren - Maven, WildFly, MYSQL Java Basics - Anfänger-Themen 1
M Java Mysql ausführbare datei Java Basics - Anfänger-Themen 7
B MySQL (jdbc) -> connection liefert NULL Java Basics - Anfänger-Themen 3
J Java Verbindung mit mysql Datenbank Java Basics - Anfänger-Themen 3
J MySQL Datumsabfrage über ResultSet in Java-Servlet Java Basics - Anfänger-Themen 4
Dimax Programme ,als Text in MySql speichern Java Basics - Anfänger-Themen 7
R Keine Verbindung zu MySql über Netbeans Java Basics - Anfänger-Themen 15
R Input/Output Verbindung mit mySql-Datenbank Java Basics - Anfänger-Themen 9
Q-bert MYSQL-Eintrag Java Basics - Anfänger-Themen 2
J Sonderzeichenproblem bei Datenabfrage in MySQL Java Basics - Anfänger-Themen 6
F Java MySQL Java Basics - Anfänger-Themen 3
D zu viele MySQL Connections Java Basics - Anfänger-Themen 18
D MySQL Abfrage in JTable speichern Java Basics - Anfänger-Themen 43
D NPE beim laden von Daten aus MySQL Java Basics - Anfänger-Themen 9
D Eine MySQL Verbindung in mehreren Klassen Java Basics - Anfänger-Themen 8
D JTable Zeile wird nicht in MySQL gelöscht Java Basics - Anfänger-Themen 16
D Datum aus Swing in MySQL DB speichern Java Basics - Anfänger-Themen 22
B MySQL starten / stoppen -> Stoppen erzeugt neuen Prozess Java Basics - Anfänger-Themen 0
B MySQL Path bekommen Java Basics - Anfänger-Themen 40
P Brauche Hilfe bei ResultSet mit MySQL Java Basics - Anfänger-Themen 6
H JAva und MySQL Java Basics - Anfänger-Themen 1
S Best Practice MVC und große Datenmengen aus einer mySQL - Datenbank Java Basics - Anfänger-Themen 24
U Glassfish mit MySQL verbinden Java Basics - Anfänger-Themen 1
N Erste Schritte MySQL Tabelle in JList darstellen Java Basics - Anfänger-Themen 1
A Erste Schritte Verbindung zu MySQL Datenbank herstellen Java Basics - Anfänger-Themen 7
M Mysql "live" Ansicht Java Basics - Anfänger-Themen 10
W MySQL PreparedStatement query Problem Java Basics - Anfänger-Themen 10
K Classpath Mysql EclipseFehler? Java Basics - Anfänger-Themen 12
M Aktuelles Datum in MySQL speichern Java Basics - Anfänger-Themen 11
V Umlaute in mysql, antscript, powershell utf-8 Java Basics - Anfänger-Themen 7
H mysql brauche hilfe, wer kann eine (längere) aufgabe für mich erledigen Java Basics - Anfänger-Themen 2
S in MySQL Daten Bank speichern Java Basics - Anfänger-Themen 8
N mit Werten aus einer mysql datenbank in java rechnen Java Basics - Anfänger-Themen 17
T MySQL - Java Organisationsfrage Java Basics - Anfänger-Themen 4
S ArrayList in mysql Datenbank speichern Java Basics - Anfänger-Themen 6
B Mit Java-Programm Daten aus MySQL-Datenbank auslesen, lokal und nicht lokal. Java Basics - Anfänger-Themen 10
D Mysql ob feld existiert Java Basics - Anfänger-Themen 2
D Mysql schauen Name bereits existiert Java Basics - Anfänger-Themen 7
X MySQL - Query Java Basics - Anfänger-Themen 3
J JAVA zu unsicher für MYSQL? Java Basics - Anfänger-Themen 4
S JDBC MySQL Connector - Element mit ' eintragen? Java Basics - Anfänger-Themen 4
F Verbindung zu MySql Datenbank Java Basics - Anfänger-Themen 4
K In MySQL Select Variablen aus Java Programm benutzen Java Basics - Anfänger-Themen 8
N Java dateFormat und Mysql DateTime Java Basics - Anfänger-Themen 2
B Java MySQL Query ausgeben Java Basics - Anfänger-Themen 4
J Java JDBC MySQL Query Java Basics - Anfänger-Themen 6
S mysql-connector-java-*.jar, MySql ResultSet - Alle ROWs ausgeben? Java Basics - Anfänger-Themen 3
S Datentypen EclipseLink, Datumsformat für MySQL Java Basics - Anfänger-Themen 9
S Resultset Closed (Mysql) Java Basics - Anfänger-Themen 5
K MySQL, Classpath, Java, MAC OSX Java Basics - Anfänger-Themen 3
O HashMap<> in MySQL database speichern Java Basics - Anfänger-Themen 3
D Mysql Connection Close? Java Basics - Anfänger-Themen 14
M Java - MySQL (Eclipse Java EE Web Developers) Java Basics - Anfänger-Themen 4
D Frage MySQL Columnheader Java Basics - Anfänger-Themen 2
D Java mit Mysql Datenbank angebunden Java Basics - Anfänger-Themen 5
I Null - Wert bei Date (Mysql) Java Basics - Anfänger-Themen 2
D Verständnisfrage: Java und MySql Java Basics - Anfänger-Themen 3
P Applet und MySQL-Problem Java Basics - Anfänger-Themen 20
P Applet, Daten IO, MySql Java Basics - Anfänger-Themen 2
T MySQL-Dienst starten und stoppen aus Netbeans Java Basics - Anfänger-Themen 3
A Java und MySQL!!! Java Basics - Anfänger-Themen 3
Kasoki Java und MySQL ? Java Basics - Anfänger-Themen 4
S CSV-Datei einlesen und in MySql schreiben Java Basics - Anfänger-Themen 3
M mysql-connector-java-5.1.7-bin. jar in die umgebungsvariable installieren Java Basics - Anfänger-Themen 14
A Frage zu java und MySQL Java Basics - Anfänger-Themen 3
J MySQL Timestamp "lesbarer" gestalten Java Basics - Anfänger-Themen 6
J Fehler bei MySql Anbindung mit JDBC Java Basics - Anfänger-Themen 4
W MySQL Driver als Resource laden Java Basics - Anfänger-Themen 5
D MySQL Abfrage. keine Ahnung Java Basics - Anfänger-Themen 5
M 5 MySql Tabellen in JTable - variable TableHeader? Java Basics - Anfänger-Themen 2
K Verbindung zu MySQL Java Basics - Anfänger-Themen 4
G wie erfragt man die letzte ID in einer MySQL Datenbank ab? Java Basics - Anfänger-Themen 3
S MySQL - connection Java Basics - Anfänger-Themen 8
S Zyklisches abspeichern von Daten aus einr MySql Datenbank Java Basics - Anfänger-Themen 9
B Client - Server Verbindung über sockets mysql DB ansprechen? Java Basics - Anfänger-Themen 6
G simple suche in java - mysql Java Basics - Anfänger-Themen 10
G Java und mySQL Hilfethread Java Basics - Anfänger-Themen 12
W Java.mysql.date in GregorianCalender konvertieren Java Basics - Anfänger-Themen 2
W Aus Textfeld ein "MySQL Date" auslesen Java Basics - Anfänger-Themen 2
W Endlosscshleife bei MySQL Abfrage Java Basics - Anfänger-Themen 5
N Problem mit MySql und Java Java Basics - Anfänger-Themen 12
P mySQL Datenbanktreiber nutzen Java Basics - Anfänger-Themen 2
J Statement an MySQL Datenbank schicken Java Basics - Anfänger-Themen 4
S Tabelsorter von SUN, wie muss die MysQL Anbindung realisiert Java Basics - Anfänger-Themen 11
J Zugriff auf eine Mysql-DB unter Linux Java Basics - Anfänger-Themen 6
G Mysql escape // html untauglich machen Java Basics - Anfänger-Themen 3
X Java & MySQL Java Basics - Anfänger-Themen 7
D Datenbankprogrammierung mit MYSQL. Java Basics - Anfänger-Themen 7
F Daten in MySQL Tabelle schreiben Java Basics - Anfänger-Themen 9
P wie erzeuge ich ein java date und lade in die mysql datebank Java Basics - Anfänger-Themen 5
M JSP --> Verbindung zur MySQL Datenbank geht nicht ! HILFF Java Basics - Anfänger-Themen 7
G POI und MySQL Java Basics - Anfänger-Themen 2
G in eine Tabelle mit mySQL eine Zeile hinzufügen Java Basics - Anfänger-Themen 17
G MySQL Tutorial Java Basics - Anfänger-Themen 2
X 1 MySQL-Verbindung und viele Threads Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben