Alle Records Felder kriegen für DB Abfrage

M

Mart

Gast
Also ich versuche meine RapidFX api um datenbank abfragen zu erweitern zuerst möchte ich es schaffen es einfach zu machen daten insert auszuführen mit records


zb ich habe diesen record
Java:
record person(String name, int id)
{
    
}
in records sind ja die getter immer public und immer da

jetzt hab ich zb eine andere methode in meiner "datenbank api"
Java:
public void insert(Record record, Table intoTable)
{
    jedes feld und namen bekommen hier dann zb
        -> "name" = "bob"
        -> "id" = 1
    // insert befehl dann "generieren"
        insert [alle Feld namen] into [für anzahl an feld namen ? hinschreiben]
    // prepared statement füllen mit den Werten
}
das ist alles nur pseudo code... ich weis da hängts weiter

die Probleme sind
1. Record record => record ist ja nur ein Keyword.. ist ja eine Ganz normale klasse also das hoppt so nicht
wie kann ich das lösen dass ich trotzdem records benutzen kann?
2. jedes feld und namen bekommen => komme ich im record dann irgendwie da ran OHNE reflection zu benutzen oder ist reflection da genau das richtige? jedoch verliere ich halt dann die automatsiche getter generierung der records => allgemein blöd

wenn ich halt die 2 Probleme lösen könnte , könnte ich den insert befehl für jeden Record hernehmen .. ob der Record für den Insert befehl "valide" ist, ist erstmal egal

ich weis nicht wie ich da ansetzen sollte ich hoffe die allgemeine Beshcreibung des problemes ist genug dargestellt
 

LimDul

Top Contributor
Entweder du kennst im Code die exakten Getter & Namen oder du musst sie dir besorgen und über Reflection arbeiten.

Grundsätzlich kann ein Record ein Interface implementieren und dann könnte man darüber die Records markieren und ggf. auch Methoden bereit stellen, die diese Logik etwas kapseln, aber du kommst nicht drum rum, entweder:
* Es per Reflection auszuwerten
* Im Record eine Methode zu implementieren, die dir eine Map von Typ String, Object (Feldname / Wert) oder String / Supplier (Feldname / Funktion zum lesen des Wertes) liefert.
 
M

Mart

Gast
das ziel ist es pro datenbank tabelle einen Record zu haben dh es muss "universal" sein

Im Record eine Methode zu implementieren, die dir eine Map von Typ String, Object (Feldname / Wert) oder String / Supplier (Feldname / Funktion zum lesen des Wertes) liefert.

das hört sich gut an , nur wie kann ich das so verpacken dass der user das nicht implementieren muss :D

sondern jeder record das von haus aus kann
 

LimDul

Top Contributor
Du könntest das in einem Interface mit Default-Methode anbieten.

sowas in der Art:

Java:
public interface RecordSuperInterface

public default Map<String, Supplier<Object>> getFieldNamesWithDataSupplier() {
  return MyReflectionUtil.getFieldNamesWithDataSupplier(this);
}
Und dann in MyReflectionUtil eine Methode, die ein RecordSuperInterface-Objekt bekommt und darin die ganze Magie per Reflection macht

PS: Apache Commons hat da ggf. schon Utilities, die dir viel Arbeit abnehmen können.
 
M

Mart

Gast
sollte man reflection da einsetzen?

mir "wurde gesagt" dass man reflection nicht in geschäftslogik benutzen "sollte" oder geht da das noch in ordnung?
 
M

Mart

Gast
ich habe mal versucht meinen Zauber zu wirken mit dem Interface idee
Java:
public interface DataRecord
{
    public HashMap<String, Object> recordValues();
    public String getTableName();
}
Java:
public final class RapidFXDB
{
    public static void insert(DataRecord record) {
        System.out.println(record.getTableName()+record.recordValues());
    }
}
Java:
public record RecordTest (String name,String id) implements DataRecord
{
    private static final String TABLE_NAME = "TestTable";
    @Override
    public HashMap<String, Object> recordValues()
    {
        HashMap<String,Object> data = new HashMap<>();
        data.put("id", id);
       data.put("name",name):
        return data;
    }

    @Override
    public String getTableName()
    {
        return TABLE_NAME;
    }

}
ist das ein Guter Ansatz oder Scheiterts schon da?
der string ist halt dann der Spalten Name

eig würde ich da enums erwarten die halt in der toString dann den Spalten Namen hergeben wäre übersichtlicher
bzw im enum dann die insert methode haben


2.te sache ist es "blöd" einfach objekte in der DB zu speichern und nicht die einzelnen daten ich kann mir vorstellen dass das net so "gewollt" ist von der db
 
M

Mart

Gast
der Enum ansatz wäre dann halt So
Java:
public class TestTable
{
    private HashMap<Column, Object> recordValues = new HashMap<>();

    private enum Column
    {
        ID, NAME
    }

    public TestTable()
    {
        recordValues.put(Column.ID, null);
        recordValues.put(Column.NAME, null);
    }

    public void insert(String id, String name)
    {
        recordValues.put(Column.ID, id);
        recordValues.put(Column.NAME, name);
        System.out.println(recordValues);
    }
}
 

thecain

Top Contributor
Ein ORM zu bauen ist nochmal eine ganz andere Geschichte. Ich würde das nicht mit einem Frontend Framework vermischen. Das artet auf jeden Fall aus.
 
M

Mart

Gast
Ein ORM zu bauen ist nochmal eine ganz andere Geschichte. Ich würde das nicht mit einem Frontend Framework vermischen. Das artet auf jeden Fall aus.
ich möchte kein ganzes ORM bauen sondern nur insert und select von 1er Tabelle also keinerlei beziehungen zwischen tabellen


es sollte an sich die Fähigkeit haben
ein Bild Objekt zu speichern und es laden zu können das ist priorität

das ist im moment auch das hauptproblem dass man die Bilder in meinem "framework" nirgends speichern kann dass man die GUI damit aufbauen kann
 

thecain

Top Contributor
Wieso willst du dann dynamische Spalten anhand der Felder des Records? Wenn du schon weisst was du einfügen willst in die Tabelle, brauchst du keine Gererics usw. und kannst das Query einfach schreiben.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I SaaS Applikation: pro Kunde eine Datenbank / Schema oder eine DB für alle Kunden? Datenbankprogrammierung 76
B SQlite Datenbank, trotz Statements wurden nicht alle Zeilen erzeugt? Datenbankprogrammierung 35
berserkerdq2 database is closed, obwohl ich alle statements in try catch blöcken habe? Datenbankprogrammierung 5
L Java- Zähle alle Werte aus der Tabelle von aktiver Zelle Datenbankprogrammierung 12
V SQLite 2 Tabelle vergleichen und alle unterschiede rausgeben Datenbankprogrammierung 1
D Script, um alle 5 secs den Windows Title abzuspeichern Datenbankprogrammierung 4
S select: alle ergebnisse ermitteln Datenbankprogrammierung 5
S Fast alle \ verschwinden Datenbankprogrammierung 4
A Sql Statement - Alle Zahlen größer 9 Datenbankprogrammierung 3
D Alle Werte aus DB auslesen und in Chart darstellen Datenbankprogrammierung 6
C ResultSet enthält nicht alle Daten Datenbankprogrammierung 4
0 Alle Tabellen aus DB lesen Datenbankprogrammierung 2
brainray Bei MySQL alle Datenbanken eines Servers abfragen Datenbankprogrammierung 3
N Oracle DB liefert nicht alle Datensätze Datenbankprogrammierung 3
T SQL Abfrage: Zeige alle Values von bestimmten Tabellen Datenbankprogrammierung 11
S Alle Kunden mit ihren Adressen mit JPQL ausgeben Datenbankprogrammierung 2
A JList nimmt nicht alle Werte aus der DB auf Datenbankprogrammierung 3
G Hilfe: Werte sind alle x2 (oder mehr) nach JOIN Datenbankprogrammierung 13
J Alle Spalten und Zeilen eines ResultSets ausgeben ? Datenbankprogrammierung 2
clemson [SQL] Abfrage --> alle Gruppen, ohne MailConfig Datenbankprogrammierung 10
R JDBC-ODBC: Alle ODBC-Datenquellen ermitteln? Datenbankprogrammierung 4
B Möglichkeit an alle ODBC Namen zu kommen? Datenbankprogrammierung 4
D MySQL Zusammenfassen von Records in ein Record(Merge) Datenbankprogrammierung 7
S Anzahl geänderte Records Datenbankprogrammierung 2
S Leere Felder Datenbankprogrammierung 8
AssELAss Oracle Wildcard-Suche über zwei Felder Datenbankprogrammierung 5
turmaline [Hibernate] NamedQuery nur einzelne Felder Datenbankprogrammierung 3
R Bei Webformular DropDown Felder JA, NEIN! Was für einen Datentyp verwenden? Datenbankprogrammierung 7
G Date und Time Felder? Datenbankprogrammierung 3
W Leere Date-Felder aus DB einlesen Datenbankprogrammierung 4
W Keine leeren Felder bei Access Datenbankprogrammierung 15
L DB Felder in einem Array speichern und wieder auslesen Datenbankprogrammierung 11

Ähnliche Java Themen


Oben