Strings aus einer Class in eine andere übergeben und aus dieser in eine mysql Datenbank schicken

Hallo. Auch ich bin neu auf der Insel namens „JAVA“…
Ich möchte gerne über einen „speichern“ Button Strings in eine andere Class übergeben und von dort aus in meine XAMPP (mysql) Datenbank speichern.
Ich habe jetzt 4 Tage und Nächte damit verbracht eine Lösung zu finden. Aber stehe noch alleine auf meiner Insel.
Bitte, Bitte helft mir… (für Dummies)

Danke im Vorraus…
Rico

Die Textfelder und Calenda auslesen und mit System.out.prinln funktioniert schoneinmal.
Ich möchte diese auber nicht nur ausgeben sondern in eine Datenbank schreiben…
Hier der Code vom Button:

private void BUTTON_anlegenActionPerformed(java.awt.event.ActionEvent evt) {                                               
    String BIA = TF_bia.getText();
    String Ansprechpartner = TF_ansprechpartner.getText();
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
    String DATEstart = dateFormat.format(DATE_startset.getDate());
    String DATEende = dateFormat.format(DATE_endeset.getDate());
    String Telefonnummer = TF_telefonnummer.getText();
    String Beschreibung = TF_beschreibung.getText();
    String Kürzel = TF_kürzel.getText();
    String Location = LOCATION_location.getText();

Variablennamen schreibt man klein bzw. im camelCase, und ohne_den_unterstrich, also wirklich ohneDenUnterstrich, und nur auf Englisch (und wenn du glaubst, dass das egal ist: Я так не думаю…)

Ansonsten ist es IMHO gut/sinnvoll/praktisch, das, was auf den Button-Klick hin gemacht werden soll, in eine eigene Methode zu packen.

Was genau dann am Ende gemacht werden soll, ist anhand des Codes nicht ganz klar. Etwas mehr code könnte helfen, eine hilfreiche(re) Antwort zu schreiben.

Danke schoneinmal für deine rasche Antwort…
Also. Die aus den Textfeldern und Date Choosern ausgelesenen Werte möchte ich mit dem Click auf den Button in meine Datenbank speichern. Die Datenbank ist verbunden und richtig angelegt.
Aus dem Netz habe ich die Information, dass ich eine Class erstellen soll die eine Verbindung zur Datenbank herstellt.
Ich glaube dass ich auch diesen Schritt schon abgearbeitet habe. Hier der Code von der Class Namens „DBzugriff“:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;



public class DBzugriff{
    public static void main(String[] args) throws Exception{
    
    // connection
    
    Connection conn = getMySqlConnection();
    
    //insert VA
   
    
    
    }
    
    void insertVA(Connection conn, String BIA, String Ansprechpartner, String DATEstart, String DATEende, String Telefonnummer, String Beschreibung,String Kürzel)throws Exception{
        PreparedStatement pst = conn.prepareStatement("insert into großer_saal (BIA, Ansprechpartner, Von, Bis, Beschreibung, Kürzel, Telefonnummer) values (?,?,?,?,?,?,?)"); 
            pst.setString(1, BIA);
            pst.setString(2, Ansprechpartner);
            pst.setString(3, DATEstart);
            pst.setString(4, DATEende);
            pst.setString(5, Telefonnummer);
            pst.setString(6, Beschreibung);
            pst.setString(7, Kürzel);
            pst.execute();
            pst.close();
            
        
        
    }
    public static Connection getMySqlConnection() throws Exception{
       Class.forName("com.mysql.cj.jdbc.Driver");
        
        return DriverManager.getConnection("jdbc:mysql://localhost:3306/lacaxion", "root", "");
        
    }
    
    
}

Sicher bin ich mir aber nicht. Außerdem möchte ich meine Daten aus der Class in dem sie herausgelesen werden an die Class „DBzugriff“ übergeben damit sie von dort aus in der Datenbank eingepflegt werden können.

Und genau das ist mein Problem für das ich mir Hilfe von euch erhoffe.

Dazu formuliere ich folgende Fragen, ich hoffe das trägt zum Verständniss bei:

  1. Stimmt es das man eine eigene Class für den Verbindungsaufbau zur Datenbank braucht,
    ist es sinnvoll dies zu machen? (Ich denke ja)

  2. Muss ich jede Variable über eine eigene Methode an die Class „DBzugriff“ übergeben oder
    kann ich nicht alle zusammen übergeben?

  3. Reicht es in der Class die die Verbindung zur DB aufbaut alle Befehle zu schreiben, oder
    muss in der Class mit dem Button auch ein Code stehen der die DB anspricht?

  4. Könnte mir jemand bitte ein bsp. Code zeigen der mir erklärt was passiert?

Danke Jungs.

Ein DB-Experte bin ich nicht. Aber ich weiß, dass es „gute“ und „schlechte“ Möglichkeiten gibt, Dinge umzusetzen, und zwar auf allen Ebenen.

Ausschweifungen darüber, dass man sich genau klar machen sollte, wann und wo die DB-Verbindung aufgebaut und wieder geschlossen wird, dass man den Zugriff irgendwie konfigurieren können muss, dass das GUI nicht blockieren sollte, während man in die DB schreibt, und man UI-Code und IO-Code strikt trennen sollte, und 1000 andere Dinge, erspare ich dir jetzt mal.

(Der Punkt ist: „gute“ und „schlechte“ Möglichkeiten ist oft fast gleichbedeutend mit „schwierige“ und „einfache“ Möglichkeiten, und ich nehme an, dass es hier eher um letztere geht).

Ganz kurz zu den Punkten:

Stimmt es das man eine eigene Class für den Verbindungsaufbau zur Datenbank braucht,
ist es sinnvoll dies zu machen? (Ich denke ja)

Man könnte es auch ohne eigene Klasse machen, und den DB-Code direkt ins GUI klatschen. Aber das wäre dann so schlecht, dass ich sagen würde: Ja, eine eigene DB-Connection-Klasse ist sinnvoll. (Die konkrete Form deiner Klasse könnte man wieder hinterfragen, aber das lasse ich mal)

Muss ich jede Variable über eine eigene Methode an die Class „DBzugriff“ übergeben oder
kann ich nicht alle zusammen übergeben?

Du scheinst ja schon alle übergeben zu wollen: Die werden ja an insertVA übergeben…

Reicht es in der Class die die Verbindung zur DB aufbaut alle Befehle zu schreiben, oder
muss in der Class mit dem Button auch ein Code stehen der die DB anspricht?

Siehe oben: Ins GUI gehört kein DB-Code

Könnte mir jemand bitte ein bsp. Code zeigen der mir erklärt was passiert?

Ja, schwierig. Nochmal: Um das „gut“ zu machen, müßte man richtig viel Arbeit investieren (so viel, dass niemand bereit ist, die damit verbundenen Aufwände zu tragen - deswegen bekommt man heute als „richtiger“ Softwareentwickler keinen Job mehr, weil niemand 10 Stunden bezahlen will, für etwas, was man auch in 1 Stunde schnell runterrotzen kann).

Aber soweit ich das überblicke, wäre die einfachste (…) Möglichkeit, das Ziel zu erreichen, dass du in der actionPerformed eben schreibst:

BUTTON_anlegenActionPerformed(java.awt.event.ActionEvent evt) {
    String BIA = TF_bia.getText();
    /** alle anderen strings...*/
     ...
    try {
        Connection conn = DBzugriff.getMySqlConnection();
        DBzugriff.insertVA(conn, BIA, .... /** alle anderen strings...*/);
    } catch (Exception e) { // Sollte man NIE machen...
        e.printStackTrace();
    }
}

Nicht schön, aber sollte GROB so „funktionieren“

Hey. Ich finde es mega, dass es Leute gibt, die sich Mühe machen um anderen weiter zu helfen.
Danke schoneinmal für den Code, aber das Problem scheint woanders zu liegen.

Oder auch woanders… :wink:

Ich habe die Klasse die für die Verbindung zur DB zuständig ist auf nötigste bereinigt:

package loacaxion;
import java.sql.SQLException;
import java.sql.DriverManager;
import java.sql.Connection;
import javax.swing.JOptionPane;


public class DB { 
 
/**
 *
 * @param args
 * @throws SQLException
 * @throws java.lang.ClassNotFoundException
 * @throws java.lang.InstantiationException
 * @throws java.lang.IllegalAccessException
 */
public static void main(String[] args) throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException { 

try {
    String url = "jdbc:mysql://localhost:3306/lacaxion";
    Connection conn = DriverManager.getConnection(url, "root", "");
}
catch (Exception DB){
    JOptionPane.showMessageDialog(null, "fehlgeschlagen");
}
   

 } // ende: public static void main() 

} // ende: public class SimpleQuery 

Der versuch den Treiber zu laden wir mit ClassNotFoundException: com.mysql.jdbc.Driver
unterbrochen, bzw der Catch tritt ein…

grafik

Ich habe alle Möglichkeiten eines Ändern der Position in meinem Classpath durch.
grafik

Auch das Ändern und Anpassen der Driver Klasse habe ich durch.

  • com.mysql.cj.jdbc.Driver
  • com.mysql.jdbc.Driver

Beides ausprobiert, in allen erdenklichen Kombinationen der Ordnerstruktur…

grafik

Ich bin mit der DB verbunden und kann diese über den Service Reiter auch einsehen.

Egal was ich anstelle und wieviele Stunden ich investiere, ich komme einfach nicht weiter.

Als Randinformation: Ich benutze NetBeans 11.2
XAMPP 3.2.4
mysqlConnector 8.0.19

Danke nochmal für jeden der versucht mir zu helfen…

Danke

grafik

Egal wo ich den Treiber hinschiebe, nix…

Spontan könnte ich jetzt auch nur danach websuchen. Was ist das für eine IDE? Grundsätzlich sollte man einfach die JAR in den classpath legen, aber wer weiß, was da an der sonstigen Projektstruktur nicht stimmt. (Passiert das, wenn du aus der IDE raus startest, oder erst, wenn die ~„Anwendung fertig gebaut“ ist?)

Aus der IDE

Kann es evtl sein, dass es mit NetBeans 10.0 klappt?

Ich würde fast zum dritten mal von vorne starten.
Kann ich Klassen die ich in NetBeans 11.2 erstellt habe einfach in 10.0 importieren?

Oder muss ich von null anfangen?

„Aus der IDE“. Gut. Viel werde ich dir vermutlich nicht helfen können (bei so einer Antwort). Aber zur letzten Frage: Einer der Gründe, warum ich „Java-Fan“ bin, ist, das man heute seine Java-Klassen, die man 2002 unter 32bit Linux mit einem Texteditor geschrieben hat heute, 2020, in seine 64-bit Windows-IDE reinziehen kann, und sie compilieren. Einfach so. Immer. Garantiert. Also: Nein, du musst NICHT „bei null anfangen“.

Hatte es denn vorher funktioniert? Mir fällt auf dass in der aktuellen DB Klasse das Class.forName nicht drinne ist was du bei DBzugriff noch hattest.
Ansonsten, die Verbindung die du in NetBeans unter Services hast, ist unabhängig von dem was du letztendlich programmierst. Sprich NetBeans hat intern die Treiber alle bereit für sich aber nicht für das was du bastelst.

Habe die Lösung gefunden… Ich würde es hier erklären, aber das wäre unnütz… Wer auch Probleme damit hat sollte sich diesen Link anschauen und Schritt für Schritt nachmachen was dort steht. Ist für NetBeans…

Ich habe zu wenig Ahnung von der Materie um ausführlich weiterhelfen zu können. Stehe aber für Rückfragen selbstverständlich zur Verfügung…

https://netbeans.apache.org/kb/docs/ide/mysql.html

Achso, und ich habe wohl die falsche Applikations Version gewählt… (Keine Ahnung wie das wirklich heisst)

Ich hatte beim anlegen des Projekts JavaMaven ausgewählt. Damit hat es nicht funktioniert. Mit Java with Ant hat es dann schließlich geklappt… Nur fals es Jemanden interessiert… Handelt es sich dabei um diese mysteriöse IDE?

Es ist etwas verworren, der Artikel scheint sich (nach grobem Überfliegen) darum zu drehen sich mit einer Datenbank aus NetBeans herraus zu verbinden und dann verschiedene Tools zu benutzen, was aber nicht nach dem klingt was du eigentlich machen wolltest (deswegen bin ich mir auch nicht sicher wie dir der Artikel geholfen hat, aber wenn dann umso besser).

Nein bei Ant und Maven handelt es sich nicht um die IDE, beides sind Buildsysteme (wie Gradle).
Letztendlich könnte es mit Ant besser gelaufen sein, weil dort die Bibliotheken usw. anders/offener am Ende mit eingebunden werden.

Aber dein Problem mit der ClassNotFoundException dürfte (jetzt mit dem Hinweis auf Maven) daran gelegen haben, dass du die Abhängigkeit in der pom.xml nicht angebeben hast.
Maven ist es egal ob du irgendwo Jars hinschiebst (es kann sein das Ant die Berücksichtigt).

Für Maven hätte das z.b. so ausgesehen

<dependencies>
  <dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>8.0.19</version>
  </dependency>
</dependencies>

Ich bin immer öfter tief beeindruckt, wie tief doch das Wissen und das Verständis über Programmiersprachen bein so einigen Leuten verankert ist…
Ich bin ein totaler Anfänger aber verliere mich immer mehr darin. Es ist sehr oft sehr frustrierend, stundenlang zu recherchieren, ohne Erfolg. Tagelang an einer Kleinigkeit zu verbringen weil das Basiswissen fehlt. Um so schöner, dass sich Leute die Zeit nehmen anderen bei der Lösung ihrer Probleme zu helfen. Vielen Dank an Alle…