Нужна помощь, чтобы MyBatis работал с ужасным дизайном базы данных - PullRequest
2 голосов
/ 06 декабря 2010

Итак, я работаю над проектом (JSF2, Spring3 Core, MVC, Webflow, MyBatis3, RichFaces и устаревшая версия Oracle 10g). Источник всех моих проблем связан с дизайном базы данных. Проблема в том, что большинство таблиц БД имеют изменяющуюся схему (возможно, плохой дизайн?). Поэтому я должен иметь возможность поддерживать добавление и удаление дополнительных столбцов.

Для этого я сделал MyBatis извлекающим данные в пользовательский «универсальный» объект домена, который в основном просто расширяет хэш-карту. Моя текущая проблема обновляет эти объекты hashmap. Должен быть способ заставить это работать, но я могу заставить MyBatis сотрудничать. Я пытался использовать HashMap.entrySet () и MyBatis, но безрезультатно. например.

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

Я попробовал пользовательский TypeHandler, но setParameter () не дает мне достаточно доступа, чтобы делать то, что мне нужно. ResultHandler не дал мне достаточного доступа к каждому отдельному результату, поэтому я тоже не мог его использовать.

Теперь я знаю, что мог бы сделать что-то вроде Obj.createUpdateSqlString () и вставить его в маппер в виде литеральной строки, но это немного взломало и оставило меня открытым для инъекции SQL. Не говоря уже о том, что это потребует избежания множества строк и учета широкого диапазона возможных входных данных, и, если не будут рассмотрены все возможности, это откроет дверь для некоторых серьезных ошибок.

Так есть ли установленный способ сделать это? Или хотя бы на полпути приличного пути? Я слышал, как многие сторонники MyBatis говорят, что им еще предстоит столкнуться с ситуацией, с которой MyBatis не может справиться изящно; поэтому эксперты MyBatis, пожалуйста, помогите мне !!

Ответы [ 2 ]

3 голосов
/ 06 декабря 2010

MyBatis или Hibernate воняют сумасшедшими схемами баз данных. Я бы просто использовал SpringJDBC или подобное.

Не пытайтесь втиснуть круглый колышек в квадратное отверстие, даже если это действительно хороший круглый колышек.

1 голос
/ 06 декабря 2010

Похоже, они пытались избежать использования таблиц EAV.

Вы должны выбрать яд для динамического добавления полей.EAV хорош с теоретической точки зрения, но имеет серьезные проблемы с производительностью больших таблиц.Хотя динамическое добавление столбцов лучше для производительности запросов, вам приходится иметь дело с изменяющимся интерфейсом таблицы и динамическим SQL.Я бы не стал списывать базу данных как плохой дизайн.

Возможно, вы захотите обойти фреймворк, который вы используете.Запросите схему таблицы (для Oracle смотрите USER_TAB_COLUMNS) и сгенерируйте сценарии вставки / обновления.Параметризируйте их, чтобы вы были в безопасности от инъекций.Это будет головная боль, но я не вижу альтернативы.

...