DB-Klasse für häufig verwendete Aufgaben

Status
Nicht offen für weitere Antworten.
A

Anjax

Gast
Jede Literatur zeigt mir nur die Standard-Befehle, um mit JDBC zu arbeiten.

Ich finde es aber nicht praktisch, jedes mal wenn ich etwas aus der DB benötige, connecten, SQL senden, while-Schleife durchlaufen, etc.

Vieles wird immer wieder benötigt und ich möchte diese Aufgaben zentral halten können, z.B. in einer Klasse mit folgenden Methoden:

* getArray(SQL) - der Inhalt einer Abfrage wird als Array geliefert
* getValue(SQL) - es wird nur ein einzelner Wert geliefert
* fillTreeView (SQL, myTreeView) - das TreeView wird mit dem Inhalt der Abfrage gefüllt

Zusätzlich könnte sich die Klasse um die Fehler kümmern. Beispielsweise kann angegeben werden, ob Fehler einfach nur geworfen werden, oder die Klasse selbst die Fehler in einem aussagekräftigen Fenster anzeigen soll.


Gibt es solch eine Klasse schon, oder wie macht ihr das mit der Datenbank?
 
S

SlaterB

Gast
wenn ich irgendwas mit JDBC mache, dann ist das immer so ziemlich das erste,
einen Standard braucht man dafür aber nicht,

gibts auch gar nicht für die eigene indidviduelle Connection, Fehlerbehandlung,
package, Vererbung, import, usw.

schreibe dir die 10 Zeilen hin und fertig ist es
 
A

Anjax

Gast
danke für deinen Beitrag :)

Wenn du etwas mit JDBC machst, schreibst du dir also zuerst selbst eine Klasse, die häufig verwendete Aufgaben übernimmt, wie z.B. eine Abfrage-Ergebnis als Array zurückzugeben.

Aber warum gibt es dazu nicht schon eine fertige Klasse?
Von PHP kenne ich z.B. solch eine generische DB-Klasse und diese hat viele Dinge enthalten, an die ich zunächst gar nicht gedacht hatte.



Noch eine wichtige Frage:
Wie werden die Verbindungen gehandhabt?
a) Wird jedes mal eine neue Verbindung aufgebaut und dann wieder beendet, wenn z.B. die Methode querySQL() der Klasse ausgeführt wird.
b) Oder macht man zu Beginn ein Connect (z.B. wenn die Klasse initiiert wird) und alle weiteren Aufrufe verwenden die gleiche Verbindung?
 
S

SlaterB

Gast
> Aber warum gibt es dazu nicht schon eine fertige Klasse?

wenn ich eine Java-Programm schreibe, dann schreibe ich mir jedesmal eine Klasse, die das Programm enthält,
wieso gibt es keine fertige Klasse?..

eben wie oben geschrieben, weil das für jeden Programmierer anders aussieht, meist sogar in verschiedenen Projeken eines Programmierers/ Teams

> Von PHP kenne ich z.B. solch eine generische DB-Klasse und diese hat viele Dinge enthalten, an die ich zunächst gar nicht gedacht hatte.

man darf die JDBC-Klassen wie ResultSet/ Connection nicht unterschätzen,
die enthalten alles, was jeder braucht

dass man man trotzdem noch was selber zu programmieren hat,
sehe ich eher als Stärke von Java gegenüber PHP, als Mächtigkeit, alle (mehr) Schritte zu kontrollieren

-----------

> Wie werden die Verbindungen gehandhabt?

im einfachen Falle b)
über a) musst du wahrscheinlich erst nachdenken, wenn du so efahren bist, dass sich solche Fragen gar nicht mehr stellen
 

Kim Stebel

Bekanntes Mitglied
vielleicht sollte man hier schon mal auf die JPA und hibernate hinweisen. Wahrscheinlich ist das aber zu umfangreich für dich.
 

ARadauer

Top Contributor
Wie werden die Verbindungen gehandhabt?
ich schreib mir immer einen kleinen connection pool.
der bietet die möglichkeit, eine verbindung anzufordern und diese wieder zurück zugeben.

wird eine angefordert und es ist keine verbindung frei, öffnet er eine neue verbindung und gibt sie weiter.

wird an ihm eine verbindung zurück gegeben, schließt er sie nicht sondern, markiert sie als frei.
so muss nicht bei jedem anfordern eine neu verbindung geöffnet werden.

ich könnte dir den code geben, hab ihn aber nicht hier ....
 

ARadauer

Top Contributor
doch hier..

Code:
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.util.Iterator; 
import java.util.Vector; 

import javax.sql.DataSource; 

import com.bmw.bedarfsplanung.main.Globals; 

import oracle.jdbc.pool.OracleDataSource; 

/** 
* DbHandler ist ein einfacher Connection Pool, der nach Bedarf Verbindungen zu Datenbanken aufmacht, 
* aber aus performance Gründen, diese nicht gleich wieder schließst sondern, bei erneuter anfrage, bereits 
* offene Verbindungen zurück gibt. 
* @author Q240764 
* 
*/ 
public class DbHandler { 

   public static int MIS2 = 0; 
   public static int LEMO = 1; 

   private ConnectionData[] connData = {new MIS2Db(), new LemoDb()}; 
    
   //die offenen verbindungen 
   private Connection[] connections; 
   //ist die verbindung in benützung 
   private boolean[] inUse; 
   //damit ich weiß welche datenbank eine verbindung gehört 
   private int[] database; 

   private static DbHandler instance; 
    
   //anzahl der maximal offenen verbindunge 
   private int maxConnections = 10; 

   public static synchronized DbHandler getInstance(){ 
      if(instance == null){ 
         instance = new DbHandler(); 
      } 
      return instance; 
   } 

   /** 
    * Standard konnstruktor, registriert den jdbc Treiber und legt das array für die offenen verbindunge an 
    * 
    */ 
   private DbHandler(){ 
      connections = new Connection[maxConnections]; 
      inUse = new boolean[maxConnections]; 
      database = new int[maxConnections]; 
      try { 
         DriverManager.registerDriver(new oracle.jdbc.OracleDriver()); 
      } catch (SQLException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
      }       
   } 

   /** 
    * liefert eine offene Verbindung, für die angeforderte Datenbank aus dem Connection Pool 
    * ist keine offene vorhanden, wird eine Verbindung aufgebaut 
    * Es muss sicher gestellt sein, dass eine angeforderte Verbindung über returnConnection wieder zurück gegeben wird 
    * @param db die Datenbank für die die Verbindung angeforderd wird 
    * @return eine offenen JDBC Connection 
    * @throws SQLException wenn ein verbindungsaufbau fehlschlägt 
    */ 
   public synchronized Connection getConnection(int db)throws SQLException { 

      //wenn die verbindung noch null ist: anlegen 
      for(int i = 0; i < maxConnections; i++){ 
         if(connections[i]==null){ 
            connections[i] = DriverManager.getConnection(connData[db].getHost(), connData[db].getUser(), connData[db].getPass()); 
            inUse[i] = true; 
            database[i] = db; 
            return connections[i]; 
            //ist die verbindung, nicht in benützung und von der selben datenbank: zurück geben 
         }else if((!inUse[i]) && (database[i]==db)){ 
            //ist sie geschlossen muss vorher verbunden werden 
            if(connections[i].isClosed()){ 
               connections[i] = DriverManager.getConnection(connData[db].getHost(), connData[db].getUser(), connData[db].getPass()); 
            } 
            database[i] = db; 
            inUse[i] = true; 
            return connections[i]; 
         } 

      } 
      System.out.println("Max Connections überschritten"); 
      return null; 
   } 

   /** 
    * über getConnection angeforderte Verbindungen, MÜSSEN über diese Methode wieder zurück gegeben werden 
    * die verbindungen werden nicht geschlossen, sondern über inUse zu Wiederverwendung freigegeben 
    * @param con 
    */ 
   public synchronized void returnConnection(Connection con){ 
      for(int i =0; i < connections.length;i++){ 
         if(con.equals(connections[i])){ 
            inUse[i] = false; 
            return; 
         } 
      } 
      System.out.println("Connection war nicht vorhanden"); 
   } 


   /** 
    * um ein update auszuführen, Connection anfordern, updaten, connection zurück geben 
    * spart im grunde nur Schreibarbeit 
    * @param query, die auszuführende abfrage 
    * @param db die Datenbank, in der die Abfrage ausgeführt werden soll 
    * @throws SQLException 
    */ 
   public static void executeUpdate(String query, int db) throws SQLException{ 
      Connection con = getInstance().getConnection(db); 
 Statement stmt = null; 
      try { 
         stmt = con.createStatement(); 
         if(Globals.debug){ 
            System.out.println(query); 
         } 
         stmt.executeUpdate(query); 
      } catch (SQLException e) { 
         throw e; 
      }finally{
    if(stmt!=null)
        stmt.close();     
         getInstance().returnConnection(con); 
      }       
   } 
}

der code is aber schon älter, kann leicht sein, dass ich ihn mal geändert habe.

sowas wie meine statische executeUpdate, könntest du natürlich auch für das Lesen von Werten schreiben...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Konzept: Klasse / Entity für Einstellung der Software Datenbankprogrammierung 3
J Klasse für Datensatzblättern in Verbindung mit JTable gesuch Datenbankprogrammierung 6
G gutes design für db-klasse Datenbankprogrammierung 3
Zrebna Wie mittels Hibernate eine Join-Tabelle als eigene Java-Klasse erstellen? Datenbankprogrammierung 5
S ResultSet als Parameter an andere Klasse übergeben Datenbankprogrammierung 3
F Mapping einer SQL Abfrage in eine Klasse Datenbankprogrammierung 4
J Nur CRUD über Datenbank Klasse, oder auch mehr ? Datenbankprogrammierung 2
F Mapping SQL mit Klasse Datenbankprogrammierung 7
L MySQL Database Helper Klasse mit Consumer Datenbankprogrammierung 7
S Mithotec-Klasse Datenbankprogrammierung 6
P MySQL-Verbindung in anderer Klasse nutzen Datenbankprogrammierung 2
M Wie übergebe ich Datenbankobjekte aus einer sql-Datenbank einer Java Klasse bzw. Instanz Datenbankprogrammierung 7
I SQLite Objekt speichern einer Serialisierter Klasse Datenbankprogrammierung 1
G ArrayList aus Verschiedenen klasse füllen Datenbankprogrammierung 5
H Klasse welche Mysql Daten zurück gibt Datenbankprogrammierung 18
F JPA und Klasse "User" Datenbankprogrammierung 3
S MySQL Datenbankanbindung extra Klasse Datenbankprogrammierung 10
E MySQL Klasse zur Abfrage statisch oder Standard Datenbankprogrammierung 5
A Connection Variable in anderer Klasse verwenden -> statement Datenbankprogrammierung 2
T Klasse zum Syntaxcheck Datenbankprogrammierung 2
G Hibernate: wie @ManyToOne Referenz auf eigene Klasse? Datenbankprogrammierung 1
S Aus ResultSetMetaData Klasse dynamisch erzeugen Datenbankprogrammierung 3
P Neues Attribut in Entity-Klasse Datenbankprogrammierung 3
W XML Klasse in Datenbank speichern? Datenbankprogrammierung 5
N resultset aus andere klasse übergeben Datenbankprogrammierung 3
P Klasse in Datenbank speichern Datenbankprogrammierung 4
I Keine Treiber-Klasse! Datenbankprogrammierung 9
H Aufbau einer DB-Klasse Datenbankprogrammierung 10
M Die ganze klasse als eigenen Thread laufen lassen Datenbankprogrammierung 3
N Datenbank in diese Klasse einfügen Datenbankprogrammierung 4
D Verknüpfung auflösen für Frontend Datenbankprogrammierung 7
R Beste Lösung für User Erstellung in mongodb Datenbankprogrammierung 1
I SaaS Applikation: pro Kunde eine Datenbank / Schema oder eine DB für alle Kunden? Datenbankprogrammierung 76
O apache derby in eclipse für Datenbanken einbauen Datenbankprogrammierung 3
Zrebna Empfehlung für ein kostenloses DB-Hosting gesucht Datenbankprogrammierung 6
M Lösungsvorschläge für Multi-User Datenbankprogrammierung 1
M Alle Records Felder kriegen für DB Abfrage Datenbankprogrammierung 14
pkm PostgreSQL Kann mit mybatis einen Parameter für eine postgreSQL-Abfrage nicht übergeben. Datenbankprogrammierung 5
Kirby.exe Denkanstoß für Ranking Datenbankprogrammierung 1
L Oracle Repräsentative Namen für die Column Types Datenbankprogrammierung 9
OnDemand Struktur für Parent / Child Produkt Datenbankprogrammierung 5
N ORM für Sqlite Datenbankprogrammierung 4
H suche eine Login system Bibliothek für Java Datenbankprogrammierung 5
ruutaiokwu MySQL MariaDB-Client-Zertifkate, nur für einen bestimmten User Datenbankprogrammierung 5
B Datenmodell für Regeln + Bedingungen & Referenz auf andere Tabelle Datenbankprogrammierung 12
O Dokumentation für MariaDB 10.3. Datenbankprogrammierung 2
F MariaDatabase Einstellungen für Verbindungen Datenbankprogrammierung 5
Dimax MySQL Trigger für eine Spalte Datenbankprogrammierung 5
Dimax MySQL Maximale Datenlänge für eine Spalte einer Datenbank in java ermitteln Datenbankprogrammierung 15
platofan23 MySQL Java Programm findet Treiber für mySQL auf Debian-Server nicht? Datenbankprogrammierung 11
B Brauche Tipps für Datenbankdesign Datenbankprogrammierung 8
B Tabelle für "wiederkehrende Rechnungen" Datenbankprogrammierung 12
Danloc Informationen für Datenbankverbindung wo/wie speichern? Datenbankprogrammierung 11
J Warum sind Sockets für einen Live-Chat sinnvoll? Datenbankprogrammierung 8
R Java-Befehle/Operatoren für copy&paste Datenbankprogrammierung 2
X PostgreSQL Datenbankdesign für Vokabeltrainer Datenbankprogrammierung 48
@SupressWarnings() HSQLDB Datenbank für mein Dorfbauspiel "Time of Kings" Datenbankprogrammierung 6
M Idee Umsetzung //NFC Eintrittskarten für Geburtstag Datenbankprogrammierung 2
looparda Architektur für JPA Hibernate Umstieg Datenbankprogrammierung 14
P Datanbank für Java-Programmierung Datenbankprogrammierung 10
M Feedback für neues Buch über "Java und Datenbanken" erwünscht Datenbankprogrammierung 8
J SQLite Ich muss für mein Projekt meine Datenbank Kapseln Datenbankprogrammierung 2
J Tipps für ERM Datenbankprogrammierung 4
P Highlevel-Lösung für Speicherung von Baumstruktur mit unbekannter Tiefe Datenbankprogrammierung 1
F welche Datenbank für Messwerte? Datenbankprogrammierung 4
E Warum werden für Datenbanktabellen Schemanamen festgelegt? Datenbankprogrammierung 1
M DB Schema für Vokabeltrainer Datenbankprogrammierung 2
U SQLite Für mich etwa komplexe Abfrage via 2 Tabellen Datenbankprogrammierung 5
E Kann man, wenn man in DB2 Tabellen erstellt hat für dessen auch einen Command-File erstellen? Datenbankprogrammierung 1
T NoSQL Connection für die Thesis [GWT] Datenbankprogrammierung 1
J SQLite Abfrage ausführen stoppt für Zyklus? Wie es zu lösen? Datenbankprogrammierung 3
S HSQLDB Fehlermeldung für den Bildschirm Datenbankprogrammierung 3
L Datenmodell erstellen für eine Nutzertanalyse Datenbankprogrammierung 1
I Query für Geburtstage Datenbankprogrammierung 6
L Zentrale Datenbank im Internet für Spiele Highscores? Datenbankprogrammierung 1
P Derby/JavaDB Csv Datei für dieses Musterprogramm Datenbankprogrammierung 12
ruutaiokwu code-formatter für t-sql... Datenbankprogrammierung 12
J Plug-In-Framework für Hibernate-Klassen Datenbankprogrammierung 0
T Mehrsprachigkeit für Tabellenfelder Datenbankprogrammierung 6
E MySQL Große Datenmengen reibungslos speichern für Gameserver Datenbankprogrammierung 6
F MSSql oder MongoDB für die Speicherung von POI Datenbankprogrammierung 9
G SQLite SQLite Select für View vereinfachen/optimieren Datenbankprogrammierung 4
P MySQL Historie für ein Objekt anlegen Datenbankprogrammierung 5
P MySQL eine richtige Datenbank für einen routenplaner erstellen Datenbankprogrammierung 2
K JDBC- In Java "stored procedure" erstellen für DB2,OracleSql ... Datenbankprogrammierung 3
J Datenbank für Fragen/ Antworten Datenbankprogrammierung 7
O Datenbankschnittstelle für Java Datenbankprogrammierung 8
L Datenbank für kleinere Anwendungen Datenbankprogrammierung 3
N Query für Derby DB mit Enterbrise Bean Datenbankprogrammierung 4
S ich brauche tipps für JDBC Datenbankprogrammierung 4
I Hibernate - Best Practice für Lazy Loading Datenbankprogrammierung 3
R MySQL Voraussetzungen für eine erfolgreiche Datenbankanbindung mittels JDBC Datenbankprogrammierung 2
GianaSisters SQL Befehl für allgemeine Datenbankexistenz Datenbankprogrammierung 4
B Beispiel für sicheres DBUsername/DBPassword handling Datenbankprogrammierung 4
I Anfänger-Tutorial für Hibernate gesucht Datenbankprogrammierung 3
heart_disease Beratung für Datenbankdesign Datenbankprogrammierung 13
C Embedded DB für Java Datenbankprogrammierung 26
J Unterstützung für verschiedene Datenbanken Datenbankprogrammierung 2
L MySQL Probleme mit PreparedStatement für SQL-Abfrage in Java Datenbankprogrammierung 2
F suche Erstanschub für DB-Zugriff Datenbankprogrammierung 9

Ähnliche Java Themen


Oben