Hallo!
Erstmal sah mein Code für ein DAO so aus.
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.
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.
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.