Java Abstraktion für JDBC

Fatal Error

Lt. Junior Grade
Registriert
Jan. 2009
Beiträge
294
Hallo!

Gibts es Frameworks, wie ADODB oder PDO für PHP, auch für Java?
Wo ich zum Beispiel nur den Datenbanktyp angeben muss und nicht für jede Datenbank selbst den Treiber mit Class.forName... laden muss?

Ich gebe zu, dass ich bisher noch nie etwas mit SQL in Java gemacht hab...

Schonmal Danke für eure Antworten
 
JDBC ist doch eigentlich schon eine Abstraktion. Bis auf das Aufbauen der Verbindung bzw. Laden der Verbindungsklasse ist es ja datenbankunabhängig. Was willst du denn noch mehr abstrahieren?
Persistenzframeworks wie Hibernate gibts halt noch aber das geht ja in ne andere Richtung der Abstraktion als du meinst...
 
ibatis wäre da vielleicht noch was....
Ergänzung ()

aber ich lade dass sowieso mit spring... da muss ich nicht "selber" die class laden...
 
ja mir ist klar dass jdbc schon eine abstraktion ist, aber ich hätte es eben gerne noch etwas abstrakter und ich dachte da gibt es irgendwas...

ist spring nur für java ee oder auch für se?
 
Zuletzt bearbeitet:
Definiere doch mal bitte genauer, was du abstrakter haben willst. Also wie stellst du dir das vor? Was möchtest du haben?
 
spring ist ist auch für se
Ergänzung ()

Ich denke ihm geht es darum die Treiberverwaltung nicht selbst regel zu müssen. Kann ich gut verstehen und Spring macht das auch schön brav für mich :) und für alle meine Klassen
 
TheNoxier schrieb:
Ich denke ihm geht es darum die Treiberverwaltung nicht selbst regel zu müssen. Kann ich gut verstehen und Spring macht das auch schön brav für mich :) und für alle meine Klassen

ja, da hast du recht.
hab mir spring mal angeschaut und finds eigentlich recht nett, danke (:
 
Dann nutze ich diesen Thread mal, um was neues zu lernen: Wie genau meint ihr das mit der Treiberverwaltung? Was muss man denn bei JDBC selber regeln? Ich muss eigentlich nur aufpassen den JDBC-Treiber in den CLASSPATH einzutragen - oder meint ihr was anderes? Und wie kann Spring da helfen?
 
Zum Beispiel so:
Code:
Class.forName("org.h2.Driver");
Connection conn = DriverManager.getConnection("jdbc:h2:db", "admin", "password");

Wenn ich also einen anderen Treiber laden will, könnte ich dem Programm einfach einen anderen Treibernamen als String übergeben lassen. Viel abstrakter kann ich mir das gar nicht vorstellen. Man muss doch auch hier maximal zwei Strings austauschen, um ein anderes DBMS zu verwenden.
 
Also lädst du jedenmal wenn du irgendwo in irgend einer Klasse eine Datenbankverbindung brauchst, den Treiber neu - armer RAM.

Und was ist mit den Zugangsdaten, die stehen dann auch verstreut in der Gegen herum anstatt an einer stelle?

Hier ein Beispiel wie in Spring eine Datenbank verwaltet wird.

PHP:
    <bean id="TargetDataSource"
        class="org.apache.commons.dbcp.BasicDataSource">
            <property name="url"><value>jdbc:mysql://@db.host@:@db.port@/@db.database@?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=utf8&amp;jdbcCompliantTruncation=false&amp;cachePrepStmts=true&amp;prepStmtCacheSize=50&amp;zeroDateTimeBehavior=convertToNull</value></property>
            <property name="username"><value>@db.user@</value></property>
            <property name="password"><value>@db.password@</value></property>
            <property name="driverClassName"><value>@db.driver@</value></property>
            <property name="maxActive"><value>5</value></property>
            <property name="maxIdle"><value>1</value></property>
            <property name="maxWait"><value>-1</value></property>
            <property name="defaultAutoCommit"><value>true</value></property>
            <property name="testOnBorrow"><value>true</value></property>
            <property name="validationQuery"><value>@db.validationquery@</value></property>
    </bean>

Die Platzhalter werden über maven2 gefüllt. Somit kann man eine "lokal" und eine "productions" config haben.

Die TargetDataSource wird dann in den Zielservice injected. Bzw man holt ihn sich.

PHP:
ClassPathXmlApplicationContext mFactory = new ClassPathXmlApplicationContext(path);
DataSource targetData= (DataSource) mFactory.getBean("TargetDataSource");
Connection connection = targetData.getConnection();

Wobei die drei Zeilen oder sehr getrennt im Code sind.
Die erste Teilen sich alle Services. :)

nox
 
Nööö, ich hab in meinem ganzen Programm nur eine Connection. Ich kapsel das für gewöhnlich in einer eigenen DB-Klasse mit speziellen Zugriffsmethoden. Im Konstruktor der Hauptklasse wird das Ding einmal erzeugt und wer es haben will, der kann sich das von der Klasse z.B durch getConnection() besorgen. Dann greifen zwar mehrere Klassen und eventuell sogar mehrere Threads auf das selbe Connection-Objekt zu, aber das kann man ja relativ leicht synchronisieren.
 
Gut, diese Arbeit übernimmt Spring für dich, ohne das du neu kompilieren musst.

Egal obs sich Datenbank zugangsdaten ändern oder der "kunde" eine andere datenbank hat als man selbst.

Generel: Man sollte keine "hardcoded" strings in seinen java klassen haben. :)


nox
 
Man kann die Datenbank-Zugangsdaten auch wenn man kein Spring benutzt in Dateien hinterlegen. Die einfachste Form sind die Java Properties aber es gibt da ja zig Möglichkeiten.
 
Zurück
Oben