JDBC mit Swing und mehrereb Klassen

psychoDe

Grünschnabel
hallo leute,

ich bin grad dabei eine oberfläche aufzubauen, mit der ich an einer kleinen datenbank rumspielen kann (projekt fürs studium).

jetzt hab ich aber das problem das ich nicht weiss ob ich mit jdbc auch klassenübergreifend arbeiten kann. habe im netz nur beispiele mit einer klasse gesehen und da ich absolut null ahnung von jdbc habe weiß ich es leider auch nicht besser und hoffe hier hilfe zu finden.

ich zeig euch mal meine kleine gui, dann wisst ihr bestimmt sofort worum es geht:

Das ist meine main. hier bau ich das fenster mit den tabs auf und erstelle die verbindung

Code:
public class Dbs extends JPanel{
	private static final long serialVersionUID = 1L;

	static JFrame f;	
	Connection con = null;
	Erzeuger e = new Erzeuger();
	
	Dbs(){
		super(new GridLayout(1, 1));
		JTabbedPane tabbedPane = new JTabbedPane();
		tabbedPane.addTab( "Insert Student", null, e.ps, "Student"); 
		tabbedPane.addTab( "Insert Professor", null, e.pp, "Professor");
		add(tabbedPane);	
	}
	
	public static void main(String[] args){
		f = new JFrame("Datenbanken");
		f.add(new Dbs());
		f.setVisible(true);
		f.pack();
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		try 
	    { 
	      Class.forName( "oracle.jdbc.driver.OracleDriver" ); 
	    } 
	    catch ( ClassNotFoundException e ) 
	    { 
	      System.err.println( "Keine Treiber-Klasse!" ); 
	      return; 
	    } 
	 
	    Connection con = null; 
	 
	    try 
	    { 
	      con = DriverManager.getConnection( "jdbc:oracle:thin:@host:1243:database;shutdown=true", "urganci", "" ); 
	      Statement stmt = con.createStatement(); 
	 
//	      stmt.executeUpdate( "INSERT INTO CUSTOMER VALUES(50,'Christian','Ullenboom', 
//	                           'Immengarten 6','Hannover')" ); 
	 
	      ResultSet rs = stmt.executeQuery( "SELECT * FROM Customer" ); 
	 
	      while ( rs.next() ) 
	        System.out.println(" %s, %s %s%n, rs.getString(1), rs.getString(2), rs.getString(3) "); 
	 
	      rs.close(); 
	 
	      stmt.close(); 
	    } 
	    catch ( SQLException e ) 
	    { 
	      e.printStackTrace(); 
	    } 
	    finally 
	    { 
	      if ( con != null ) 
	        try { con.close(); } catch ( SQLException e ) { e.printStackTrace(); } 
	    }
	}
}

das ist (werden aber noch mehr klassen) meine 2. klasse. hier werden die einzelnen tabs inhaltlich aufgebaut und ein button soll dann einen ActionEvent ausführen, der dann so aussieht das er eine sql abfrage durchführt....

MEINE FRAGE: Geht das? kann ich in anderen klassen die bereits geöffnete verbindung nutzen? sorry wenns ne absolut blöde frage ist aber ich hab überhaupt kein plan davon.
Code:
import java.awt.*;
import java.awt.event.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.swing.*;

public class Erzeuger {

	JPanel ps = new JPanel();
	JPanel pp = new JPanel();
	JPanel pf = new JPanel();
	JTextField studentvn = new JTextField(20);	
	JTextField studentnn = new JTextField(20);
	JTextField studentiw = new JTextField(20);
	JTextField profnn = new JTextField(20);	
	JTextField profku = new JTextField(20);
	JTextField profiw = new JTextField(20);
	JButton studb = new JButton("OK");
	JButton profb = new JButton("OK");
	
	Erzeuger(){
		erzeugeStud();
		erzeugeProf();
		}
	
	public void erzeugeStud(){
		ps.setLayout(new GridLayout(4, 0, 6, 3));
		ps.add(new JLabel("Name: ")); 
	    ps.add(studentvn); 
	    ps.add(new JLabel("Vorname: ")); 
	    ps.add(studentnn); 
	    ps.add(new JLabel("irgendwas: ")); 
	    ps.add(studentiw);
	    studb.addActionListener(new ActionListener()
	    							{
	    								public void actionPerformed(ActionEvent e)
	    								{
//	    									try 
//	    								    { 
//	    									  Connection con = null;
//	    								      Statement stmt = con.createStatement(); 
//	    								 
////	    								      stmt.executeUpdate( "INSERT INTO CUSTOMER VALUES(50,'Christian','Ullenboom', 
////	    								                           'Immengarten 6','Hannover')" ); 
//	    								 
//	    								      ResultSet rs = stmt.executeQuery( "SELECT * FROM Customer" ); 
//	    								 
//	    								      while ( rs.next() ) 
//	    								        System.out.println(" %s, %s %s%n, rs.getString(1), rs.getString(2), rs.getString(3) "); 
//	    								 
//	    								      rs.close(); 
//	    								 
//	    								      stmt.close(); 
//	    								    } 
//	    								    catch ( SQLException se ) 
//	    								    { 
//	    								      se.printStackTrace(); 
//	    								    }
	    									System.out.println("Hallo button");
	    								}
	    							});
	    ps.add(studb);
	}
	
	public void erzeugeProf(){
		pp.setLayout(new GridLayout(4, 0, 6, 3));
		pp.add(new JLabel("Name: ")); 
	    pp.add(profnn); 
	    pp.add(new JLabel("Kürzel: ")); 
	    pp.add(profku); 
	    pp.add(new JLabel("irgendwas: ")); 
	    pp.add(profiw);
	    pp.add(profb);
	}

}
 
Hallo!
Ich würde Darstellungs- und Datenschicht trennen. Sprich für Die Datenbank eine eigene Klasse verwenden, welche die Connection aufbaut und die Möglichkeit bietet Queries auszuführen.
Von deiner JPanel Klasse aus rufst du dann nur noch die Methode zum Ausführen der Query auf.
Die Datenbank-Klasse kannst du dann nach dem Singleton-Pattern aufbauen, so hast du immer nur ein Objekt dieser Klasse am laufen.
mfg flo
 
so bitte schön die bearbeitete version:

Meine Main... ganz klein:

Code:
public class Dbs extends JPanel{
	private static final long serialVersionUID = 1L;

	static JFrame f;	
	Erzeuger e = new Erzeuger();
	
	Dbs(){
		super(new GridLayout(1, 1));
		JTabbedPane tabbedPane = new JTabbedPane();
		tabbedPane.addTab( "Insert Student", null, e.ps, "Student"); 
		tabbedPane.addTab( "Insert Professor", null, e.pp, "Professor");
		add(tabbedPane);	
	}
	
	public static void main(String[] args){
		f = new JFrame("Datenbanken");
		f.add(new Dbs());
		f.setVisible(true);
		f.pack();
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}

Mein Erzeuger.java für die einzelnen tabs der noch sehr groß werden wird.
hab hier drin jetzt ein object der klasse "Connect" der mir die verbindung herstellt und dann noch weitere methoden für die querys enthalten wird.

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Erzeuger {

	Connect conn = new Connect();
	JPanel ps = new JPanel();
	JPanel pp = new JPanel();
	JPanel pf = new JPanel();
	JTextField studentvn = new JTextField(20);	
	JTextField studentnn = new JTextField(20);
	JTextField studentiw = new JTextField(20);
	JTextField profnn = new JTextField(20);	
	JTextField profku = new JTextField(20);
	JTextField profiw = new JTextField(20);
	JButton studb = new JButton("OK");
	JButton profb = new JButton("OK");
	
	Erzeuger(){
		erzeugeStud();
		erzeugeProf();
		}
	
	public void erzeugeStud(){
		ps.setLayout(new GridLayout(4, 0, 6, 3));
		ps.add(new JLabel("Name: ")); 
	    ps.add(studentvn); 
	    ps.add(new JLabel("Vorname: ")); 
	    ps.add(studentnn); 
	    ps.add(new JLabel("irgendwas: ")); 
	    ps.add(studentiw);
	    studb.addActionListener(new ActionListener()
	    {
	    	public void actionPerformed(ActionEvent e)
	    	{
	    		conn.alleNotenVon();
	    	}
	    });
	    ps.add(studb);
	}
	
	public void erzeugeProf(){
		pp.setLayout(new GridLayout(4, 0, 6, 3));
		pp.add(new JLabel("Name: ")); 
	    pp.add(profnn); 
	    pp.add(new JLabel("Kürzel: ")); 
	    pp.add(profku); 
	    pp.add(new JLabel("irgendwas: ")); 
	    pp.add(profiw);
	    profb.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				conn.alleNotenVon();
			}
		});
	    pp.add(profb);
	}
}

und hier meine Connect.java, der mir immer ein "Keine Treiber-Klasse!" ausgibt..:

Code:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


public class Connect {
	
	public Connect()
	{
		try
		{
			Class.forName("oracle.jdbc.driver.OracleDriver"); 
		}
		catch ( ClassNotFoundException e ) 
		{
			System.err.println( "Keine Treiber-Klasse!" ); 
			return; 
		}
		
		Connection con = null;
		
		try
		{
			con = DriverManager.getConnection( "jdbc:oracle:thin:@172.25.32.11:1521:p001","username", "passwort"); 
			Statement stmt = con.createStatement(); 
 
	//      stmt.executeUpdate( "INSERT INTO CUSTOMER VALUES(50,'Christian','Ullenboom', 
	//                           'Immengarten 6','Hannover')" ); 
			
			ResultSet rs = stmt.executeQuery( "SELECT * FROM Customer" ); 
			
			while (rs.next())
				System.out.println(" %s, %s %s%n, rs.getString(1), rs.getString(2), rs.getString(3) "); 
			
			rs.close();
			stmt.close(); 
		}
		catch ( SQLException e ) 
		{
			e.printStackTrace(); 
		} 
		finally 
		{ 
			if ( con != null ) 
				try { con.close(); } catch ( SQLException e ) { e.printStackTrace(); } 
		}
	}
	
	public void alleNotenVon(){
		
	}
}

ist das so in ordnung

wenn ich es so gelassen hätte wie es war.. wäre es dann nicht gelaufen
 
Zurück