Чрезвычайно динамические запросы с MyBatis для удаленной фильтрации / разбивки на страницы сетки / сортировки - PullRequest
1 голос
/ 28 февраля 2012

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

В настоящее время наш бэкэнд находится на PHP, и мы используем прямой SQL.Я написал оболочку SQL в PHP, которая принимала бы запрос, список фильтров, информацию о сортировке и информацию о странице и выводила запрос, который имел соответствующие функции WHERE, ORDER BY и нумерацию страниц, используя исходный запрос в качестве подзапроса.Должен отметить, что наш проект привязан к Oracle.

Фильтры могут быть представлены в виде сравнений (=, <, <=,> =,>, IS NULL) или списков (IN ()) и сортировки.это просто один столбец с направлением.Нумерация страниц - это начальное и конечное число.

Короче говоря, мы движемся к архитектуре на основе Java с использованием Spring и MyBatis.Мне трудно понять, как легко реализовать ту же функциональность с помощью MyBatis.Приятной особенностью обертки было то, что нам нужно было написать наш базовый запрос только один раз, и тогда он трансформировался бы в любой запрос, необходимый для сетки.Поскольку речь идет о потенциально десятках тысяч записей, и нам нужно разбить на страницы, вытащить что-то обратно на сервер и выполнить фильтрацию / сортировку на основе Java на самом деле не вариант.

Кто-нибудь решил эту проблему (илипохоже) проблема раньше?Я видел возможности динамического SQL в MyBatis (кратко), но, похоже, он не обладает достаточной гибкостью и мощью, которые мне нужны.Я не прав?

Буду признателен за любые рекомендации опытных пользователей MyBatis.

Я должен отметить, что мы сейчас в поиске и что использование ORM не совсем не обсуждается.Это легче сделать, скажем, с помощью Hibernate?

1 Ответ

2 голосов
/ 29 февраля 2012

Я делаю почти то же самое (просто использую Guice вместо Spring), плюс мой запрос является иерархическим (результаты показаны в древовидной таблице), что очень усложняет ситуацию.

Я думаю, что MyBatis может сделать этомило.Однако для динамической части запроса я бы выделил MyBatis и реализовал его так же, как вы, вероятно, сделали с PHP: сгенерируйте части WHERE и ORDER BY вашего оператора в Java.

Определите карту результата mybatis дляВаш базовый запрос и сам базовый запрос в многократно используемом фрагменте, а затем используйте подстановку String непосредственно в файле сопоставления:

Примерно так:

<resultMap id="TaskMap" type="de.foobar.dtos.TaskDto">
    <id column="id" property="id"/>
    <result column="description" property="description"/>
    ...
</resultMap>

<sql id="baseQuery">
    select id, description from tasks
</sql>

<select id="selectSingle" resultMap="Task2Map">
    select bq.*
    from (
            <include refid="baseQuery"/>
         ) bq
    where bq.id = #{id}
</select>

<select id="selectAll" resultMap="Task2Map">
    select bq.*
    from (
            <include refid="baseQuery"/>
         ) bq
    where ${filterClause}
    order by ${orderByClause}
</select>

Для нумерации страниц вам придется обернутьдругой подзапрос для использования странной конструкции oracle rownum (но вы, вероятно, уже делаете это в любом случае).

Также, конечно, применяется обычное предупреждение: синтаксис $ {} в MyBatis выполняет подстановку строк (а не параметрыподготовленный оператор), поэтому будьте осторожны при дезинфекции пользовательского ввода, чтобы избежать внедрения SQL.

...