Нужно помочь сделать MyBatis работать с ужасным дизайном базы данных

StackOverflow https://stackoverflow.com/questions/4369895

Вопрос

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

Чтобы приспособиться к этому, я сделал MyBatis Data в пользовательский «универсальный» объект домена, который в основном просто продлевает Hashmap. Моя текущая проблема обновляет эти объекты 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';

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top