MySQL Database Helper Klasse mit Consumer

Linda1999

Mitglied
Hallo, ich habe mir eine kleine DatabaseHandler Klasse gebastelt. Ich wollte mich mit Datenbanken und außerdem mit Java 8 features beschäftigen, darum dachte ich mir, mache ich es mit Consumern. Außerdem bekomme ich jetzt kein ResultSet direkt zurück sondern muss das anders regeln.

Hier meine Klassen:
DatabaseHandler: https://hastebin.com/tixozobone.java
Main: https://hastebin.com/niziqeyari.coffeescript

Meine Fragen sind jetzt:
1.
Wie man im DatabaseHandler Zeile 85 und 98 sehen kann, benutze ich einen Consumer zum setzen der "?" im PreparedStatement. Aber kann man das auch anders lösen? Zum Beispiel mit einem "Object... array"? Ich benutze diesen MySql Connector (https://dev.mysql.com/downloads/connector/j/) der unterstützt .setObject() leider nicht. Hat da jemand eine Idee?

2.
Kann man es irgendwie schaffen, dass man den try{}catch(){}-Block NICHT innerhalb des Lambda-Ausdruckes hat? Weil eigentlich wollte ich das vermeiden, aber entweder bekomme ich ein ResultSet zurück, oder halt so :/

Danke!

PS: Hättet ihr noch Ideen diesen DatabaseHandler zu verbessern? Was würdet ihr ändern?

Was mir nicht gefällt ist der Aufruf der Funktion "DatabaseHandler.query(String,Consumer<PreparedStatement>,Consumer<ResultSet>)". Aber es geht halt einfacher so.
 

mrBrown

Super-Moderator
Mitarbeiter
Ich benutze diesen MySql Connector (https://dev.mysql.com/downloads/connector/j/) der unterstützt .setObject() leider nicht.
Warum sollte der das nicht unterstützen? Das gehört zum Standard und ist mWn auch implementiert...

Aber kann man das auch anders lösen? Zum Beispiel mit einem "Object... array"?
Ja, das geht problemlos.
musst dann entsprechend über das Objekt iterieren und die mit passendem Index übergeben.

Kann man es irgendwie schaffen, dass man den try{}catch(){}-Block NICHT innerhalb des Lambda-Ausdruckes hat? Weil eigentlich wollte ich das vermeiden, aber entweder bekomme ich ein ResultSet zurück, oder halt so :/
Ja, allerdings nicht mit dem normalem Consumer.

Du brauchst entweder einen Wrapper, der die Exception fängt und behandelt, oder du schreibst ein eigenes Consumer-Interface, wobei die Methode Exceptions schmeißen darf.


PS: Hättet ihr noch Ideen diesen DatabaseHandler zu verbessern? Was würdet ihr ändern?
Das hängt ganz davon ab, was du damit machen möchtest ;)

ich würde dabei z.B. vermeiden, dass es einen Database-Händler ohne Connection geben kann - ist aber Geschmackssache - und das PreparedStatement sollte keine Instanz-Variable sein.
 

Linda1999

Mitglied
Warum sollte der das nicht unterstützen? Das gehört zum Standard und ist mWn auch implementiert...


Ja, das geht problemlos.
musst dann entsprechend über das Objekt iterieren und die mit passendem Index übergeben.


Ja, allerdings nicht mit dem normalem Consumer.

Du brauchst entweder einen Wrapper, der die Exception fängt und behandelt, oder du schreibst ein eigenes Consumer-Interface, wobei die Methode Exceptions schmeißen darf.



Das hängt ganz davon ab, was du damit machen möchtest ;)

ich würde dabei z.B. vermeiden, dass es einen Database-Händler ohne Connection geben kann - ist aber Geschmackssache - und das PreparedStatement sollte keine Instanz-Variable sein.

Danke!!

Wie ich sehe habe ich die falsche Methode im Interface gesehen, hab es nicht direkt ausprobiert.
Code:
default void setObject(int parameterIndex, Object x, SQLType targetSqlType)
  throws SQLException {
    throw new SQLFeatureNotSupportedException("setObject not implemented");
}

also könnte ich bei dem Object Array einfach durch-loopen? ps.setObject(i+1, objectArray); würde das funktionieren?

>>> Dann werde ich mir noch so einen Wrapper-Consumer bauen, hab danach schon gesucht, man findet genug :)

Und auch noch danke für die Verbesserungsvorschläge, PreparedStatement ist jetzt keine Instanz-Variable, wird in jeder methode neu erzeugt. Aber was du mit "ich würde dabei z.B. vermeiden, dass es einen Database-Händler ohne Connection geben kann - ist aber Geschmackssache" meinst, weiß ich nicht genau. Aber es wird doch immer überprüft ob die Connection besteht, also sollte das eigentlich kein großes Problem sein, wäre aber nett, wenn du das nochmal erklärst.
 

mrBrown

Super-Moderator
Mitarbeiter
Wie ich sehe habe ich die falsche Methode im Interface gesehen, hab es nicht direkt ausprobiert.
Das ist eine default-Methode, in den meisten aktuellen Implementierungen ist die auch überschreiben - so auch in der MySQL-Implemetierung.

also könnte ich bei dem Object Array einfach durch-loopen? ps.setObject(i+1, objectArray); würde das funktionieren?
wenn da ps.setObject(i+1, objectArray[i]); stehen sollte; ja ;)

Aber was du mit "ich würde dabei z.B. vermeiden, dass es einen Database-Händler ohne Connection geben kann - ist aber Geschmackssache" meinst, weiß ich nicht genau. Aber es wird doch immer überprüft ob die Connection besteht, also sollte das eigentlich kein großes Problem sein, wäre aber nett, wenn du das nochmal erklärst.
Naja, ich kann jetzt eine Instanz davon benutzen, die keine Connection hat, ohne das ich davon irgendwas merke ;)

Wenn man stattdessen den DatabaseHandler nur mit gültiger Connection erstellen kann, muss man das nicht gesondert prüfen und muss auch nicht an das connect() denken ;)[/i]
 

Linda1999

Mitglied
Das ist eine default-Methode, in den meisten aktuellen Implementierungen ist die auch überschreiben - so auch in der MySQL-Implemetierung.


wenn da ps.setObject(i+1, objectArray[I]); stehen sollte; ja ;)


Naja, ich kann jetzt eine Instanz davon benutzen, die keine Connection hat, ohne das ich davon irgendwas merke ;)

Wenn man stattdessen den DatabaseHandler nur mit gültiger Connection erstellen kann, muss man das nicht gesondert prüfen und muss auch nicht an das connect() denken ;)[/I]
Danke nochmal, jetzt hab ich das hier verändert:
  • PreparedStatement ist keine Instanzvariable mehr
  • exists()-Funktion hinzugefügt
  • Ein ThrowingConsumer-Interface erstellt, dass die Exceptions abfängt
  • Die FillIns für das PreparedStatement per Array übergeben
Hier sind die Klassen:
DatabaseHandler: https://hastebin.com/uvasiyequx.java
ThrowingConsumer<T>: https://hastebin.com/arorapugaw.java

Jetzt habe ich noch eine Frage:
Ich kann ja Variablen der Klassen, in der ich die Funktion QUERY aufrufe nicht in der Lambda-Expression verwenden, außer
  • ich mache eine AtomicReference daraus
  • ich mache ein final Array daraus und verwende den eintrag davon
Kann man das eventuell auch noch ändern? Gibts da noch andere Möglichkeiten von denen ich nichts weiß?

Danke!!!
 

mrBrown

Super-Moderator
Mitarbeiter
Jetzt habe ich noch eine Frage:
Ich kann ja Variablen der Klassen, in der ich die Funktion QUERY aufrufe nicht in der Lambda-Expression verwenden, außer
  • ich mache eine AtomicReference daraus
  • ich mache ein final Array daraus und verwende den eintrag davon
Kann man das eventuell auch noch ändern? Gibts da noch andere Möglichkeiten von denen ich nichts weiß?
Wie meinst du das?
Lokale Variablen müssen halt effective final sein, aber das ist so gut wie immer möglich...
 

mrBrown

Super-Moderator
Mitarbeiter
Ich würde gänzlich darauf verzichten, lokale Variable aus lambdas heraus zu ändern - das wird auf Dauer nur zu Problemen führen ;)

Entweder mit direktem Rückgabewert oder mit einem Lambda, welches keine lokalen Variablen ändern muss ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Wie füge ich mit dem Database Connector etwas hinzu. Datenbankprogrammierung 1
berserkerdq2 database is closed, obwohl ich alle statements in try catch blöcken habe? Datenbankprogrammierung 5
T The database file is locked Datenbankprogrammierung 2
Kirby.exe Sample Database in Postgres laden Datenbankprogrammierung 5
C Java MySQL check if value exists in database Datenbankprogrammierung 2
C Problem with insertion in database. Datenbankprogrammierung 7
B MySQL Data Tools Plattform - "Database Connections" findet den Treiber nicht Datenbankprogrammierung 1
J Java 8 und Microsoft Access Database-Dateien(mdb) Datenbankprogrammierung 1
M Derby/JavaDB Drop Database problem Datenbankprogrammierung 3
C Problem oder Denkfehler mit H2-Database Datenbankprogrammierung 3
S Oracle Database 11g , eclipse , Tabelle erstellen Datenbankprogrammierung 2
P Embedded Database und große Datenmengen Datenbankprogrammierung 23
G Database indexing Datenbankprogrammierung 7
B H2 Database Beispiel Source Code Datenbankprogrammierung 8
H hsqldb - Database must be shutdown Datenbankprogrammierung 10
A Fehlermeldung H2 Database Datenbankprogrammierung 3
A Datensatzsperrung unter H2 Database Datenbankprogrammierung 43
A Fehler beim Starten des Servers für H2 Database Datenbankprogrammierung 13
G Import einer csv-Datei in eine H2-Database Datenbankprogrammierung 12
J Database replication Datenbankprogrammierung 4
E Problem beim laden des JDBC Driver bzw der Database Datenbankprogrammierung 8
J Hibernate create database Datenbankprogrammierung 4
Zrebna Wie mittels Hibernate eine Join-Tabelle als eigene Java-Klasse erstellen? Datenbankprogrammierung 5
S ResultSet als Parameter an andere Klasse übergeben Datenbankprogrammierung 3
I Konzept: Klasse / Entity für Einstellung der Software 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
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
A DB-Klasse für häufig verwendete Aufgaben Datenbankprogrammierung 6
I Keine Treiber-Klasse! Datenbankprogrammierung 9
H Aufbau einer DB-Klasse Datenbankprogrammierung 10
J Klasse für Datensatzblättern in Verbindung mit JTable gesuch Datenbankprogrammierung 6
M Die ganze klasse als eigenen Thread laufen lassen Datenbankprogrammierung 3
G gutes design für db-klasse Datenbankprogrammierung 3
N Datenbank in diese Klasse einfügen Datenbankprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben