Wieso sollte der Code unübersichtlich sein? Das ist ja nur eine Frage der Schreibweise.
Du kannst ja folgendes haben:
a) Eine Klasse, die nur die Daten eines Datensatzes hält (POJO = Plain Old Java Object)
b) Eine Klasse, die eine Textdatei liest und dann eine Liste der Daten liefert.
c) Nun kann eine Funktion die Datenbank öffnen und für jeden Datensatz in der Liste diesen in die Datenbank eintragen.
Wo Du die Datenbank genau öffnest ist dabei dann auch egal - das kann im Punkt b) sein (halt ausserhalb der for each Schleife und C) bekommt dann die Connection mit) oder es kann in c) sein.
Generell ist folgendes zu bedenken:
Nur weil Du im Code ständig Datenbankverbindungen "öffnest", geschieht dies nicht wirklich! Viele Treiber nutzen ein Connection Pooling, d.h. der Treiber ist zuständig für die Verwaltung der Connections. Wenn eine Connection angefordert wird, dann schaut er, ob noch eine offene Connection da ist. Ist dies der Fall, wird diese Connection geliefert. Ist dies nicht der Fall, dann wird eine neue Verbindung aufgebaut.
Beim Schließen der Verbindung, wird die Verbindung nicht geschlossen sondern landet geöffnet in diesem Pool.
Es ist ein Best Practice bei uns, die Datenbankverbindungen immer nur kurz offen zu halten.
Also unter dem Strich zwei Punkte:
- Sauberes Design ist unabhängig davon möglich, was Du genau machen willst. Eine Aussage wie "Ich will die Connection offen halten" sorgt nicht für schlecht lesbaren Code. Egal was für Anforderungen kommen: Clean Code ist möglich.
- Keine Optimierungen! Nicht versuchen hier etwas zu optimieren a.la. "Ich will die Datenbank offen halten". Gerade bei Dingen, die schon Millionen anderer Entwickler gemacht haben, ist es sehr wahrscheinlich, dass es da schon andere Lösungen gibt (wie hier das Connection Pooling).