Работа с уродливым SQL в Java - PullRequest
       10

Работа с уродливым SQL в Java

0 голосов
/ 17 декабря 2009

Здесь идет вопрос о стиле кодирования SQL-Java ...

Как другие здесь имеют дело с созданием сложных пользовательских запросов в Java cleanly ?

Я говорю о, казалось бы, простой задаче подготовки строки, которая является оператором SQL для выполнения.

Мне известны HQL, а также хранимые процедуры, но, честно говоря, я не очень люблю эти решения. Возможно, я могу быть убежден по-другому. Хранимые процедуры раздражают в развертывании / обслуживании, и производительность синтаксического анализа в моем случае не такая уж большая проблема - гибкость имеет приоритет. HQL кажется большим скачком и имеет некоторые ограничения для моих сложных запросов.

Чтобы быть ясным, я говорю о супер уродливом коде, подобном этому:

    return 
        "(" + topTwenty + ")" +
        "UNION " +
        "(" + twentyBeforeMe + ")" +
        "UNION " +
        "(" + meDummyQuery + ")" +
        "UNION " +
        "(" + twentyAfterMe + ")";

Например, переменные topTwenty также являются подзапросами, созданными аналогичным образом.

Я никогда не думал, что скажу это, но в PHP это было чище, в строку входили многострочные строки и $ переменная.

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

Ответы [ 6 ]

6 голосов
/ 17 декабря 2009

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

3 голосов
/ 17 декабря 2009

Возможно, вы захотите посмотреть на параметризацию ваших запросов, которую вы можете сделать с помощью JDBC PreparedStatement s. Если вы пришли из мира PHP, это аналог PDO. В принципе. все ваши динамические $variable s из строки PHP, на которую вы ссылались выше, будут ? s в параметризованном запросе. ? s подставляется безопасным (читается правильное экранирование ) способом реализации PreparedStatement.

См. Учебное пособие Sun PreparedStatement для примеров и дальнейшего объяснения.

2 голосов
/ 17 декабря 2009

В Java есть класс PrintFormat, который очень похож на sprintf в C, вы можете использовать его для форматирования запроса.

Следующий фрагмент кода взят из http://java.sun.com/developer/technicalArticles/Programming/sprintf/

System.out.println(
new PrintfFormat("Pre %s Post%%").sprintf("target")
);  
1 голос
/ 17 декабря 2009

Что я делаю, это использую String.format для имен таблиц и вещей, которые не могут быть параметризованы, и этот класс (NamedPreparedStament), который позволяет использовать хорошие имена для переменных связывания вместо вопросительных знаков .

String sql = "SELECT id FROM %s WHERE id > :lastInsertedYesterday ";
NamedParameterStatement p = new NamedParameterStatement(con, 
                                    String.format(sql, "table1"));
p.setInt("lastInsertedYesterday", lastOne);
1 голос
/ 17 декабря 2009

SQL Construction Set , кстати, это мой проект.

0 голосов
/ 17 декабря 2009

Вы можете попробовать использовать StringBuilder.append (), если считаете, что ваш код будет выглядеть чище:

return new StringBuilder()
   .append("(").append(topTwenty).append(")")
   .toString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...