# Wie realisiert man JDBCTemplate load als allgemein am besten?



## Presler (12. Mai 2012)

In Chapter 11. Data access using JDBC ist z.B. das folgende Beispiel zu finden


```
Collection actors = this.jdbcTemplate.query(
    "select first_name, surname from t_actor",
    new RowMapper() {

        public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
            Actor actor = new Actor();
            actor.setFirstName(rs.getString("first_name"));
            actor.setSurname(rs.getString("surname"));
            return actor;
        }
    });
```

Hierbei wird der Klasse Actor die Daten zu gewiesen. Ich bin am überlegen wie man dieses als eine zentrale DAO umsetzen könnte. Also der DAO::load wird z.B. die Klasse übergeben die dann befüllt werden. Bei ein paar Domains ist das kein Thema, aber bei ein paar hundert unterschiedlichen Domains wäre ja eine zentrale Lade-Funktion sinnvoller. Ja OK, ich weis man könnte ORM Framework z.B. Hibernate hierfür benutzen, aber ich frage mich wie ich das mit JDBCTemplate realisieren könnte. Kann mir irgendjemand hierbei ein kleine Hilfestellung geben?

Danke für eure Hilfe


----------



## SlaterB (13. Mai 2012)

die Frage ist unklar, vielleicht aber auch nur weil ich JDBCTemplate nicht kenne,
worauf zielst du ab?
du siehst anscheinend, wie hier ohne große Lade-Methode/ Schleife über ResultSet eine Query mit möglichst minimaler wichtiger Verarbeitung verknüpft wird,
das kann für irgendeine fertige Methode in JDBC passieren, oder du implementierst selber den Rest, Statement holen, executeQuery(), ResultSet usw.,

funktioniert doch bisher schon, oder? was genau soll nun bei deinem DAO passieren, welcher theoretische Ablauf,
durch Pseudocode beschreiben, wäre dein Ziel,
oder was sonst ist deine Frage, deren Richtung ich vielleicht nicht einmal sehe


----------



## maki (13. Mai 2012)

> . Also der DAO::load wird z.B. die Klasse übergeben die dann befüllt werden. Bei ein paar Domains ist das kein Thema, aber bei ein paar hundert unterschiedlichen Domains wäre ja eine zentrale Lade-Funktion sinnvoller.


Nun, wenn diese hundert Domainklassen alle gleich sind, kannst du das ganze einmal zentral machen, ansonsten nicht 

Jede Domainklasse braucht schon ein eiegenes Mapping, sonst wird das nix.
Ist zB. bei MyBatis/iBatis auch nicht anderes.

Mehr automatismen gibt es eben mit ORMs, wie zB. Hibernate, EclipseLink, JDO, JPA, etc. pp.


----------



## Presler (14. Mai 2012)

SlaterB hat gesagt.:


> die Frage ist unklar, vielleicht aber auch nur weil ich JDBCTemplate nicht kenne,
> worauf zielst du ab?
> du siehst anscheinend, wie hier ohne große Lade-Methode/ Schleife über ResultSet eine Query mit möglichst minimaler wichtiger Verarbeitung verknüpft wird,
> das kann für irgendeine fertige Methode in JDBC passieren, oder du implementierst selber den Rest, Statement holen, executeQuery(), ResultSet usw.,
> ...




Hier nochmal, hoffentlich etwas klarer als Beispielcode


```
class PersonDomain {
        private int id;
        private string name;
        private string nachnachme;
        
        // --- Geter / Setter - Funktionen 
       ....
}

class AdressDomain {
        private int id;
        private string strasse;
        private string ort;
        
        // --- Geter / Setter - Funktionen 
       ....
}

class KontatakdatenDomain {
        private int id;
        private string typ;              // z.B. "Telefon", "Email" ....
        private string untertyp;      // z.B. "private", "geschäftlich"...
        private string daten;          // z.B. "abc@abc.net"
        
        // --- Geter / Setter - Funktionen 
       ....
}

class DAO {
         load(int id, string tablename, object obj) {
              obj = this.jdbcTemplate.query(
    "select *from " + tablename,
    new RowMapper() {

        public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
            // Befüllen des jeweilig unterschiedlichen Domains
            // PersonDomain, AdressDomin oder KontaktdatenDomain
            return object;
        }
    });
                return obj;  // Befülltes Objekt
         }
}

class MainClass {
         public void main() {
                  // laden und ausgabe der Personen
                  // z.B. name = Axel, nachname = Presler
                 println (  DAO::load(1, "person", PersonDomain) . toString())

                // laden und ausgabe der Adresse
                // z.B. strasse = meine Strasse, ort = meine Stadt
                 println (  DAO::load(33, "adress", AdresssDomain) . toString())

                // laden und ausgabe der Kontaktadresse
                // z.B. typ = "email", untertyp = "beruflich", daten = "abc@abc.net"
                 println (  DAO::load(33, "contact", KontaktdatenDomain) . toString())

         }
}
```

Die Domains PersonDomains, AdressDomains und KontaktdatenDomains stellt rein nur die Daten da. Die DAO ist die zentrale Zugriffsklasse auf die Datenbank. Der Funktion load wird z.B. die ID des Datensatzes, die Datenbanktabellenname und das zu befüllende Objekt übergeben ( ist jetzt erstmal dahin gestellt ob Klasse oder Object) als Rückgabe gibt die Funktion load ein befülltes Object. Ich bin seit paar Tagen am überlegen wie man soetwas realisieren könnte. Denn bei 3 Domains kann man das wohl auf im 1. Thread gezeigte weise realisieren. Bei großen Projetken also mit einigen hundert Domains glaube ich wäre mein Ansatz sinnvoller, oder täusche ich mich da evtl?


----------



## Presler (14. Mai 2012)

maki hat gesagt.:


> Nun, wenn diese hundert Domainklassen alle gleich sind, kannst du das ganze einmal zentral machen, ansonsten nicht
> 
> Jede Domainklasse braucht schon ein eiegenes Mapping, sonst wird das nix.
> Ist zB. bei MyBatis/iBatis auch nicht anderes.
> ...



Ja ich hatte aber geschrieben will bewusst auf ORM ala Hibernate verzichten


----------



## SlaterB (14. Mai 2012)

mit JDBCTemplate, RowMapper, Bereich Datenbank allgemein scheint das nicht ganz so viel zu tun haben,
genauso könntest du auch erstmal eine zauberhafte toString()-Methode schreiben, die alle Objekt 'irgendwie' schön sauber ausgibt,

ich denke (auch), dass du da schon eine normale Methode pro Klasse investieren solltest,
wenn die für sich existiert, ist sie das wert,
hat man 100te Klassen, die alle sinnvoll verwendet werden, dann sowieso Jahre an wichtigen Quellcode, wichtige DB-Tabellen usw.,
da können hier die 100x 5 Min. keinen Ärger machen

nur weil Deutschland Millionen Studenten hat, fertigt man die auch nicht maschinell ab, 
jeder kriegt seine mündlichen Prüfungen, Diplomarbeit usw.  

----

generell gibt es aber auch immer die automatische Verarbeitung,
Relection bietet die Möglichkeit, alle Felder mit Datentyp, Name, Wert abzufragen, auf Werte speichern ist möglich,

zusammen mit den Meta-Daten des ResultSet und notfalls nötigen Mapping der zusammengehörigen Namen, könnte man da schon etwas leisten, heraus kommt ein Framework wie Hibernate


----------

