Verbindung zu MySQL

Status
Nicht offen für weitere Antworten.

Kris

Bekanntes Mitglied
Hallo!

Erstmal sah mein Code für ein DAO so aus.

Code:
public class PersonDAO {
	
	Connection con;
	Statement stmt;
	
	public PersonDAO(){
		con = getConnection();
	}
	
	public Connection getConnection(){
		
		Connection con=null;
		MysqlDataSource mds = new MysqlDataSource();
 		mds.setServerName("localhost");
 		mds.setPort(3306);
 		mds.setDatabaseName("java");
 		mds.setUser("root");
 		mds.setPassword("router");
		try{
			con = mds.getConnection();
		}
		catch(Exception e){
			e.printStackTrace();
		}
		return con;
	}
	
	public List<Person> selectAll(){
		String abfrage = "Select * From tblPerson";
		List<Person> result = new ArrayList<Person>();
		try{
			ResultSet rs = con.createStatement().executeQuery(abfrage);
			while(rs.next()){
				Person nextPer = new Person();
				nextPer.setID(rs.getInt("ID"));
				nextPer.setNachname(rs.getString("Nachname"));
				nextPer.setVorname(rs.getString("Vorname"));
				nextPer.setGeburtsdatum(rs.getDate("Geburtsdatum"));
				result.add(nextPer);
			}
		}
		catch(SQLException e){
			e.printStackTrace();
		}
		
		return result;
	}


Hier war das Problem, dass sobald etwas in View verändert wurde und diese Änderung in MySQL eingetragen werden sollte, mehrere Verbindungen aufgebaut wurden. Nachdem ich den umgeändert habe wurde nur eine Aufgebaut. Nun sieht der Code ungefähr so aus. Also Connection als Variable nicht als Methode.

Code:
import java.sql.*;
import java.sql.Date;
import java.util.*;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

public class PersonDAO {
	
	Connection con;
	Statement stmt;
	
	public PersonDAO(){
		con = getConnection();
	}
	
	public Connection getConnection(){
		
		Connection con=null;
		MysqlDataSource mds = new MysqlDataSource();
 		mds.setServerName("localhost");
 		mds.setPort(3306);
 		mds.setDatabaseName("java");
 		mds.setUser("root");
 		mds.setPassword("router");
		try{
			con = mds.getConnection();
		}
		catch(Exception e){
			e.printStackTrace();
		}
		return con;
	}
	
	public List<Person> selectAll(){
		String abfrage = "Select * From tblPerson";
		List<Person> result = new ArrayList<Person>();
		try{
			ResultSet rs = con.createStatement().executeQuery(abfrage);
			while(rs.next()){
				Person nextPer = new Person();
				nextPer.setID(rs.getInt("ID"));
				nextPer.setNachname(rs.getString("Nachname"));
				nextPer.setVorname(rs.getString("Vorname"));
				nextPer.setGeburtsdatum(rs.getDate("Geburtsdatum"));
				result.add(nextPer);
			}
		}
		catch(SQLException e){
			e.printStackTrace();
		}
		
		return result;
	}
	
	public Person selectByID(int ids){
		
		String abfrage = "Select * From tblPerson where id=" + ids;
		Person Per = null;
		
		try{
			ResultSet rs = con.createStatement().executeQuery(abfrage);
			while(rs.next()){
				Per = new Person();
				Per.setID(rs.getInt("ID"));
				Per.setNachname(rs.getString("Nachame"));
				Per.setVorname(rs.getString("Vorname"));
				Per.setGeburtsdatum(rs.getDate("Geburtsdatum"));
			}
		}
		catch(SQLException e){
			System.out.println("Datensatz konnte nicht geladn werden.");
			e.printStackTrace();
		}
		catch (Exception e){
			System.out.println("Test");
		}
		return Per;
	}
	
	public void insertPerson(Person p){
		String eingabe = "Insert Into tblPerson(Nachname,Vorname,Geburtsdatum) Values (\""+p.getNachname()+"\",\""+p.getVorname()+"\",\""+p.getGeburtsdatum().toString()+"\")";
		try{
			con.createStatement().execute(eingabe);
		}
		catch(SQLException e){
			System.out.println("Datensatz konnte nicht eingetragen werden.");
			e.printStackTrace();
		}
	}
	
	public void insertPerson(String nnam, String vnam, Date geb){
		String eingabe = "Insert Into tblPerson(Nachname,Vorname,Geburtsdatum) Values (\""+nnam+"\",\""+vnam+"\",\""+geb+"\")";
		try{
			con.createStatement().execute(eingabe);
		}
		catch(SQLException e){
			System.out.println("Datensatz konnte nicht eingetragen werden.");
			e.printStackTrace();
		}
	

	
	public void updatePerson(Person p){
		String refresh = "UPDATE tblPerson SET Nachname=\""+p.getNachname()+"\",Vorname=\""+p.getVorname()+"\",Geburtsdatum=\""+p.getGeburtsdatum()+"\" WHERE ID="+p.getID();
		try{
			con.createStatement().executeUpdate(refresh);
		}
		catch(SQLException e){
			System.out.println("Datensatz konnte nicht aktualisiert werden.");
			e.printStackTrace();
		}
	}
	
	public void updatePerson(int idu, String nnam, String vnam, Date geb){
		String refresh = "UPDATE tblPerson SET Nachname=\""+nnam+"\",Vorname=\""+vnam+"\",Geburtsdatum=\""+geb+"\" WHERE ID="+idu;
		try{
			con.createStatement().executeUpdate(refresh);
		}
		catch(SQLException e){
			System.out.println("Datensatz konnte nicht aktualisiert werden.");
			e.printStackTrace();
		}
	}
	
	public Vector<String> getColumnNames(){
		String abfrage = "Select * From tblPerson";
		Vector<String> col = new Vector<String>();
		try{
			ResultSet rs = con.createStatement().executeQuery(abfrage);
			for(int i=0;i<rs.getMetaData().getColumnCount();i++){
				col.addElement(rs.getMetaData().getColumnLabel(i+1));
			}
		}
		catch(SQLException e){
			System.out.println("Abfrage konnte nicht ausgeführt werden.");
			e.printStackTrace();
		}
		return col;
	}
}

Wenn aber mehrere solcher DAO bestehen und auf diese zugegriffen wird, weil etwas in die MySQL Tabelle eingetragen werde soll, werden doch wieder mehrere Verbindungen aufgebaut.
Wenn ich die Connection im Control aufbaue und diese den DAOs aus dem Control zuweise, würde doch nur eine aufgebaut werden, oder verstößt es gegen die objektorientierte Programmierung?
Wenn ja, was müßte ich machen, dass nur eine Verbindung aufgebaut wird.

Und noch eine Frage:
In der Methode SelectAll() wird eine ArrayList erstellt. Diese soll später in eine Tabelle eingefügt werden. Wäre es nicht sinnvoller einen Vector zu erstellen? Was ist überhaupt der große Unterschied zwischen den beiden.

Danke schon mal.
 
Wieso sollte jedes Dao eine eigene Connction aufbauen und verwalten (und dabei nicht mal die Ressourcen schliessen...)?

Nimm einen Connectionpool, und wenn du schon mal dabei bist, sieh dir doch iBatis an, JDBC Code zu schreiben ist sehr fehlerträchtig, aufwendig und total überholt 🙂

Falls du bei JDBC bleiben willst, mach es doch bitte richtig.
Solltest unbedingt die resultsets und statements schliessen, am besten gleich auf prepared statements umsteigen.
Auch ist deine sog.Fehlerbehandlung keine, wirf zB. eigene DaoExceptions weiter wenn eine operation fehlt schlägt.
 
OK also soll ich ein Framework erstellen. Leider weiss ich nicht genau wie das geht. Gibts ein schönes Tutorial oder eine Beschreibung in Dutsch für Anfänger?

Muss ich dann noch einen ConectionPool aufbauen oder kommen die DAOKlassen alle weg?
Was würde in einer eigenen DAOException drin stehen, was sich vom e.printStackTrace() unterscheiden würde?
 
OK also soll ich ein Framework erstellen.
Davon würde ich abraten.
Nutze doch lieber eines dass es schon gibt und was erprobt ist.

Gibts ein schönes Tutorial oder eine Beschreibung in Dutsch für Anfänger?
In Englisch gibt es vieles, auf Deutsch sehr wenig.
Englisch ist in Java und der IT allgemein Vorraussetzung, sorry.

Muss ich dann noch einen ConectionPool aufbauen oder kommen die DAOKlassen alle weg?
ConnectionPools schreibt man auch nicht selbst, sondern nutzt vorhandene, zB. DBCP.
Daos sind an sich OK, allerdings sollten Schnittstelle und Implementierung getrennt sein, ist viel flexibler.

Was würde in einer eigenen DAOException drin stehen, was sich vom e.printStackTrace() unterscheiden würde?
Ein printStackTrace ist keine Fehlerbehandlung, sondern nur Fehlerausgabe auf de Console.
Alle deine Daos sollten nur eine einzige Art von Exceptions werfen: DaoException
Diese wird von den aufrufenden Programmteilen gefangen und verwertet, zB. in Form einer Fehlermeldung für den Benutzer, abbruch der Transaktion, etc.pp.

Selbst wenn du iBatis nicht einsetzt, solltest du unbedingt einen ConnectionPool einsetzen und immer alle Ressourcen schliessen!
 
Davon würde ich abraten.
Nutze doch lieber eines dass es schon gibt und was erprobt ist.

Das meinte ich schon. Aber dieses muss ja auch an mein Programm angepasst werden.

ConnectionPools schreibt man auch nicht selbst, sondern nutzt vorhandene, zB. DBCP.
Daos sind an sich OK, allerdings sollten Schnittstelle und Implementierung getrennt sein, ist viel flexibler.

Da ich noch keine Ahnung habe wie ich ein Framework einstelle, bleib ich erstmal bei den DAOs. Kannst du mir ein CodeBeispiel für getrennte Schnittstelle und Implementierung geben? Verstehe das nicht ganz.

DBCP = Datenbank Componente ?
Gibts für einen Code mit ConnectionPool auch ein kleines Besispiel?

Sorry für mein Unwissenheit. Aber das Thema ist nicht ganz einfach. Mit DriverManager wäre ich einigermaßen zurecht gekommen aber der ist ja veraltet und macht das Programm eher langsamer. Deswegen möchte ich wenn ich schon lerne direkt das vernüftige lernen.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben