# Mit Java-Programm Daten aus MySQL-Datenbank auslesen, lokal und nicht lokal.



## bandy (26. Nov 2011)

Hallo,

ich habe ein Programm geschrieben, welches Daten aus MySQL-Datenbank ausliest und zwar lokal. D.h.  die MySQL-Datenbank liegt auf dem selben Rechner wo auch das geschriebene Programm und funktioniert auch. 
Ich moechte aber die Daten aus dieser MySQL-Datenbank mit selbem Programm von einem anderen Rechner im Netzwerk(ueber Router) zugreifen, oder auch ueber das Internet aus einem beliebigem Rechner, geht das?:bahnhof:

Welche Aenderungen muss ich im Programm vornehmen? Ich habe versucht statt "localhost" im Pfad die IP-Adresse des Zielrechners einzugeben und erzeugte eine JAR-Datei des Programms, welcher alle Libraries und externe JAR's hinzugefuegt wurden, aber es laeuft nicht. Kann da jemand mir weiterhelfen?


Hier der Quellcode:


```
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.border.TitledBorder;

public class GUI extends JFrame {
	private static final long serialVersionUID = 6468516705291496250L;
	private JTextArea feldEinlesen;
    private JButton einlesen, beenden;
	
	//Innere Klasse implementiert ActionListener
	class MeinListener implements ActionListener {
		@Override
        public void actionPerformed(ActionEvent e) { 
            if (e.getActionCommand().equals("lesen"))
            dateiLesen();
            if (e.getActionCommand().equals("ende"))
            System.exit(0);
    }
}
 
	//Kostruktor 
    public GUI(String titel) {
         super(titel);
         JPanel panelEinlesen, panelButtons;
		 panelEinlesen = panelEinlesen();
		 panelButtons = panelButtons();
		 setLayout(new GridLayout(2,1));
		 add(panelEinlesen);
		 add(panelButtons);
		 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		 setMinimumSize(new Dimension(700,500));
		 setResizable(false);
		 setVisible(true);		
    }
 
    //Methode fuer Panel des Einleseeditors
    private JPanel panelEinlesen(){
    	 JPanel tempPanel = new JPanel();
    	 feldEinlesen = new JTextArea();
    	 tempPanel.setLayout(new GridLayout(0,1,10,10));
		 tempPanel.add(new JScrollPane(feldEinlesen));
		 tempPanel.setBorder(new TitledBorder("MySQL-Datenbank einlesen:"));
    	 return tempPanel;
    }//Ende panelEinlesen()
    
    //Methode fuer Panel der Buttons
    private JPanel panelButtons(){
    	 JPanel tempPanel = new JPanel();
    	 einlesen = new JButton("Einlesen");
         einlesen.setActionCommand("lesen");
         beenden = new JButton("Beenden");
         
         beenden.setActionCommand("ende");
     
         MeinListener listener = new MeinListener();
         einlesen.addActionListener(listener);
         beenden.addActionListener(listener); 
 		 tempPanel.setLayout(new FlowLayout(FlowLayout.CENTER,100,50));
 		 tempPanel.add(einlesen);
 		 tempPanel.add(beenden);
		 tempPanel.setBorder(new TitledBorder("Buttons:"));
    	 return tempPanel;
    }//Ende panelButtons()
    
    
    //die Methode zum Lesen der Werte in der Datei
    private void dateiLesen() {
    	System.out.println("Methode 'dateiLesen()' aktiviert");
    ConnectExampleMySQL ce=new ConnectExampleMySQL();
   ce.mysqlConnect( "", "", "localhost");
   ce.query(); 
   ce.schliesenVerbindung();
    }//Ende dateiLesen()
    
	public static void main(String[] args) {
		new GUI("GUI_MYSQL");		
	}	
	
//Innere Klasse
	public class ConnectExampleMySQL extends Object{
		public String text;
		public Connection theConnection=null;
		private Statement stmt=null;
		private ResultSet result=null;
		public String textName;
		public void schliesenVerbindung(){	
			try{
				theConnection.close();
				System.out.println("\nVerbindung wieder geschlossen.");
			}catch(SQLException sqle){
				System.out.println("Fehler beim Schliessen.");
				System.exit(-1);
			}	
		}

		private void query() {
			try{
				stmt=theConnection.createStatement();
				result=stmt.executeQuery("SELECT vorname, nachname FROM angestellte ORDER BY nachname ASC");
				String nachname ;
				String vorname ;
				while(result.next()){
					nachname=result.getString("nachname");
					feldEinlesen.setText("");
					vorname=result.getString("vorname");
					textName=nachname;
					System.out.println("Nachname: "+nachname+"\n"+" Vorname: "+vorname+"\n");
					feldEinlesen.append(result.getString("nachname")+" "+result.getString("vorname")+"\n");
				}
			}catch(SQLException sqle){
				System.out.println("\nSQLException sqle");
			}		
		}//Ende Methode


		private void mysqlConnect(String userID, String password, String machineName) {
			if(theConnection==null){
				try {
					Class.forName("org.gjt.mm.mysql.Driver");
					String connectionURL="jdbc:mysql://"+machineName+":3306/dbdemo";
					theConnection=DriverManager.getConnection(connectionURL, userID, password);
				}catch (ClassNotFoundException cnfe) {					 System.out.println("ClassNotFoundException."+cnfe.getMessage());		
				}catch (SQLException sqle) {
					System.out.println("SQLException."+sqle.getMessage());		
				}
			}else{
					System.out.println("Die DB-Verbindung exestiert bereits.");	
			}		
		}//Ende Methode
}//Ende Innere Klasse
}
```


----------



## irgendjemand (26. Nov 2011)

nun ... der stacktrace wäre hier interessant ... denn es gibt mehrere fehlerquellen

ziel konnte nicht aufgelöst werden *bei dns*
ziel nicht gefunden / erreichbar
dienst läuft nicht
dienst hat annahme verweigert
falsche login-daten
fehlende rechte
etc ...

oder stacktrace können wir dir null weiterhelfen ..

ohne mir jedoch deinen code anzusehen vermute ich das es sicherheitseinstellungen auf dem jeweiligen remote-rechner sind die dir eine verbindung verweigern

die beliebsten sind

firewall blockiert verbindungen von außen
db-server wurde so eingestellt das er nur verbindungen von 127.0.0.1 zulässt
es gibt keinen user welcher im HOST-feld auf deinen externen zugriff eingestellt ist

in der regel wird dierektes verbinden nicht möglich sein da dies zu unsicher ist ...
falls verbinungen extern zugelassen werden werden diese meist mit SSL gesichert oder erfordern einen SSH-tunnel *wodurch der user wieder auf 127.0.0.1 beschränkt ist * / sein sollte**
auch kann es sein das der user-account ein client-zertifikat verlangt welches du nicht hast


----------



## Tomate_Salat (26. Nov 2011)

Afaik ist MySQL standardmäßig so eingestellt, dass es nur lokale Zugriffe zulässt. Insofern musst du erstmal die Einstellungen vom MySQL-Server ändern. Ich würde aber nicht direkt von einem fremden Rechner auf die Datenbank zugreifen. Ich würde hier einen Server schreiben und dazwischenschalten. Dann hast du nochmal eine Kontrollinstanz.


----------



## bandy (26. Nov 2011)

irgendjemand hat gesagt.:


> nun ... der stacktrace wäre hier interessant ... denn es gibt mehrere fehlerquellen
> 
> oder stacktrace können wir dir null weiterhelfen ..




Hier ist stack ...

[XML]ClassNotFoundException.org.gjt.mm.mysql.Driver
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at GUI_MySQL$ConnectExampleMySQL.query(GUI_MySQL.java:164)
	at GUI_MySQL$ConnectExampleMySQL.access$1(GUI_MySQL.java:161)
	at GUI_MySQL.dateiLesen(GUI_MySQL.java:129)
	at GUI_MySQL.access$0(GUI_MySQL.java:124)
	at GUI_MySQL$MeinListener.actionPerformed(GUI_MySQL.java:37)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$000(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
[/XML]


localhost habe durch IP des Zielrechners ersetzt


----------



## Tomate_Salat (26. Nov 2011)

Das Problem ist, dass er die Klasse nicht findet, deswegen lade dir mal (am besten von der offiziellen Seite) die jar und binde diese in deinen Classpath ein.


----------



## bandy (26. Nov 2011)

Tomate_Salat hat gesagt.:


> Afaik ist MySQL standardmäßig so eingestellt, dass es nur lokale Zugriffe zulässt. Insofern musst du erstmal die Einstellungen vom MySQL-Server ändern. Ich würde aber nicht direkt von einem fremden Rechner auf die Datenbank zugreifen. Ich würde hier einen Server schreiben und dazwischenschalten. Dann hast du nochmal eine Kontrollinstanz.



Weisst du wie man diese Standarteinstellung aendert? Ich verwende noch das MySQL Control Center  0.9.4-beta, dort ist eine Moeglichkeit unter "Server regestrieren" die IP des Rechners zu aendern, aber wenn ich es tue, dann habe ich Tomate_Salat  nichts geht mehr. 

Sonst finde ich da keine Moeglichkeit etwas zu aendern.


Und einen Server schreiben und dazwischen schalten, das kann ich noch nicht, wenn mir erklaerst genau wie das geht, vielleicht dann...:autsch:


----------



## TKausL (26. Nov 2011)

Tomate_Salat hat gesagt.:


> Das Problem ist, dass er die Klasse nicht findet, deswegen lade dir mal (am besten von der offiziellen Seite) die jar und binde diese in deinen Classpath ein.



Diesen Post nicht beachtet @TE?


----------



## irgendjamend (27. Nov 2011)

org.gjt.mm.mysql.Driver

sorry ... aber wenn ich DAS schon lesen kommt mir das kotzen

wie wäre es denn mal in der DOC nachzulesen

org.gjt.mm.mysql.Driver

ist lediglich eine klasse welche kompatibilität für ÄLTERE apps bereit stellt welche noch damit entweickelt wurden ... die aktuelle und generell IMMER zu verwendene klasse ist laut DOC : com.mysql.jdbc.Driver

aber was red ich hier ... dein Stack bewiest doch nur : zu unfähig um DOC zu lesen und noch unfähiger einen Stack zu lesen


CLASS NOT FOUND EXCEPTION -> KLASSE NICHT GEFUNDEN AUSNAHME *wörtlich übersetzt*

er kann die von dir angegebene Klasse *org.gjt.mm.mysql.Driver* NICHT FINDEN ...

man sollte schon des englischen mächtig sein wenn man programmiert *was man von kleinen 12 jährigen kindern wie dir scheinbar nicht verlangen kann ...*


----------



## bandy (27. Nov 2011)

irgendjamend hat gesagt.:


> org.gjt.mm.mysql.Driver
> 
> sorry ... aber wenn ich DAS schon lesen kommt mir das kotzen
> 
> ...




Hallo irgendjamend,

ich hoffe du hast dich ausgekozt, aber weisst du was, bevor du das naechste Mal damit beginnst und auch noch von englischer Sprache etwas zu verzaehlen, lerne erst besser Deutsch.
(Wenn ich das lesen was du schreiben mit deinen aussengelaender deutsch, oh je :lol::lol::lol

Was CLASS NOT FOUND EXCEPTION bedeuted, ist mir klar, aber warum und was ich genau und wie unternehmen soll, das ist mein Problem, wenn ich aber alles schon wuesste waere ich nicht da, dafuer ist mehr oder weniger der Forum da. Sinnlose Kritik und keine Abhilfe, ist alles was du kannst.
Und viel Spass beim  Kotzen!!!:lol::lol:


----------



## Marcinek (27. Nov 2011)

Hallo,

dein erster Schritt sollte es sein die Fehlermeldung in Google einzuegben:

ClassNotFoundException.org.gjt.mm.mysql.Driver - Google-Suche

Du brauchst den für dein DBMS benötigten jdbc connector und die korrekte Klasse. (siehe Posting) von ijemand.

Gruß,

Martin

P.S.:



> Sinnlose Kritik und keine Abhilfe, ist alles was du kannst.



Er hat diesmal beides gemacht ;D


----------



## bandy (27. Nov 2011)

Marcinek hat gesagt.:


> Hallo,
> 
> dein erster Schritt sollte es sein die Fehlermeldung in Google einzuegben:
> 
> ...



Danke allen die versucht haben zu helfen :toll::applaus::applaus:

Aber das Problem lag auf dem Rechner von wo aus die Abfrage startete an der JRE, diese habe ich deinstaliert und neue installiert und auf dem Zielrechner wo sich die MySQL-Datenbank befindet, musste in der Firewall ein Port geoeffnet werden und in MySQL-Control-Center unter Benutzerverwaltung neuer Benutzer mit entsprechenden Rechten hinzugefuegt, dann hat es gefunkt.

Es geht mit *org.gjt.mm.mysql.Driver* und auch mit *com.mysql.jdbc.Driver*

Tomate_Salat lag somit naeher, aber nicht beschrieben wie genau wo und was vorzunehmen.

Merci:toll:


----------

