# Data Access Object - Beispiel



## Mark110 (21. Apr 2008)

Hallo!

ich lese mich gerade zu dem Thema DAO ein. Leider finde ich das dazugehörige Javabeispiel zu umfangreich.
Vorraussetzung:

Oracle Datenbank zugriff via JDBC

Wie baue ich die einzelnen Klassen?

Ich habe eine Datenbanktabelle LKW

Lkw von
Lkw nach
Lkw name etc


Ich möchte lediglich eine Methode getLKW

Mein Ansatz war, dass ich zum halten dieser Daten eine Klasse LKWBean habe (Alle Attribute der Datenbanktabelle LKW) mit gettern und settern zu versheen.

dann habe ich eine Klasse LKWList mit der methode getLKW <LKWBean>
sowie eine Klasse LKWDao mit methoden:

getLkw()
setupDatasource()
printDataSourceStats()
shutdownDatasource()


Wie würdet ihr sowas machen?
Habe ich das Thema überhaupt richtig verstanden?

Am liebsten wäre mir ein allgemeines beispiel und dann der verweis auf meine idee (was ist daran schlecht/gut)


----------



## maki (21. Apr 2008)

Wozu diese Methoden?

setupDatasource()
printDataSourceStats()
shutdownDatasource()


----------



## ARadauer (21. Apr 2008)

ich würde dem objekt nach aussen keine methoden um die verbindung aufzubauen. ich hab ein objekt, dem sag ich speicher mir einen lkw, lade mir alle lkws... die verbindung ist mir egal, das muss das dao schon selber wissen.


ich verwende auch gerne einen selbstgeschriebenen connection pool, damit die verbindung nicht immer wieder aufgebaut werden muss (dauert meistens länger als das eigentliche query)
kannst dir ja das mal ansehen http://www.java2s.com/Code/Java/Apache-Common/Connection-Pool.htm


----------



## Mark110 (21. Apr 2008)

```
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;

public class LkwDAO {
	
	private static final String QUERY = "select * from dtb_ot t where t.kunde=68770 AND rownum<2";
	
	public LkwList getLkw() {

		DataSource dataSource = null;
		Connection conn = null;
		Statement stmt = null;
		
		LkwList lkwList = new LkwList();
		
		
		try {
			dataSource = setupDataSource("jdbc:oracle:thin´.....");		
			conn = dataSource.getConnection();
			stmt = conn.createStatement();
			ResultSet rs = stmt.executeQuery(QUERY);
			while (rs.next()) {
				LkwBean lb = new LkwBean();
				lb.setKdnummer("5");
				lb.setVonPLZ("53424");
				lb.setVonOrt("Remagen");
				lb.setNachPLZ("51103");
				lb.setAufbau("1");
				lb.setAdr(false);
				lb.setGliederzug(false);
				lb.setSattelzug(false);
				lb.setKlein_fahrz(true);
				lb.setLaengeMotor("12");
				lb.setGewichtMotor("14");
				lb.setLaengeHaenger("34");
				lb.setGewichtHaenger("54");
				lb.setIBemerkung("test");
				lb.setBemerkung("beeeemerkung");
				
				try {
					lkwList.getLkw().add(lb);
					
				} catch (NullPointerException e) {
					System.out.println("Es trat eine Nullpointer Exception!");
				}

			}
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println("SQL Fehler!");
		} finally {
			if (null != conn) {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
					System.out.println("Connection Close Fehler");
				}
			}
		}
		return lkwList;
		
	}
	
	public static DataSource setupDataSource(String connectURI) {
		BasicDataSource ds = new BasicDataSource();
		ds.setDriverClassName("oracle.jdbc.driver.OracleDriver");
		ds.setUsername("user");
		ds.setPassword("pw");
		ds.setUrl(connectURI);
		return ds;
	}

	public static void printDataSourceStats(DataSource ds) throws SQLException {
		BasicDataSource bds = (BasicDataSource) ds;
		System.out.println("NumActive: " + bds.getNumActive());
		System.out.println("NumIdle: " + bds.getNumIdle());
	}

	public static void shutdownDataSource(DataSource ds) throws SQLException {
		BasicDataSource bds = (BasicDataSource) ds;
		bds.close();
	}
	
}
```

So sieht mein code aus.

die bibliothek connection-pool habe ich in eclipse bereits eingebunden.

Ich erhalte auch eine Fehlermeldung beim setzen der Liste (Warum eigentlich?): Es trat eine Nullpointer Exception!


----------



## maki (21. Apr 2008)

DAOs kommen übrigens immer mit einer DAO Factory, die kümmert sich um die Connections.

Welches Beispiel liest du eigentlich?


----------



## Mark110 (21. Apr 2008)

http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html

ist mit factory


----------



## maki (21. Apr 2008)

>> ist mit factory

natürlich, was denn auch sonst 

Solltest bdir das Beispiel nochmals ansehen, viele wichtige Dinge drinnen.
Kannst dich ja auch eine DB konzentrieren, brrauchst auch keine abtrakte Factory, eine konkrete reicht bei einer DB.


----------



## Gast (22. Apr 2008)

Darf ich dazu auch noch einmal eine Frage stellen ?

Ich verwende beim DAO Pattern eine DB Klasse. Wo muss diese denn instatiiert werden ?

Ich mache das derzeit in den Daos ansich.Wäre es besser , diese s über die Factory abzuwickeln ?


----------



## maki (23. Apr 2008)

Was soll denn eine DB Klasse sein?

Mit einer DaoFactory und Daos ist diese überflüssig.

Wenn du fragen hast, nicht zögern, dafür ist das Forum ja da.


----------



## y0dA (23. Apr 2008)

Ich nehme an, eine DB-Klasse repräsentiert ebenfalls Methoden zur Interaktion mit der DB -die halt auf kein bestimmtes Objekt passen?


----------



## maki (23. Apr 2008)

Glaube eher dass die DB Klasse die Cponneciton etc. macht, dass ist Aufgabe der Factory


----------



## Gast (23. Apr 2008)

Dann kann ich doch auch die DBConnection in der Factoray aufrufen, anstatt es in der DAO zu tun. 

Meine DB Klasse lädt über Properties die Verbindungseinstellungen und lädt dden DB Treiber.

Im Anschluß wird eine Conntection erstellt. 

Dann sind aber auch Funktionen zur Ausführung der Befehle vorhanden.

execute()  und Funktionen zum Zählen der betroffenen  Datensätze , etc.

Das mache ich also an einer zentralen Stelle. 

Wie macht Ihr das denn ?


----------

