Pull to refresh

Comments 14

Как итог

На ровном месте получил кучу геморроя с необходимостью самостоятельного экранирования входящих строк и прочих прелестей борьбы с sql-инъекцией. А также невозможности оптимизации запросов планировщиком.

Нечто подобное в одном проекте реализовывал на freemarker. Но там препроцессинг на основе переданных параметров просто вырезал лишние куски запроса. Шаблон, грубо говоря, содержал запрос со всеми возможными параметрами, но если какой-то из них отсутствовал, то его подстановка в конечный запрос вырезалась.

Получалось примерно следующее.

select *
  from person p
  where 1 = 1
    <if test="name">and p.name = :name</if>
    <if test="age">and p.age > :age</if>

"1 = 1", конечно, не нужно, если имеются какие-либо обязательные условия, которые должны присутствовать в каждом запросе.

P.S. За корректность синтаксиса тэгов не ручаюсь :).

Хотелось бы затронуть тему экранирования подставляемых значений, в некотрых случаях это значения колонок для фильтрации, где-то куски SQL. Или за экранирование полностью отвечает пользователь?

да, за экранирование отвечает пользователь. Так же спецсимволы могут перекодироваться в UNICODE, поэтому для безопасности я еще прогонял итоговый Writer через HtmlUtils.htmlUnescape();

jdbcTemplate.query(htmlUnescape(writer.toString())

Очень похоже на мой взгляд) я бы не стал изобретать велосипед, посмотрите mybatis, он делает как раз то что вам нужно исходя из этой статьи.

да, я знаю про mybatis, и даже работал с ним, но как я помню, там нельзя например вставить целые куски, там вроде по пропертям работа идет.

Тут же я описал поверхностно, здесь вы сами себе шаблон генерируете, и можете вставить даже пол слова) sel {{ var1 }} from; var1="ect";

Поэтому считать это велосипедом некорректно)

можно и куски, и циклы и if-ы, просто надо использовать xml мапперы а не аннотации.

Вообще в спринге из коробки есть SpEL и совершенно непонятно, чего б его не применить.

Во-вторых, как уже справедливо отметили выше, для параметров запросов есть параметры.

про другое рассказывать нельзя теперь? Есть spring, mybaris, все караул, рассказали про другое ?

Ну юзайте спринг, кто не дает -то:) мне вот он не помог в решении задачи.

Основная претензия в том, что приходишь на проект, а там куча самописных велосипедов, которые никто не поддерживает и потом приходится банальные вещи не стандартными средствами, а через одно место делать)

Ну когда самописный велосипед, это одно:) а тут готовое решение, понятно что есть аналоги, но может кому-то и этот поможет) ведь на это и заточен статьи, чтобы могли выбрать и сравнить) просто часто к статьям вижу комменты, что нафиг эта статья ведь есть тота, тота, тота. Почему просто плюсануть нельзя и сказать круто, но так же есть такие-то аналоги. :)

"Ну юзайте спринг"

Так и вы его сами используете.

Так я про конкретную фичу, статья же не про спринг)

Sign up to leave a comment.