# Alle Records Felder kriegen für DB Abfrage



## Mart (30. Dez 2021)

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

```
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"

```
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 (30. Dez 2021)

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.


----------



## Mart (30. Dez 2021)

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 

sondern jeder record das von haus aus kann


----------



## LimDul (30. Dez 2021)

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

sowas in der Art:


```
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.


----------



## Mart (30. Dez 2021)

sollte man reflection da einsetzen? 

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


----------



## thecain (30. Dez 2021)

Ein Framework ist ja keine "Geschäftslogik"


----------



## Mart (30. Dez 2021)

thecain hat gesagt.:


> Ein Framework ist ja keine "Geschäftslogik"


touche


----------



## Oneixee5 (30. Dez 2021)

Für mich hört sich die Zielstellung nicht nach Recorrds an sondern nach Proxys: https://docs.oracle.com/javase/8/docs/technotes/guides/reflection/proxy.html


----------



## Mart (30. Dez 2021)

ich habe mal versucht meinen Zauber zu wirken mit dem Interface idee

```
public interface DataRecord
{
    public HashMap<String, Object> recordValues();
    public String getTableName();
}
```


```
public final class RapidFXDB
{
    public static void insert(DataRecord record) {
        System.out.println(record.getTableName()+record.recordValues());
    }
}
```


```
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


----------



## Mart (30. Dez 2021)

der Enum ansatz wäre dann halt So

```
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 (30. Dez 2021)

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.


----------



## Mart (30. Dez 2021)

thecain hat gesagt.:


> 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


----------



## Mart (30. Dez 2021)

es wird "eh" in einem unabhängigen package geschrieben und "nicht" vermischt


----------



## thecain (30. Dez 2021)

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.


----------



## Mart (30. Dez 2021)

wollte es universal machen vllt kommt ja noch was dazu


----------

