Frage

So arbeite ich an einem Projekt (JSF2, Spring3 Core MVC, Webflow, MyBatis3, Richfaces, und ein Vermächtnis von Oracle 10g). Die Quelle aller meiner Probleme der hat mit dem Design der Datenbank zu tun. Das Problem ist, dass die Mehrheit der DB-Tabellen hat wechselndes Schema (schlechtes Design vielleicht?). Also brauche ich den Zusatz & Entfernung von zusätzlichen Spalten in die Lage zu unterstützen.

Um dies zu unterbringen i Mybatis Pull-Daten in einem benutzerdefinierten „universal“ Domain-Objekt vorgenommen haben, die im Grunde nur eine hashmap erstreckt. Meine aktuelle Ausgabe aktualisiert diese hashmap Objekte. Es sollte ein Weg sein, damit es funktioniert, aber ich kann scheinen Mybatis zu bekommen zusammenarbeiten. Ich habe mit HashMap.entrySet versucht () & Mybatis ist, aber ohne Erfolg. zB.

UPDATE MYTABLE
SET 
<foreach collection="entries" index="i" item="entry" close=""  open="" separator=", ">
  #{entry.key} = #{entry.value}
</foreach>
WHERE FOO='BAR';

Ich habe einen benutzerdefinierten typehandler aber setParameter versucht () gibt mir nicht genug Zugang zu tun, was ich brauche. Ein ResultHandler hat mich nicht genug Zugang zu jedem einzelnen Ergebnis, so dass ich das auch nicht nutzen konnte.

Jetzt weiß ich, ich so etwas wie Obj.createUpdateSqlString tun könnte () und fügen Sie ihn in den Mapper als Zeichenkette, aber das ist ein bisschen wie ein Hack und Blätter mich zu SQL-Injection öffnen. Ganz zu schweigen davon, dass sich bringen würde eine Menge von Strings zu entkommen, und Buchhaltung für eine breite Palette von möglichen Eingabe, und es sei denn, alle Möglichkeiten abgedeckt sind, dass die Tür für einige schwerwiegende Fehler eröffnet.

So gibt es einen etablierten Weg, dies zu tun? Oder atleast eine halbwegs anständige Art und Weise? Ich habe eine Reihe von Hardcore Mybatis Befürwortern gehört sagen, sie habe noch eine Situation begegnen Mybatis nicht ordnungsgemäß umgehen kann; so Mybatis Experten, bitte hilf mir aus !!

War es hilfreich?

Lösung

Es klingt wie sie versuchen, Tabellen mit EAV zu vermeiden.

Sie haben Ihr Gift zu holen, wenn es um dynamisch Hinzufügen von Feldern kommt. EAV ist gut von einer Theorie Standpunkt hat aber ernsthafte Performance-Probleme bei großen Tabellen. Während dynamisch Hinzufügen von Spalten der Abfrageleistung ist besser für Sie müssen mit einem Wicke Schnittstelle und dynamischen SQL beschäftigen. Ich würde die Datenbank ab, als ein schlechtes Design geradezu nicht schreiben.

Sie können den Rahmen zu umgehen möchten Sie verwenden. Abfragen des Tabellenschema (für Oracle Blick auf USER_TAB_COLUMNS) und erzeugt die insert / update-Skripten. Parametrisieren sie, so dass Sie von der Injektion sicher sind. Es wird ein Geduldsspiel, aber ich keine Alternative sehen.

Andere Tipps

Mybatis oder Hibernate beiden Gestank mit verrückter Datenbank schemeas. Ich würde nur SpringJDBC oder ähnliches verwenden.

Versuchen Sie nicht, einen runden Zapfen paßt in ein quadratisches Loch zu machen, auch wenn es eine wirklich schöne runde Zapfen ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top