Klassen Doppelte werte Filtern XML, Datenbank und DOM

BarBQ

Mitglied
Hi Leute ich habe folgendes Problem.

Ich habe hier eine XML Datei mit mit Daten von Authoren und Büchern, genau genommen sind es knapp 420 Datensätze. Also sie sind immer ein Übergeordneten Tag zugeordnet.

Ich habe 2 Klassen erstellt eine baut eine Verbindung zur Datenbank auf und übergibt die Parameter an die Datenbank. Und die 2. Klasse Parst die XML-Datei mit DOM und sucht die entsprechenden Parameter raus. :rtfm:

Jetzt habe ich folgendes Problem es sind Zwar 420 verschiedene Bücher, aber auf 7 Bücher kommt im Durchschnitt 1 Author, wenn ich das ganze jetzt in die Datenbank schiebe nimmt er jede Author-Daten egal ob Doppelt oder Dreichfach oder nochmehr, einfach mit in die Datenbank.

Wie kann ich das Im grunde verhindern???
die Buchtitel gibt es nur einmal und haben eine ID

ich hatte mir gedacht schon zu filtern beim prepareStatement aufbau
so ungefähr:

Java:
		public static PreparedStatement getAuthor() throws Exception{
			try{
				if(conn == null){}
				if(data1 == null){
				   data1 = conn.prepareStatement(("INSERT INTO authors(_id, name, lowerCaseName, familyName)SELECT ?,?,?,? WHERE NOT EXISTS(SELECT name FROM authors WHERE _id = '?')"));
				} 
			}catch (Exception e){System.err.println("Fehler in der Authoren Klasse - " + e.getMessage());}
			return data1;
		}

kennt vllt einer von euch eine Lösung, ihr seit meine ltzte Hoffnung.

Vielen dank
Gruß
BarBQ :bahnhof:
 
Du kannst es natürlich auch über einen Filter machen.

Ich würde mir eine Map<String, Integer> anlegen, die den Autor-Namen auf seine ID mappt, die er in der Datenbank hat. Also in etwas folgendes (Pseudo-Code):
Java:
private Map<String, Integer> autorCache = new HashMap<>();

public Integer saveAutor(DomObj autor){
  Integer autorId = autorCache.get(autor.getName()); // Per name nach der ID gucken
  
  if(autorId == null){// Wenn id null -> Neuer Autor. Anlegen + ID merken
    autorId = getDatabase().save(autor); // Autor speichern und Id merken
    autoCache.put(autor.getName, autorId ); // Id unter dem Namen ablegen
  }

  return autorId; // Id zurückgeben, um sie bei saveBook(..) als FK nutzen zu können
}

Das halte ich für sehr viel einfacher, als sich ein kompliziertes SQL-Query auszudenken.
 
Zuletzt bearbeitet:
:rtfm:

erstmal Danke für die schnelle Antwort, aber ich hab da noch eine Frage
sieht er sich dann den Namen theoretisch nur 1 mal? auch bei der ersten befüllung???
 
Bzw. weiß ich nicht wie du das meinst 😳

ich hab ja eine Automatisch generierten Schlüssel, also ID
wenn jetzt die XML so aufgebaut ist:

[XML]
<entry id="1">
<title>Buchtitel1</title>
<authors>
<author>Williamson</author>
</authors>
.
.
.
</entry>
[/XML]

und sagen wir, die folgenden <entry> sehen so aus:

[XML]
<entry id="2">
<title>Buchtitel2</title>
<authors>
<author>Williamson</author>
</authors>
.
.
.
</entry>
<entry id="3">
<title>Buchtitel3</title>
<authors>
<author>Williamson</author>
</authors>
.
.
.
</entry>
<entry id="4">
<title>Buchtitel4</title>
<authors>
<author>Williamson</author>
</authors>
.
.
.
</entry>
.
.
.
[/XML]

also mit dem Selben Autor. Die ID wird in der Datenbak generiert

kann ich da nicht irgendwo sagen
Wenn der erste <entry> mit Name Williamson kommt dann z.B. generire Automatisch die ID = 1 und merke sie dir
Wenn zweite <entry> kommt prüfe den Namen und wenn er da ist ignoriere den Tag authors und geh zum nächsten Tag.
und so weiter


:bahnhof::bahnhof::bahnhof::bahnhof::bahnhof:
 

Zurück
Oben