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

bandy

Bekanntes Mitglied
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:

Java:
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
}
 
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
 
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.
 
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
 
Zuletzt bearbeitet:
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.
 
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:🙁🙁
 
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 ...*
 
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 ...*


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:😀
 
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.:



Er hat diesmal beides gemacht ;D

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:
 

Zurück
Oben