Ibatis не является полноценной средой ORM, поэтому он не знает об отношениях объектов.
Так что да, вы должны написать что-то вроде вашего INSERT , если вы хотите работать непосредственно с объектами домена, которые не полностью соответствуют записи в вашей таблице; то есть, если объект User, который вы отображаете в Ibatis, не имеет метода getUsertypeId()
(который возвращает значение, соответствующее столбцу таблицы usertype_id), а вместо этого getUserType()
метод.
(Конечно, вы также можете написать getUsertypeId()
метод, который внутренне вызывает getUserType().getId()
..., но просто остановитесь здесь и не претендуйте также на setUserTypeId(int id
), который внутренне пытается загрузить UsertypeId из БД, и т. Д., И т. Д. ... что требует неприятностей. Вы закончите заново изобретать JPA / Hibernate.)
Я не думаю, что TypeHandler является правильным подходом, эта функция больше ориентирована на преобразование нетривиальных типов, а не столько для обработки отношений.
Другой верный подход - иметь слой относительно низкоуровневых POJO, примерно по одному для каждой таблицы, со свойствами, которые отображаются непосредственно на столбцы вашей таблицы (скажем, объект UserDb
со свойством userTypeId
и нет getUserType()
метода, и нет делового интеллекта, зависимостей от верхних уровней или постоянных знаний), а затем, кроме того, слоя более богатых «реальных» доменных объектов, каждый из которых оборачивает (обычно небольшой) граф этих «тупой» POJO и обладает интеллектом, необходимым для вызова уровня персистентности (например, DAO) для загрузки / сохранения графика (возможно, лениво).
Одним из преимуществ этого подхода является то, что ядро реальных отображений ibatis (кодирование SQL) может быть выполнено довольно автоматически с помощью Ibator - он даже создает код POJO из схемы БД.
Для массового чтения данных, которое включает в себя множество таблиц (отчетов), вы можете создавать другие тривиальные специальные POJO (которые соответствуют непосредственно столбцам вашего SELECT и, возможно, имеют некоторый элементарный интеллект для отображения значений - что-то вроде '' ViewModel ') ... или даже HashMaps.
PS: Возможно, вы захотите прочитать о DDD (и таких понятиях, как «сущности», «объекты значений», «представления», «контексты», «объект расширенного домена» и «объекты анемичного домена» например ). Ibatis дает вам большую гибкость для обучения и реализации в этом направлении.