MySQL Benutzer Login System mit Datenbank Informationen (Abfrage zu User ist auf DB gesichert)

Harry05

Bekanntes Mitglied
Aloha Leute,

ich habe drei Tabellen (siehe Anhang .png) diese beinhalten Profils 1:n Albums 1:n Tracks.



Der User muss sich erst Anmelden (es ist Klar, das das Password nicht im klar Text sein darf ,sonder von der Datenbank Verschlüsselt wird. Mit sha256() oder anderen(was die Datenbank so hergibt halt) und das man nur den Hash vergleicht zum Einlogen) nach dem sich Einlogen, wird er erst weiter geleitet. Erst jetzt in der nächsten Gui hat er Sicht auf seine eigenen Information über Alben und Tracks also den zugriff (Daaaaaa). Die automatisch Auswahl sind Alben im select feld. Die automatische Auswahl oder Start Auswahl zeigt in Excel ähnlichen Tabelle die Tracks Informationen. In select feld der Alben kann man nun die Alben auswählen mit Display von Tracks in Excel ähnlichen Tabelle.

Ich vermute, das es besser wäre, die Datenbank Verbindung so lange zu halten,bis man das Programm Schließt. Wegen dem Zeit aufwand der neu Erstellung der Verbindung und damit man nicht waren muss.

ich weiß wie man sich mit der Datenbank Verbindet und das es ein Conn gibt.



{

...

conn = DriverManager.getConnection(url,user,password);

}

Die Verbindung conn wird beim Schließen des Programms geschlossen ( Aufruf der Class Connection nähme getConn() = conn.close()) oder bei total Ausfall des Programms mit der shutdown Hook (Aufruf der Class Connection nähme getConn() = conn.close()).

(Eigene Idee)
Ich habe mir gedacht das ich den conn an das ProfileDaoImp ( =Class (was die Daten zusammen baut)) übergebe, ProfileDao ( =Interface) und mit Hilfe von ProfileBean( =Class (nur getter/setter drinen sind und mit Controller die Informationen herhole)) im Controller zuschneiden weiterbearbeite.

In einfachen Worten glaube ich, das das ist wie'ne Facebook Anmeldung, wo man im seinem Profil überall zugreifen kann im eigenen Profil halt zum Beispiel Bilder und Freunde... .

Ich suche ein Samariter der mir mal die Grundstruktur Programmieren kann da ich an diesem Problem schon 5 Monaten sitze mit I.net Recherche und kein voran kommen sehe, Grrrrrr.



Danke im voraus für die Hilfe
 

Anhänge

  • DatenbankBild.png
    DatenbankBild.png
    17,8 KB · Aufrufe: 133

mrBrown

Super-Moderator
Mitarbeiter
Soll das ne Web oder ne lokale Anwendung sein?


es ist Klar, das das Password nicht im klar Text sein darf ,sonder von der Datenbank Verschlüsselt wird. Mit sha256() oder anderen(was die Datenbank so hergibt halt) und das man nur den Hash vergleicht zum Einlogen
Das kann genauso gut die Applikation machen, mMn der bessere Weg.


Ich vermute, das es besser wäre, die Datenbank Verbindung so lange zu halten,bis man das Programm Schließt. Wegen dem Zeit aufwand der neu Erstellung der Verbindung und damit man nicht waren muss.
Man kann auch einen Connection-Pool nutzen, kommt ganz drauf an was es werden soll.

Ich habe mir gedacht das ich den conn an das ProfileDaoImp ( =Class (was die Daten zusammen baut)) übergebe, ProfileDao ( =Interface) und mit Hilfe von ProfileBean( =Class (nur getter/setter drinen sind und mit Controller die Informationen herhole)) im Controller zuschneiden weiterbearbeite.
Das kann durchaus der richtige Weg sein.

Ich suche ein Samariter der mir mal die Grundstruktur Programmieren kann da ich an diesem Problem schon 5 Monaten sitze mit I.net Recherche und kein voran kommen sehe, Grrrrrr.
Damit ist dir vermutlich kaum geholfen, wenn du das, was du da als Grundstruktur beschrieben hast, nicht hin bekommst, bekommst du auch alles weitere nicht hin ;)
Frag lieber hier bei konkreten Problemen.
 

Harry05

Bekanntes Mitglied
@mrBrown
Soll das ne Web oder ne lokale Anwendung sein?
Es soll eine Desktop Anwendung sein, die mit lokaler und Mysql Datenbanken arbeitet. Mit dem Gluon Framework mit Gui = MVC Pettern. Das mit der Lokalen Db kommt später, erst ein Schiff in den Hafen bringen. ;) wobei ich glaube die DAO und die (Interface,Bean) kann in der Lokale db mitzubenutzt werden, so das nur einmal Programmiert wird.(so das zwei Fliegen mit einer klappe schlagen kann) oder Hibernate.

Das kann genauso gut die Applikation machen, mMn der bessere Weg.
Ich verstehe nicht ganz mMn?? Es wird die Db Machen da habe ich schon Querys

=Sql Query zum einlogen oder einzeln(pwd und user)
Code:
SELECT * FROM profilst WHERE pwd=SHA1('1234') and name= 'admin';

=Sql benutzer speichern JA ich weiß sha1 ist veraltet aber mus nach ein neueren Hash suchen, was die mysql can und Lokale Db
Code:
INSERT INTO profilst (user, pwd) VALUES('Sebastian123', sha1('1234'));

hier verstehe ich es nicht warum man dass mit Irgendwas heshen soll, wenn man das password aus einer geheckten Db im webSeite endschlusseln kann
z.B-> https://hashkiller.co.uk/sha1-decrypter.aspx gibt viele seiten für hash oder eigenen hash entwickeln.(das ist eine andere story haha)


Man kann auch einen Connection-Pool nutzen, kommt ganz drauf an was es werden soll.
Es soll eine Desktop Programm sein, deswegen muss die Übertragung schnell von statten gehen(ich und die User hassen es zu warten :p ). Mit Lokal und Mysql Db deshalb denke ich über DAO nach Oder Hibernate und dynamischer Datenbank Verbindung es Gibt diesen oder diesen Db Link diesen oder diesen Port, dieses oder dieses Passwort. Ales von user frei eingebbar. ich habe gesehen das Hibernate das dynamisch kann mit was für eine Klasse kann ich nicht sagen. (hier auch erst mal ein schiff in den Hafen bringen) :p

Das kann durchaus der richtige Weg sein.
was ist den der nähste schritt Sensei @mrBrown nach den neusten Infos??

Damit ist dir vermutlich kaum geholfen, wenn du das, was du da als Grundstruktur beschrieben hast, nicht hin bekommst, bekommst du auch alles weitere nicht hin ;)
Frag lieber hier bei konkreten Problemen.

@mrBrown möchtest du den Überhaubt mein Sensei sein??? :D
 

mrBrown

Super-Moderator
Mitarbeiter
Das mit der Lokalen Db kommt später, erst ein Schiff in den Hafen bringen. ;) wobei ich glaube die DAO und die (Interface,Bean) kann in der Lokale db mitzubenutzt werden, so das nur einmal Programmiert wird.(so das zwei Fliegen mit einer klappe schlagen kann) oder Hibernate.
Die Datenbank tauschen sollte nicht mehr sein, als Pfad und Treiber anpassen ;)

Ich verstehe nicht ganz mMn?? Es wird die Db Machen da habe ich schon Querys

=Sql Query zum einlogen oder einzeln(pwd und user)
=Sql benutzer speichern JA ich weiß sha1 ist veraltet aber mus nach ein neueren Hash suchen, was die mysql can und Lokale Db

Lass es nicht die DB machen, sondern mach es in deiner Applikation. Da hast du freie Wahl und musst nicht den gemeinsamen Nenner aller DBs nutzen.

hier verstehe ich es nicht warum man dass mit Irgendwas heshen soll, wenn man das password aus einer geheckten Db im webSeite endschlusseln kann
z.B-> https://hashkiller.co.uk/sha1-decrypter.aspx gibt viele seiten für hash oder eigenen hash entwickeln.(das ist eine andere story haha)
Deshalb lass es deine App machen und nimm einen für Passwörter gedachten, zB BCrypt.
Es soll eine Desktop Programm sein, deswegen muss die Übertragung schnell von statten gehen(ich und die User hassen es zu warten :p ). Mit Lokal und Mysql Db deshalb denke ich über DAO nach Oder Hibernate und dynamischer Datenbank Verbindung es Gibt diesen oder diesen Db Link diesen oder diesen Port, dieses oder dieses Passwort. Ales von user frei eingebbar. ich habe gesehen das Hibernate das dynamisch kann mit was für eine Klasse kann ich nicht sagen. (hier auch erst mal ein schiff in den Hafen bringen) :p
Den ersten Satz hab ich noch verstanden, den Rest nur so halb. Wenn das aussagen soll, du möchtest dich jetzt noch nicht festlegen: Richtig so.

was ist den der nähste schritt Sensei @mrBrown nach den neusten Infos??
Dich nicht mit der DB rumschlagen, sondern erstmal den Rest drum herum.
Wie die Connection erstellt wird und wie das Passwort gehasht wird, kann man klären, nachdem der Rest geplant ist.
 

Harry05

Bekanntes Mitglied
@mrBrown
Die Datenbank tauschen sollte nicht mehr sein, als Pfad und Treiber anpassen
Es muss möglich sein zwischen den Zwei Db zu wählen, es hat ja nicht jeder Private Mann ein Datenbank Server. Die lokale db kann man auf ne externe Festplatte 3.5Zoll legen z.B Sqlite,Derby oder so aber eher Sqlite. Da her erst ein Schiff ins trockne bringen.

Lass es nicht die DB machen, sondern mach es in deiner Applikation. Da hast du freie Wahl und musst nicht den gemeinsamen Nenner aller DBs nutzen.
Eindeutig überzeugt

Deshalb lass es deine App machen und nimm einen für Passwörter gedachten, zB BCrypt.

1.
// https://mvnrepository.com/artifact/de.svenkubiak/jBCrypt
compile group: 'de.svenkubiak', name: 'jBCrypt', version: '0.4'
2.
Code:
public class BcryptHashingExample
{
    public static void main(String[] args) throws NoSuchAlgorithmException
    {
        String  originalPassword = "password";
        String generatedSecuredPasswordHash = BCrypt.hashpw(originalPassword, BCrypt.gensalt(12));
        System.out.println(generatedSecuredPasswordHash);
       
        boolean matched = BCrypt.checkpw(originalPassword, generatedSecuredPasswordHash);
        System.out.println(matched);
    }
}
Output:
$2a$12$WXItscQ/FDbLKU4mO58jxu3Tx/mueaS8En3M6QOVZIZLaGdWrS.pK
true

Habe ich hier so erstes 1/4 auf der Seite https://howtodoinjava.com/security/...password-hash-md5-sha-pbkdf2-bcrypt-examples/
3.
gensalt(12) sind die runden so ok oder nicht geht bis 31 Runden??

Den ersten Satz hab ich noch verstanden, den Rest nur so halb. Wenn das aussagen soll, du möchtest dich jetzt noch nicht festlegen: Richtig so.

DAO Oder Hibernate abwägen richtig. Eingabe von Port Dynamisch von verschiedenen usern, Dynamisch pwd von verschiedenen usern eingeben, Db Link Also
String url = "jdbc:mysql://"+hostname+":"+port+"/"+datenbankName+"?serverTimezone=UTC";
conn = DriverManager.getConnection(url,user,password);

kommt aus der Gui login über Controller b.z.w Property config.

Dich nicht mit der DB rumschlagen, sondern erstmal den Rest drum herum.
Wie die Connection erstellt wird und wie das Passwort gehasht wird, kann man klären, nachdem der Rest geplant ist.

Jetzt kommt der Rest
Profile anmelden
Java:
public class Main {

    public static void main(String[] args) {
       
        ProfileDao dao = new ProfileDaoImp();
        ProfileBean bean = new ProfileBean();
        System.out.println(dao.getBenutzer());
        System.out.println(bean.getBenutzer() + " bean");//hier will der name nicht rauskomen was das Bean irgend wie unnütz macht
       
       
       
    }

}

Java:
public class ProfileBean{
   
    private int id = -1;
    private String benutzer;
    private String password;
   
    public ProfileBean(){
       
    }
   
    public ProfileBean(int id, String benutzer, String password) {
        super();
        this.id = id;
        this.benutzer = benutzer;
        this.password = password;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getBenutzer() {
        return benutzer;
    }
    public void setBenutzer(String benutzer) {
        this.benutzer = benutzer;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

Java:
public interface ProfileDao {
   
    public int getId();
   
    public void setId(int id);
   
    public String getBenutzer();
   
    public void setBenutzer(String benutzer);
   
    public String getPassword();

    public void setPassword(String password);
}

Java:
public class ProfileDaoImp implements ProfileDao{

    @Override
    public int getId() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public void setId(int id) {
        // TODO Auto-generated method stub   
    }

    @Override
    public String getBenutzer() {
        // TODO Kommt null oder der name zurück
        return "Testbenutzer";
    }

    @Override
    public void setBenutzer(String benutzer) {
        // TODO Auto-generated method stub
    }

    @Override
    public String getPassword() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void setPassword(String password) {
        // TODO Auto-generated method stub
    }
}

Die Tabellen Album Kriegt das gleiche, so wie Track aber es mal muss das Album den Fremdschlüssel bekommen, aus Profil und das dauerhaft.

oder soll ich noch warten?? DAO oder Hibernat??
 

mrBrown

Super-Moderator
Mitarbeiter
Es muss möglich sein zwischen den Zwei Db zu wählen, es hat ja nicht jeder Private Mann ein Datenbank Server. Die lokale db kann man auf ne externe Festplatte 3.5Zoll legen z.B Sqlite,Derby oder so aber eher Sqlite. Da her erst ein Schiff ins trockne bringen.
Ja ich weiß, das ist genau das, was ich meinte. Wenn du es richtig umsetzt, muss man nicht mehr als den Pfad zur DB anpassen.
Der übliche Weg ist der gegensätzliche, erste lokale DB, dann Server.

Jetzt kommt der Rest
Ich hoffe mal nicht, dass das der gesamte Stand ist, den du bisher hast. Das ist so ... gar nichts...

@Thallius Also doch DAO das ich diese auch für Lokale Db nutzen kann?? ich muss es schaffen ein Programm 2 Db's.
Völlig egal ob Hibernate, DOA, blaundblub: Es geht immer, das unterschiedliche DBs anbindbar sind.

Auch wenn mich jetzt wieder Mr Brown zerreissen wird: Wenn du schnell willst dann vergiss Hybernate.
Und wenn du wirklich schnell sein willst, vergiss Java ;)
 

Harry05

Bekanntes Mitglied
@mrBrown
Ja ich weiß, das ist genau das, was ich meinte. Wenn du es richtig umsetzt, muss man nicht mehr als den Pfad zur DB anpassen.
Der übliche Weg ist der gegensätzliche, erste lokale DB, dann Server.
Java:
public class DatabaseConnection {
    private Connection conn;
    // Diese Eintraege werden zum
    // Verbindungsaufbau benoetigt Mysql.
    private final String hostname  = "localhost";
    private final String port = "3306";
    private final String dbname ="mydb";
    private final String user = "root";
    private final String password = "";

    public DatabaseConnection() {

            try {
                System.out.println("* Treiber laden");
                Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
            }
            catch (Exception e) {
                System.err.println("Unable to load driver.");
                e.printStackTrace();
            }
            try {
                System.out.println("* Verbindung aufbauen");
                String url = "jdbc:mysql://"+hostname+":"+port+"/"+dbname+"?serverTimezone=UTC"; //für MySql Db
                String url = "jdbc:sqlite:C:/sqlite/db/chinook.db";// für sqlite Db natürlich einer ausgeschalten

                conn = DriverManager.getConnection(url,user,password); //kann die lite Db auch Passwort und user anähmen??
            }
            catch (SQLException sqle) {
                System.out.println("SQLException: " + sqle.getMessage());
                System.out.println("SQLState: " + sqle.getSQLState());
                System.out.println("VendorError: " + sqle.getErrorCode());
                sqle.printStackTrace();
            }
    }
}

Ich hoffe mal nicht, dass das der gesamte Stand ist, den du bisher hast. Das ist so ... gar nichts...

ich habe auch die AlbenDao, AlbenDaoImp, AlbenBean, TrackDao,TrackDaoImp, TrackBean
wollte nur platz sparen


Völlig egal ob Hibernate, DOA, blaundblub: Es geht immer, das unterschiedliche DBs anbindbar sind.
Das heißt bei der Connection
Java:
String url = "jdbc:mysql://"+hostname+":"+port+"/mydb"+"?serverTimezone=UTC"; //für MySql Db
oder
String url = "jdbc:sqlite:C:/sqlite/db/chinook.db";// für sqlite Db
was ist mit den Treibern ? kann man irgendwie ein für beide benutzen ?? oder was ??
es gibt ein für sqlite eigenenen und mysql oder gibs das schon Universell?

Und wenn du wirklich schnell sein willst, vergiss Java ;)
reine Neugierde was soll ich anstatt nähmen?? c++ und Java Benchmark gemacht mit Primzahlen bissss mmmmm jaaaa weiß nicht mehr beide gleich schnell 0.001 ms unterschied.

wie sind den jetzt die schritte von 1 bis ...(erst die sqlite db ansprechen, das habe ich schon mal verstanden. Dann die Mysql das ist dann ein Klacks mit den vorgefertigten pattern aus sqlite)
 
Zuletzt bearbeitet:

mrBrown

Super-Moderator
Mitarbeiter
ich habe auch die AlbenDao, AlbenDaoImp, AlbenBean, TrackDao,TrackDaoImp, TrackBean
wollte nur platz sparen
Ja aber da ist doch überhaupt nichts an Logik vorhanden?

was ist mit den Treibern ? kann man irgendwie ein für beide benutzen ?? oder was ??
es gibt ein für sqlite eigenenen und mysql oder gibs das schon Universell?
Du musst beide im Projekt haben und entsprechend den richtigen Treiber laden.

reine Neugierde was soll ich anstatt nähmen?? c++ und Java Benchmark gemacht mit Primzahlen bissss mmmmm jaaaa weiß nicht mehr beide gleich schnell 0.001 ms unterschied.
Das war Spaß ;) Du kannst auch Hibernate ohne merkliche Verzögerung nutzen.

wie sind den jetzt die schritte von 1 bis ...(erst die sqlite db ansprechen, das habe ich schon mal verstanden. Dann die Mysql das ist dann ein Klacks mit den vorgefertigten pattern aus sqlite)
Erst die App fertig, dann die DB-Anbindung.
Warum wollen immer alle mit der Speicherung der Daten anfangen, das ist gefühlt das unwichtigste dabei...
 

Harry05

Bekanntes Mitglied
@mrBrown
Du musst beide im Projekt haben und entsprechend den richtigen Treiber laden.
Es wird vom registrieren oder Login Controller übergeben nähme ich mal an.

Ja aber da ist doch überhaupt nichts an Logik vorhanden?

Das mit der Logik bin ich mir nicht sicher hier ein paar Bilder vom Programm
  1. Die Projektstruktur sieht so aus wie auf dem Projektstruktur.PNG aus
  2. WelcomView.PNG von hier kommt man zu den login.png oder Registrieren.png
  3. von den login.png oder Registrieren.png kommt man zum dashboard.png
  4. im dashboard.png hat man eine Übersicht von vorhandenen Alben und deren Informationen, so wie die Tracks.
    in Tabelle Alben klickt man drauf und kriegt Infos über Tracks.

Java:
public class AlbumBean {

    private int id =-1;
    private String name;
    private String bandname;
    private String erscheinungsJahr;
    //profile_t_idprofile ist der Fremdschlüssel zu Profile
    private  int profile_t_idprofile;

    public AlbumBean() {
    }

    public AlbumBean(int id, String name, String bandname, String erscheinungsJahr, int profile_t_idprofile) {
        this.id = id;
        this.name = name;
        this.bandname = bandname;
        this.erscheinungsJahr = erscheinungsJahr;
        this.profile_t_idprofile = profile_t_idprofile;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getBandname() {
        return bandname;
    }

    public void setBandname(String bandname) {
        this.bandname = bandname;
    }

    public String getErscheinungsJahr() {
        return erscheinungsJahr;
    }

    public void setErscheinungsJahr(String erscheinungsJahr) {
        this.erscheinungsJahr = erscheinungsJahr;
    }

    public int getProfile_t_idprofile() {
        return profile_t_idprofile;
    }

    public void setProfile_t_idprofile(int profile_t_idprofile) {
        this.profile_t_idprofile = profile_t_idprofile;
    }
}

Java:
public interface AlbumDao {
    public int getId();
    public void setId(int id);
    public String getBenutzer();
    public void setBenutzer(String benutzer);
    public String getPassword();
    public void setPassword(String password);
}

Java:
public class AlbumDaoImp implements AlbumDao {

    public AlbumDaoImp() {
    }

    @Override
    public int getId() {
        return 0;
    }

    @Override
    public void setId(int id) {

    }

    @Override
    public String getBenutzer() {
        return null;
    }

    @Override
    public void setBenutzer(String benutzer) {

    }

    @Override
    public String getPassword() {
        return null;
    }

    @Override
    public void setPassword(String password) {

    }
}
Java:
public class ProfilBean {
    private int id = -1;
    private String benutzer;
    private String password;

    public ProfilBean(){

    }

    public ProfilBean(int id, String benutzer, String password) {
        super();
        this.id = id;
        this.benutzer = benutzer;
        this.password = password;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getBenutzer() {
        return benutzer;
    }
    public void setBenutzer(String benutzer) {
        this.benutzer = benutzer;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

Java:
public interface ProfilDao {

    public int getId();

    public void setId(int id);

    public String getBenutzer();

    public void setBenutzer(String benutzer);

    public String getPassword();

    public void setPassword(String password);
}
Hier habe ich es schon mal versucht
Java:
public class ProfilDaoImp implements ProfilDao {

    private String benutzer;
    private String password;
    private Connection conn;

    public ProfilDaoImp() {
    }

    @Override
    public int getId() {
        // Anfrage-Statement erzeugen.
        Statement query;
        int id=-1;
        try {
            query = conn.createStatement();

            // Ergebnistabelle erzeugen und abholen.
            String sql = "SELECT idProfile_t FROM user where benutzer = '"+benutzer+"' and password ='"+ password +"';";
            ResultSet result = query.executeQuery(sql);

            // Ergebnissätze durchfahren.
            while (result.next()) {
                id = result.getInt("idProfile_t");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return id;
    }


    @Override
    public void setId(int id) {
        // TODO Auto-generated method stub
    }

    @Override
    public String getBenutzer() {
        // TODO Kommt null oder der name zurück
        return "Testbenutzer";
    }

    @Override
    public void setBenutzer(String benutzer) {
        // TODO Auto-generated method stub
    }

    @Override
    public String getPassword() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void setPassword(String password) {
        // TODO Auto-generated method stub
    }
}

Java:
public class TrackBean {


    private int id =-1;
    private String titel;
    private String dauer;
    private boolean live;
    private int musikerAnzal;
    private int album_t_idAlbum;

    public TrackBean() {
    }

    public TrackBean(int id, String titel, String dauer, boolean live, int musikerAnzal, int album_t_idAlbum) {
        this.id = id;
        this.titel = titel;
        this.dauer = dauer;
        this.live = live;
        this.musikerAnzal = musikerAnzal;
        this.album_t_idAlbum = album_t_idAlbum;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitel() {
        return titel;
    }

    public void setTitel(String titel) {
        this.titel = titel;
    }

    public String getDauer() {
        return dauer;
    }

    public void setDauer(String dauer) {
        this.dauer = dauer;
    }

    public boolean isLive() {
        return live;
    }

    public void setLive(boolean live) {
        this.live = live;
    }

    public int getMusikerAnzal() {
        return musikerAnzal;
    }

    public void setMusikerAnzal(int musikerAnzal) {
        this.musikerAnzal = musikerAnzal;
    }

    public int getAlbum_t_idAlbum() {
        return album_t_idAlbum;
    }

    public void setAlbum_t_idAlbum(int album_t_idAlbum) {
        this.album_t_idAlbum = album_t_idAlbum;
    }
}

Java:
public interface TrackDao {

    public int getId();

    public void setId(int id);

    public String getTitel();

    public void setTitel(String titel);

    public String getDauer();

    public void setDauer(String dauer);

    public boolean isLive();

    public void setLive(boolean live);

    public int getMusikerAnzal();

    public void setMusikerAnzal(int musikerAnzal);

    public int getAlbum_t_idAlbum();

    public void setAlbum_t_idAlbum(int album_t_idAlbum);
}




Erst die App fertig, dann die DB-Anbindung.
Warum wollen immer alle mit der Speicherung der Daten anfangen, das ist gefühlt das unwichtigste dabei...
habe ich verstanden !!
 

Anhänge

  • Projektstruktur.PNG
    Projektstruktur.PNG
    19 KB · Aufrufe: 96
  • WelcomView.PNG
    WelcomView.PNG
    72,4 KB · Aufrufe: 137
  • login.PNG
    login.PNG
    37,9 KB · Aufrufe: 127
  • Registrieren.PNG
    Registrieren.PNG
    37,9 KB · Aufrufe: 118
  • dashboard.PNG
    dashboard.PNG
    39,3 KB · Aufrufe: 111

Harry05

Bekanntes Mitglied
Es wird vom registrieren oder Login Controller übergeben nähme ich mal an.
@mrBrown und das?
Das mit der Logik bin ich mir nicht sicher hier ein paar Bilder vom Programm
@mrBrown und das??
Hier habe ich es schon mal versucht
@mrBrown da habe ich mir mal mein Kopf gemacht ist das richtig??.

@mrBrown ich hab mir mal ein Tutorial gekauft bei Udemy, da macht er grade das Login in die Klasse vom Netbeans generierten Swing Projekt rein. Mit einem zweiten Fenster nach Login Fenster mit CRUD ?Pattern?. Mal kucken was er für design Pattern nimmt.
 

mrBrown

Super-Moderator
Mitarbeiter
Es wird vom registrieren oder Login Controller übergeben nähme ich mal an.
Besser vorher, wenn sich der Controller schon mit der Datenbank verbindet.

Das mit der Logik bin ich mir nicht sicher hier ein paar Bilder vom Programm
Die Bilder sagen halt absolut nichts aus, genauso wie die geposteten Klassen.
Mehr, als das Klassen existieren, sieht man daran nicht.

Hier habe ich es schon mal versucht

Die DAOs sehen ziemlich überflüssig aus. Die sollen keine merkwürdige Kopie der entsprechenden Bean sein, sondern die Beans zurück geben.

Du brauchst keine String getId(), sondern eher eine ProfileBean getById(String id).

Implementier die DAOs erstmal ohne Datenbank-Anbindung. Du kannst da zum Testen einfach erstmal ein passendes Objekte erstellen und zurückgeben, anstatt das Objekt aus der Datenbank zu laden.

Code:
class ProfilDaoMock {

List<ProfileBean> findAll() {
  return Arrays.asList(new ProfilBean("1", "user", "****"));
}

}

Dann kannst du erstmal den Rest entwicklen, und machst später die DB.
 

Harry05

Bekanntes Mitglied
@mrBrown
Besser vorher, wenn sich der Controller schon mit der Datenbank verbindet.
mmmm ist das nicht so das sich das DaoImp denn Conn nimmt ??https://www.tutorialspoint.com/design_pattern/data_access_object_pattern.htm aber ohne Login fungtion

Die DAOs sehen ziemlich überflüssig aus. Die sollen keine merkwürdige Kopie der entsprechenden Bean sein, sondern die Beans zurück geben.

Du brauchst keine String getId(), sondern eher eine ProfileBean getById(String id).

Implementier die DAOs erstmal ohne Datenbank-Anbindung. Du kannst da zum Testen einfach erstmal ein passendes Objekte erstellen und zurückgeben, anstatt das Objekt aus der Datenbank zu laden.

gib's da eine Webseite irgendwelche Informationen irgend was? Ich kriege noch ein Burnout ich komm einfach nicht voran bin in einer While(true) {Schleife}. habe keine Vorstellung wie das aussehen kann soll grrr
 

mrBrown

Super-Moderator
Mitarbeiter
mmmm ist das nicht so das sich das DaoImp denn Conn nimmt ??https://www.tutorialspoint.com/design_pattern/data_access_object_pattern.htm aber ohne Login fungtion
Ja, Daos brauchen die Connection.
Aber der Login braucht Daos, also muss der Treiber vorher festgelegt sein.

gib's da eine Webseite irgendwelche Informationen irgend was? Ich kriege noch ein Burnout ich komm einfach nicht voran bin in einer While(true) {Schleife}. habe keine Vorstellung wie das aussehen kann soll grrr
Joa, zB die von dir verlinkte: https://www.tutorialspoint.com/design_pattern/data_access_object_pattern.htm
 

Harry05

Bekanntes Mitglied
@mrBrown
Ja, Daos brauchen die Connection.
Aber der Login braucht Daos, also muss der Treiber vorher festgelegt sein.
Java:
public class ProfilDaoImp extends DatabaseConnection implements ProfilDao {

    private String benutzer;
    private String password;
    private Connection conn;
 
 

    public ProfilDaoImp() {
        this.conn = getConnection();  //kommt aus der Klasse DatabaseConnection oder soll es wirklich im controller extends seiin reicht es nicht hier??
    }
//hier kommen die billigen kopieren  der getter/setter weg der ProfilBean wie holen sich die bean die Informatonen in die get/setter??
  //was kommt stattdessen hin??
}

ja sie hat keine Datenbank und so mit keine Drei Tabellen und somit keine Beziehungen von 1:N und 1:n
 

mrBrown

Super-Moderator
Mitarbeiter
@mrBrown

Java:
public class ProfilDaoImp extends DatabaseConnection implements ProfilDao {

    private String benutzer;
    private String password;
    private Connection conn;
 
 

    public ProfilDaoImp() {
        this.conn = getConnection();  //kommt aus der Klasse DatabaseConnection oder soll es wirklich im controller extends seiin reicht es nicht hier??
    }
//hier kommen die billigen kopieren  der getter/setter weg der ProfilBean wie holen sich die bean die Informatonen in die get/setter??
  //was kommt stattdessen hin??
}

Zu erstem Kommentar: Keine Ahnung was du meinst.

Zu zweitem: Guck in das grad verlinkte Beispiel. Ein DAO hat niemand Setter und getter, sondern nur Methoden, um Beans zu laden.

was du brauchst ist zb eine ProfileBean getByName(String name), die dir das Profil mit dem übergeben Namen zurückgibt.

ja sie hat keine Datenbank und so mit keine Drei Tabellen und somit keine Beziehungen von 1:N und 1:n
Na und?
Erstmal das verstehen, dann den Rest.
 

Harry05

Bekanntes Mitglied
@mrBrown
Zu erstem Kommentar: Keine Ahnung was du meinst.
das ist die Connection oder wie man sich verbindet blablabla das wird für das erste vergessen bis ich die benötigten abfragen habe Dao bean interface.
class ProfilDaoMock {

List<ProfileBean> findAll() {
return Arrays.asList(new ProfilBean("1", "user", "****"));
}

}
warum muss ich alle finden ?? mir reicht doch nur einer bsw. der Name und Password da ich die Felder einzeln testen will in der Gui und die Primärschlüssel der in der anderen mysql Tabelle als Sekundärschlüssel ist
Zu zweitem: Guck in das grad verlinkte Beispiel. Ein DAO hat niemand Setter und getter, sondern nur Methoden, um Beans zu laden.
Der link ist schon mal der richtige Ansatz ??
 

mrBrown

Super-Moderator
Mitarbeiter
das ist die Connection oder wie man sich verbindet blablabla das wird für das erste vergessen bis ich die benötigten abfragen habe Dao bean interface.
Nicht bös gemeinte Frage, aber ist Deutsch deine Muttersprache oder ist Englisch vllt leichter?

warum muss ich alle finden ?? mir reicht doch nur einer bsw. der Name und Password da ich die Felder einzeln testen will in der Gui und die Primärschlüssel der in der anderen mysql Tabelle als Sekundärschlüssel ist
Das war auch nur ein Beispiel ^^
Wenn du niemals eine Liste aller Nutzer brauchst, brauchst du das nicht.

In meinem letztem Post steht aber auch ein Beispiel, das passt besser ;)
Der link ist schon mal der richtige Ansatz ??
Ja.
 

Harry05

Bekanntes Mitglied
@mrBrown
Nicht bös gemeinte Frage, aber ist Deutsch deine Muttersprache oder ist Englisch vllt leichter?
Wie meinst du das??
Das war auch nur ein Beispiel ^^
Wenn du niemals eine Liste aller Nutzer brauchst, brauchst du das nicht.
Warum machst du sowas ?? Mir was geben was ich nicht brauche und du weißt sicherlich was ich vorhabe und so !! grrr

also werde ich Schreiben wenn ich Profil fertig habe.
 

mrBrown

Super-Moderator
Mitarbeiter
Wie meinst du das??

Ob Deutsch deine Muttersprache ist. Manche deiner Sätze sind etwas schwer zu verstehen, zB der:
also werde ich Schreiben wenn ich Profil fertig habe.

Ich hab absolut keine Ahnung was du damit meinst.

Warum machst du sowas ?? Mir was geben was ich nicht brauche und du weißt sicherlich was ich vorhabe und so !! grrr
Öhm, weil ich nicht weiß, was dein Programm am Ende können muss und davon ausgegangen bin, dass du von so einem Beispiel zu dem transferieren kannst, was du brauchst.
 

Harry05

Bekanntes Mitglied
@mrBrown
Ob Deutsch deine Muttersprache ist. Manche deiner Sätze sind etwas schwer zu verstehen, zB der:
jaein bin halb Pole und halb Deutscher geboren hier 28 Jahr lang. Oder Verzweiflung oder ich habe selber keine Ahnung wie ich an die Frage rangehen soll die ich stelle.

Ich hab absolut keine Ahnung was du damit meinst.

da habe ich im Modulen oder Baukasten gedacht Profil ist halt (Profilbean,ProfilDao, ProfilDaoImp)

Öhm, weil ich nicht weiß, was dein Programm am Ende können muss und davon ausgegangen bin, dass du von so einem Beispiel zu dem transferieren kannst, was du brauchst.

Du musst dich anmelden können mit deinem Profil mit Password und namen kriegst den Primärschlüssel vom Profil 1:N. Alben die Tabelle hat Infos und ist auch 1:n. Mit Track diese diese haben auch Informationen. siehe Bild DatenbankBild.png
ups SORRY MEIN FEHLER HATTE FALSCHES DESHBOARD.PNG BILD ALS DESHBOARD.PNG Bild

guck dir mal das Bild Dashboard.png das richtige an da siehst du oben die Alben Tabelle man Klickt auf ein Album und sieht die Tracks. Unten die Tracks Tabelle mit Infos zum Track. aus dem Blumen Feld kommt ein Pop-up mit Test Track.
 

Anhänge

  • DatenbankBild.png
    DatenbankBild.png
    17,8 KB · Aufrufe: 77
  • dashboard.PNG
    dashboard.PNG
    59,7 KB · Aufrufe: 69

Harry05

Bekanntes Mitglied
@mrBrown
also das währe sozusagen meine Main Class und main Methode ein Testdami.
ich habe jetzt Modul Profile(interface, bean, Imp) in Modul ProfileLogin(interface, bean, Imp) geändert.
Java:
 ProfilLoginDao profilLoginDao = new ProfilLoginLoginDaoImp();

        ProfilLoginBean profilLoginBean = new ProfilLoginBean();

        System.out.println( profilLoginDao.getByName("Harry05"));

        System.out.println(profilLoginDao.getByPassword("Harry05"));

        profilLoginDao.getIdByPasswordName("Harry05","harry05");


        System.out.println(profilLoginBean.getId());//hier wollte ich die id vom profilLoginBean nähmen was profilLoginDao.getIdByPasswordName("Harry05","harry05"); übergeben hat profilLoginBean so das ich später auf die Alben zugreifen kann.

Java:
public interface ProfilLoginDao {

    public boolean getByName(String name);

    public boolean getByPassword(String password);

    public void getIdByPasswordName(String name, String password); // hier die Id für den User um später 1:n zu realisieren
}
Java:
public class ProfilLoginLoginDaoImp implements ProfilLoginDao {



    public ProfilLoginLoginDaoImp() {

    }

    @Override
    public boolean getByName(String name) {
        return true;
    }

    @Override
    public boolean getByPassword(String password) {
        return true;
    }


    @Override
    public void getIdByPasswordName(String name, String password) {
    //Bsp.
        ProfilLoginBean profilLoginBean = new ProfilLoginBean(1); //hier wahr die Idee das man die Information im Objekt profilLoginBean Speichert so das man im deshbord sich die Id Holen kann später.
    }
}

Java:
public class ProfilLoginBean {
    private int id = -1;

    public ProfilLoginBean() {
    }

    public ProfilLoginBean(int id) {
        this.id = id;

    }
    public int getId() {
        return id;
    }
}
Kann das sein das man die Beans nicht immer Braucht z.B brauche ich nicht Id zusetzen(setId)? Sondern nach Erforderlichkeit ??

Jetzt mal zum Ergebnis aus dem code

Java:
ProfilLoginDao profilLoginDao = new ProfilLoginLoginDaoImp();

        ProfilLoginBean profilLoginBean = new ProfilLoginBean();

        System.out.println( profilLoginDao.getByName("Harry05")); // = true weil noch keine Logik vorhanden sondern Statisch true als Rückgabeparameter gestetzt

        System.out.println(profilLoginDao.getByPassword("Harry05"));//true weil noch keine Logik vorhanden sondern Statisch true als Rückgabeparameter gestetzt


//Ab hier weiß ich nicht weiter
        profilLoginDao.getIdByPasswordName("Harry05","Harry05"); 


        System.out.println(profilLoginBean.getId()); // = return -1 was hier profilLoginDao.getIdByPasswordName("Harry05","Harry05"); eine 1 übergeben wurde an ProfilLoginBean Klasse.
 

mrBrown

Super-Moderator
Mitarbeiter
Bitte, bitte lies noch mal das von dir verlinkte durch.

Das du aus Profil ProfilLogin gemacht hast, bringt genau gar nichts.
Und die Methoden bringen genausowenige.

Das DataAccessObject bringt dir nichts, wenn es dir für einen Nutzernamen oder ein Passwort wahr oder falsch zurückgibt und genausowenig, wenn es void zurückgibt.
Was das machen sollte, ist für einen Nutzernamen das entsprechende Profil zurückgeben - was aus Nutzername, Password, und sonstigen Daten besteht.

Das steht alles in dem von dir verlinktem Tutorial - warum liest du das nicht?


So könnten Dao und Profil aussehen, die Implementierung musst du dir aber selbst überlegen:

Java:
interface ProfilDAO {
  Profile getByName(String name);
  void addProfile(Profile profile);
}

Java:
class Profile {
  String id;
  String name;
  String password;

  //Konstruktor, Getter, Setter
}
 

Harry05

Bekanntes Mitglied
@mrBrown
Das steht alles in dem von dir verlinktem Tutorial - warum liest du das nicht?
ich habe es mir durchgelesen, ich habe es nachgebaut ich verstehe es nicht und langsam verstehe ich nicht mehre warum ich das nicht verstehe, wenn ich das verstanden hätte Denkste hätte ich mir die mühe gemacht den Thread auf zumachen??? ich baue das nur was ich an Ideen bekomme zusammen.
Was das machen sollte, ist für einen Nutzernamen das entsprechende Profil zurückgeben - was aus Nutzername, Password, und sonstigen Daten besteht.
Nein der Nutzer soll sich nur authentisieren so dass er aus den andren 2 Tabellen seine Inforationen bekommt

also noch mal zum Link grrr
 

Harry05

Bekanntes Mitglied
@mrBrown
mir kam schon wieder eine Überlegung sollte ich nicht so was machen wie ProfileSignIn(Dao, Imp, Bean) ProfileLogin(Dao, Imp,Bean) ProfilReset(Dao,Imp,bean) anstatt das alles in Profil(Dao,Imp,Bean) zupacken? was ist besser? was nutzt man so kommerziell?? was ist gang und gebe ?
 

Harry05

Bekanntes Mitglied
@mrBrown da bin ich wieder

machen jetzt alles Sinn ??
Java:
public interface ProfilDao {

    public boolean isUserAlreadyExists(String userName);

    public void addUser(ProfilBean profilBean);

    public void updateUser(ProfilBean profilBean);

    public ProfilBean getUserByName(String userName);

    public void deleteUser(ProfilBean profilBean);

}

Java:
public class ProfilDaoImp implements ProfilDao{

    @Override
    public void addUser(ProfilBean profilBean) {

    }
    @Override
    public boolean isUserAlreadyExists(String userName) {
        return true;
    }
    @Override
    public void updateUser(ProfilBean profilBean) {

    }
    @Override
    public ProfilBean getUserByName(String userName) {
        return null;
    }
    @Override
    public void deleteUser(ProfilBean profilBean) {

    }

}

Java:
public interface AlbumDao {

    public List<AlbumsBean> loadAlbumsByUserId(int Userid);

    public void deleteAllAlbumsByUserId(int Userid);
}

Java:
public class AlbumsDaoImp implements AlbumDao {

    @Override
    public List<AlbumsBean> loadAlbumsByUserId(int id) {
        return null;
    }

    @Override
    public void deleteAllAlbumsByUserId(int Userid) {
      
    }
}
Java:
public interface TrackDao {

    public List<TracksBean> loadTracksByAlbumId(int albumId);

    public void deleteAllTracksByAlbumId(int AlbumId);

}

Java:
public class TracksDaoImp implements TrackDao{

    @Override
    public List<TracksBean> loadTracksByAlbumId(int id) {
        return null;
    }

    @Override
    public void deleteAllTracksByAlbumId(int AlbumId) {
      
    }
}
 
Zuletzt bearbeitet:

Harry05

Bekanntes Mitglied
@mrBrown ich habe jetzt auch etwas gemacht das ProfilDaoImp was mit den Methoden macht.
können sie mir Bitte weiter helfen??

Java:
import de.AlbenloginSystem.databaseConnaction.HibernateUtil;
import de.AlbenloginSystem.model.bean.ProfilBean;
import org.hibernate.Session;
import org.hibernate.Transaction;

import java.util.List;

public class ProfilDaoImp extends HibernateUtil implements ProfilDao{

    @Override
    public void addUser(ProfilBean profilBean) {
        Transaction trns = null;
        Session session = getSessionFactory().openSession();
        try {
            trns = session.beginTransaction();
            session.save(profilBean);
            session.getTransaction().commit();
        } catch (RuntimeException e) {
            if (trns != null) {
                trns.rollback();
            }
            e.printStackTrace();
        }
    }
    @Override
    public boolean isUserAlreadyExists(String userName) {
        List result = getSessionFactory().openSession()
                .createQuery("from ProfilBean where benutzer=:benutzer")
                .setParameter("benutzer", userName)
                .list();
        return !result.isEmpty();
    }
    @Override
    public void updateUser(ProfilBean profilBean) {
        Transaction trns = null;
        Session session = getSessionFactory().openSession();
        try {
            trns = session.beginTransaction();
            session.update(profilBean);
            session.getTransaction().commit();
        } catch (RuntimeException e) {
            if (trns != null) {
                trns.rollback();
            }
            e.printStackTrace();
        }
    }
    @Override
    public ProfilBean getUserByName(String userName) {
        return getSessionFactory().openSession()
                .createQuery("from ProfilBean where benutzer=:benutzer", ProfilBean.class)
                .setParameter("benutzer", userName)
                .uniqueResult();
    }

    @Override
    public void deleteUser(ProfilBean profilBean) {
        Transaction trns = null;
        Session session = getSessionFactory().openSession();
        try {
            trns = session.beginTransaction();
            session.delete(profilBean);
            session.getTransaction().commit();
        } catch (RuntimeException e) {
            if (trns != null) {
                trns.rollback();
            }
            e.printStackTrace();
        }
    }
}
 

Harry05

Bekanntes Mitglied
@mrBrown
  1. das anmelden und die Übergabe der Id so das man Alben aufrufen kann und durch die Alben die Tracks mit nur einer Connection.
  2. Dynamische Datenbank Anbindung zur local Db und Mysql Db.
    ich habe gedacht das man die hibernate.cfg.xml irgend wie beim laufendem Programm umschreiben kann nix da.
 

Harry05

Bekanntes Mitglied
@mrBrown
Was fehlt dir denn, um das hinzubekommen?
Also das ist was ich mir gedacht habe was im Controller Login passieren müsste.
Java:
 ProfilBean userByName = profilDao.getUserByName(userField.getText());

if (userByName.getPassword().equals(pwdField.getText()) && userByName.getBenutzer().equals(userField.getText())) {
            int id = userByName.getId();
            // TODO: id irgendwo zwischenspeichern
}

ich müsst auch die Conn Irgend wo zwischenspeichern, denn ich habe Erstmal so was gemacht na ja für das Profil das ist die erste connection.
Java:
public class ProfilDaoImp extends HibernateUtil implements ProfilDao

wenn ich so was mache
Java:
public class AlbumsDaoImp extends HibernateUtil implements AlbumDao
Dann müsste er sich doch erneut eine verbinden aufbauen und nutzt nicht die vorhandene nach meinem verstehen oder ?? es sollte im einem Fluss passieren und nur per Programm schließen b.z.w Shutdown hook schließen die conn.

wo kommt die Eine connection und die Profil id hin oder wie wird sie zwischen gespeichert??
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Datenbank vor unerlaubtem Zugriff durch Benutzer schützen Datenbankprogrammierung 3
I Oracle Wie ermitteln, welche Benutzer-(!)Tabellen in einer DB sind? Datenbankprogrammierung 1
K Mehrere Benutzer Datenbankprogrammierung 6
K H2 Datenbank Passwort durch Benutzer festlegen Datenbankprogrammierung 7
U Benutzer- und Rechteverwaltung Datenbankprogrammierung 5
S auf views anderer benutzer zugreifen Datenbankprogrammierung 2
G neue benutzer anlege in mysql Datenbankprogrammierung 3
W MYSQL Datenbank Login Android Datenbankprogrammierung 3
H suche eine Login system Bibliothek für Java Datenbankprogrammierung 5
D Login System Datenbankprogrammierung 2
B MySQL LogIn Daten im Code verstecken Datenbankprogrammierung 3
J SQLite Login Datenbank Datenbankprogrammierung 2
R MS-SQL Express Login-Problem Datenbankprogrammierung 8
B SQLite Java Login + Datenbankverbindung Datenbankprogrammierung 4
B Login MySQL - Sicher? Datenbankprogrammierung 2
TheKing login-abfrage Datenbankprogrammierung 2
V DatenBank mit Login und Passwort Datenbankprogrammierung 4
J Login Formular Datenbankprogrammierung 13
F Login per JDBC über PHP-Skript? Datenbankprogrammierung 4
G MySQL: Login-Problem: No suitable Driver Datenbankprogrammierung 13
I Belastet es das System zu sehr einen Timer jede 0.2 Sekunden eine DB Abfrage machen zu lassen? Datenbankprogrammierung 9
Chtonian Effizientes Query System für Wortnachschlagewerk Datenbankprogrammierung 9
D Welches System brauche ich? Datenbankprogrammierung 6
D An Access Datenbank andocken ohne sie beim System anzumelden Datenbankprogrammierung 3
P Geeignetes DB-System Datenbankprogrammierung 8
L System.currentTimeMillis() in AccessDB!? Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben