Мне сказали сегодня, что правильное решение - не создавать параметризованные сопоставители, как показано ниже, а вместо этого иметь отдельные запросы для каждой функции сопоставления. В основном, чтобы не проверять нулевые или другие условия для создания другого запроса.
Мне также сказали, что если я изменю запрос, который запускается на основе параметров, таких как startIdx и broadcastOnly ниже, то я не могу проверить эту логикуиспользуя юнит-тесты.
Мне пришлось бы проводить интеграционные тесты, которых у нас нет.
Поэтому мне сказали, что предпочтительнее перенести всю эту логику на уровень обслуживания. Однако, если я выполняю другой запрос, основанный на служебной логике, и не имею таких логических операторов в коде mybatis, то мне понадобится много, много функций, вызывающих соответствующую в правильной ситуации.
Должен ли я действительно удалять эти условия из запросов и каждый раз выполнять отдельный вызов другой функции на основе логики обслуживания?
считается ли наличие этих условий внутри картографа имеющей бизнес-логику на уровне базы данных? Я не был уверен, что люди имели в виду операторы переключения базы данных, когда говорят о бизнес-логике на уровне базы данных, или они включают маппер в определение «уровня базы данных».
Я хочу научиться делать что-топравильно, но я привык иметь ORM обрабатывать вещи для меня. кажется, они думают, что наличие логики в генерации запроса приведет к тому, что его будет сложно поддерживать и невозможно выполнить код модульного тестирования. Я гибкий человек и хочу совершенствоваться, поэтому, пожалуйста, дайте мне несколько советов
<select id="getNotificationsListSize" resultType="long">
select count(*)
from notification n
join notification_box nb on notification_idx = n.idx
where
n.status = 'ACTIVE'
<if test="startDate != null">
and nb.received_date >= #{startDate}
</if>
<choose>
<when test="broadcastOnly">
and (nb.account_idx = -1)
</when>
<otherwise>
and (nb.account_idx = -1 or nb.account_idx = #{accountId})
</otherwise>
</choose>
<if test="useStartIdx">
and nb.idx >= #{startIdx}
</if>
</select>