Announcement

Collapse
No announcement yet.

Getter/Setter

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Getter/Setter

    Hallo,

    auf Grund dessen, dass ich öfter darauf hingewiesen wurde, statt public Variablen mit getter/setter-Methoden zu arbeiten, hab ich das nun versucht - wie es aussieht mit wenig Erfolg. Es kommen zwar keine Fehlermeldungen mehr, aber wie es aussieht, wird der jdbc-Treiber nicht mehr gefunden, jedenfalls gibt es keine Verbindung mehr zur Datenbank.

    Verbindung.java:

    Code:
    package forms;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    
    public class Verbindung {
    
    	private Connection cn = null;
    	private PreparedStatement statement = null;
    	private ResultSet rs = null;
    	
        public Connection getCon(){
        	return cn;
        }
    
    	public void setCon(Connection cn) {
    		this.cn = cn;
    		System.out.println("cn: " + cn);
    	}
    	
    	public PreparedStatement getPrepStat(){
    		return statement;
    	}
    	
    	public void setPrepStat(PreparedStatement statement){
    		this.statement = statement;
    	}
    	
    	public ResultSet getRes(){
    		return rs;
    	}
    	
    	public void setRes(ResultSet rs){
    		this.rs = rs;
    	}
    }
    Ausschnitt aus Frame.java
    Code:
    	public static void main() {
    		
    		 /**
             * Datenbankverbindung herstellen
             */       
    		try{
    			Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");	
    			Verbindung verb = new Verbindung();
    			verb.setCon(DriverManager.getConnection("jdbc:sqlserver://localhost; databaseName = Lager; user = sa; password = xxx"));			
    			verb.setPrepStat((PreparedStatement)verb.getCon().createStatement());
    			System.out.println("Verbindung hergestellt.");
    		}catch(Exception ex){
    			System.out.println("Es kann keine Verbindung hergestellt werden: " + ex);
    		}
    		Login.login();
    	}
    Login.java:

    Code:
    /**
     * 
     */
    package forms;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.sql.PreparedStatement;
    
    import javax.swing.JOptionPane;
    
    public class Login {
    
    	public static void login() {		
    		
    		/**
    		 * Prüfen, ob Passwort richtig
    		 */
        
    		Frame.btAnmelden.addActionListener(new ActionListener(){
            	int count = 0;
            	public void actionPerformed(ActionEvent event){
            		if(event.getActionCommand().equals("Anmelden")){
            			
        				//Benutzername
            			String benName = Frame.txtBenName.getText();
            			benName = benName.trim();
            			System.out.println(benName);
            			try{
            				Verbindung verb = new Verbindung();
            				PreparedStatement statement = (PreparedStatement)verb.getCon().prepareStatement("SELECT nutz_name FROM nutzer WHERE nutz_name = ?");
            				statement.setString(1, benName);
            				verb.setRes(statement.executeQuery());
    
            				if (verb.getRes().next()) {
        						System.out.println("Nutzer");
        					}
        					else{
        						JOptionPane.showMessageDialog(null, "Sie sind kein Nutzer dieses Systems!", "Login", JOptionPane.OK_CANCEL_OPTION);
        						Frame.txtBenName.setText(null);
        					}
            			}catch(Exception ex){
            				System.out.println("Keine Verbindung: " + ex);
            			}		
            			
            			//Passwort
            			char[] pass = Frame.txtPass.getPassword();
            			String passStr = new String(pass);
            			passStr = passStr.trim();
            			System.out.println(pass);
        			
            			try{
            				Verbindung verb = new Verbindung();
            				PreparedStatement stmPass = (PreparedStatement)verb.getCon().prepareStatement("SELECT passwort FROM nutzer WHERE nutz_name = ?");
            				stmPass.setString(1, benName);
            				verb.setRes(stmPass.executeQuery());
            				if(verb.getRes().next()){
            					String passw = verb.getRes().getString(1);
            					passw = passw.trim();
            					if(count < 2){
           							if(passw.equals(passStr)){
           								System.out.println("Login erfolgreich");
           								Frame.login.setVisible(false);
           								//Frame.start1.setVisible(true);
           							}
           							else{
           								JOptionPane.showMessageDialog(null, "Sie haben ein falsches Passwort eingegeben!", "Login", JOptionPane.OK_CANCEL_OPTION);
           								count++;
           								System.out.println("Login nicht erfolgreich");
           							}
            					}
            					else{
            						JOptionPane.showMessageDialog(null, "Sie haben sich 3 Mal falsch angemeldet!", "Login", JOptionPane.OK_CANCEL_OPTION);
            						System.exit(0);
            					}
            				}
            			}catch(Exception ex){
            				System.out.println("Keine Verbindung: " + ex);
            			}	
            			
            		}
            	}
    		});
    		
    		Frame.btAbbrechen.addActionListener(new ActionListener(){
    			public void actionPerformed(ActionEvent event){
    				if(event.getActionCommand().equals("Abbrechen")){
    					System.exit(0);
    				}
    			}
    		});
    	}
    }

  • #2
    Debugge das Programm durch und du siehst woran es liegt
    Christian

    Comment


    • #3
      Eine seltsame Logik hast Du. Warum machst Du eine Klasse, die eine Verbindung abstrahieren soll, aber trotzdem von aussen noch mit allem notwendigen bestückt werden muss?

      Das anlegen und verwalten einer Connection sollte in der Klasse passieren. Du schreibst momentan nur einen Container ohne eigene Logik.

      Ausserdem (und darauf hab ich dich schon mal hingewiesen) speicherst Du schon wieder ResultSet und PreparedStatement Objekte in diesem Container. Mach das nicht. Diese Objekte werden bei Bedarf erzeugt und wieder freigegeben und nicht irgendwo mit einem undefinierten Zustand gespeichert.

      aber wie es aussieht, wird der jdbc-Treiber nicht mehr gefunden, jedenfalls gibt es keine Verbindung mehr zur Datenbank.
      Wie kommst Du darauf? Dann hättest Du eine ClassNotFound Exception bekommen müssen.

      Dim
      Zitat Tom Kyte:
      I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

      Comment


      • #4
        Diese Erkenntnis sollte beim debuggen gekommen sein...
        Christian

        Comment


        • #5
          Langsam versteh ich gar nichts mehr

          Überall wird mir erzählt ich soll keine public und/oder static Variablen nehmen. Ok, also hab ich es anders versucht und es ist auch nicht richtig.

          @Dimitri: Ich weiß nicht, was du damit meinst:
          Ausserdem (und darauf hab ich dich schon mal hingewiesen) speicherst Du schon wieder ResultSet und PreparedStatement Objekte in diesem Container. Mach das nicht. Diese Objekte werden bei Bedarf erzeugt und wieder freigegeben und nicht irgendwo mit einem undefinierten Zustand gespeichert.
          Inzwischen habe ich herausgefunden, dass die Verbindung mit einem einfachen Statement und nicht mit einem PreparedStatement aufgebaut wird. Aber beim Login kommt weiter eine NullPointerException und wie mir gesagt wurde, heißt das, ich zeige auf ein Objekt, dass nicht existiert. Aber wieso nicht?

          @Christian: Ich habe den Debugger benutzt, dadurch kam ich ja auf die Idee, dass irgendwas mit dem Treiber nicht stimmt.

          Comment


          • #6
            Überall wird mir erzählt ich soll keine public und/oder static Variablen nehmen.
            Du musst unterscheiden zwischen Variablen die innerhalb der ganzen Klasse verwendet werden sollen und deren Status über die gesamte Lebenszeit des Objektes erhalten werden soll und Variablen, die nur temporär in einer Methode verwendet werden.
            Erstere sollten private sein, damit sie nicht einfach von anderen manipuliert werden können und Du selbst den Zugriff von außen (falls überhaupt gewünscht) per getter und setter regeln kannst.
            Letzterer Variablentyp wird nur lokal in einer Methode deklariert und anschließend wieder weggeworfen (ggf. vorher natürlich noch Resourcen im finally Bock freigeben). Ein ResultSet oder ReparedStatement sind typische Beispiele von temporär genutzten Objekten. Eine Connection hingegen für eine Instancevariable, da Datenbankverbindungen im allgemeinen erhalten bleiben bis das Programm beendet wird oder sie längere Zeit nicht mehr benötigt werden.

            Inzwischen habe ich herausgefunden, dass die Verbindung mit einem einfachen Statement und nicht mit einem PreparedStatement aufgebaut wird.
            Du verwendest ja auch createStatement um dein PreparedStatement Objekt zu befüllen. Allerdings liefert diese Methode laut Doku ein Objekt vom Typ Statement.

            Aber beim Login kommt weiter eine NullPointerException und wie mir gesagt wurde, heißt das, ich zeige auf ein Objekt, dass nicht existiert.
            Bisher hast Du nichts von einer NullPointer Exception erwähnt. Wenn Du dir den Stacktrace ansiehst, kannst Du die Zeilennummer sehen wo es passiert, aber ich tippe mal drauf, dass es hier geschieht:
            Code:
            System.out.println(benName);
                    			try{
                    				Verbindung verb = new Verbindung();
                    				PreparedStatement statement = (PreparedStatement)verb.getCon().prepareStatement("SELECT nutz_name FROM nutzer WHERE nutz_name = ?");
                    				statement.setString(1, benName);
            Du legst ein Objekt Verbindung an und das wars. Wo wird hier das Connection Objekt angelegt mit dem Du dann das Statement Objekt erzeugen möchtest? Nirgends. Die DB Verbindung die Du in der main Methode aufbaust liegt in einem komplett anderen Objekt, dass keinerlei Daten mit der Instance von Verbindung in deiner Login Methode gemeinsam hat.

            Mein Tipp wäre, dass Du dich erstmal hiermit beschäftigst und zwar von Anfang an, dann erledigen sich viele Unklarheiten von selbst.

            Dim
            Zitat Tom Kyte:
            I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

            Comment


            • #7
              Danke erst mal...
              Das Problem ist einfach, dass ich keine Zeit mehr habe und in den verschiedensten Büchern lese, auch in diesem.
              Ich bin im Praktikum und das geht nur noch bis Ende Februar. Ich sollte eine Lagerverwaltung von FoxPro in Java + MSSQL umschreiben. Ich finde, dafür dass ich mir quasi alles selbst erarbeitet hatte, war ich gar nicht soooo schlecht. Aber es sind einige Fehler aufgetreten, die ich in meinem "alten" Code nicht finde. Also dachte ich, ok, dann nehme ich mir die ganzen Hinweise zu Herzen und überarbeite den Code komplett neu - hab jetzt also eine Menge Klassen schon fertig und will die nun "richtig" schreiben.
              Irgendwo fehlt mir dann einfach die Vorstellungskraft - ich meine, mir war ja von Anfang an klar, und auch meiner Chefin, dass ich mit Sicherheit keinen guten Code im ersten Anlauf schreibe, aber ich will das Projekt so gut wie möglich abschließen.
              Sorry, aber das musste ich jetzt los werden.

              Comment


              • #8
                Der Link von Dimitri auf das Buch sollte helfen. Es ist schon soetwas wie ein Referenzwerk
                Christian

                Comment

                Working...
                X