Java - Хранящий SQL-операторы во внешнем [закрытом] файле

Я думаю, что John имеет верное представление. Ваше рассмотрение Ваших отношений класса как создание модель , которая является тем, что они пытаются заставить Вас делать, когда они начинают преподавать Вам принципалы ООП. Действительно, Ваш более обеспеченный взгляд на то, как вещи функционируют в терминах коды архитектура . Таким образом, что является лучшим способом для других программистов (или Вы), чтобы снова использовать Ваш код, не повреждая его или имеющий необходимость посмотреть на реализацию для наблюдения то, что это делает.

я нашел, что наследование часто повреждает идеал "черного квадрата", поэтому если сокрытие информации важно, это не может быть лучший способ пойти. Я все больше находил, что наследование лучше для обеспечения единого интерфейса, чем это для многократного использования компонентов в других местах.

, Конечно, каждая ситуация уникальна, и нет никакого корректного способа принять это решение, только эмпирические правила.

46
задан Tapas Bose 29 January 2013 в 15:41
поделиться

8 ответов

Просто создайте простой файл свойств Java с парами ключ-значение, подобными этой:

users.select.all = select * from user

Объявите частное поле типа Properties в вашем DAO class и введите его, используя конфигурацию Spring, которая будет считывать значения из файла.

UPDATE : если вы хотите поддерживать операторы SQL в нескольких строках, используйте эту нотацию:

users.select.all.0 = select *
users.select.all.1 = from   user
58
ответ дан 26 November 2019 в 20:20
поделиться

Когда мы столкнулись с этой проблемой, мы реализовали простое решение: вынести SQL / DML в файл (mySql.properties), а затем использовать MessageFormat.format (String [] args) для динамического внедрения. свойства в SQL.

Например: mySql.properties:[12100 sizesUtility методы:

public static String format(String template, Object[] args) {
    String cleanedTemplate = replaceSingleQuotes(template);
    MessageFormat mf = new MessageFormat(cleanedTemplate);
    String output = mf.format(args);
    return output;
}
private static String replaceSingleQuotes(String template) {
    String cleaned = template.replace("'", "''");
    return cleaned;
}

Затем используйте его так:

String sqlString = youStringReaderImpl("/path/to/file");
String parsedSql = format(sqlString, new String[] {"bob"});
7
ответ дан 26 November 2019 в 20:20
поделиться

Я настоятельно рекомендую вам использовать хранимые процедуры. Именно для этого они нужны.

1
ответ дан 26 November 2019 в 20:20
поделиться

Для этого вы можете использовать средства локализации. Затем вы используете имя базы данных в качестве языкового стандарта, чтобы получить "оракульскую" версию "insert-foo-in-bar" вместо английской или французской версии.

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

1
ответ дан 26 November 2019 в 20:20
поделиться

Если вы должны сделать это, вам следует посмотреть проект MyBatis . Я не использовал это, но слышал, что это рекомендовано несколько раз.

Разделение SQL и Java - не мой любимый подход, поскольку SQL на самом деле является кодом и тесно связан с Java-кодом, который его вызывает. Поддержание и отладка разделенного кода может быть сложной задачей.

Абсолютно не используйте для этого сохраненные процедуры. Их следует использовать только для повышения производительности за счет уменьшения трафика между БД и приложением.

8
ответ дан 26 November 2019 в 20:20
поделиться

You can also use the QueryLoader class in Apache Commons DbUtils, which will read the sql from a properties file. However, you will have to use DbUtils which sort of serves the same purpose as the JDBCTemplate.

5
ответ дан 26 November 2019 в 20:20
поделиться

Вы можете использовать скорость для создания "скриптовых" sql-шаблонов, которые можно использовать для гибкой работы с файлами. У вас есть примитивные операторы, такие как условные выражения и циклы, для создания ваших команд sql.

Но я настоятельно рекомендую использовать подготовленные операторы и / или хранимые процедуры. Построение SQL так, как вы планируете, сделает вас уязвимым для внедрения SQL, сервер БД не сможет кэшировать запросы sql (что приведет к снижению производительности).

BTW: вы можете сохранить определение подготовленные заявления в файлах тоже. Это не лучшее решение, но оно довольно близко к нему, и вы получаете преимущество защиты и производительности от SQL-инъекций.

Если ваша схема SQL не построена для работы с подготовленными операторами или хранимыми процедурами, вы можете пересмотреть свою схему. Может быть, его нужно реорганизовать.

0
ответ дан 26 November 2019 в 20:20
поделиться

Вы можете использовать Spring и хранить ваши sql-операторы в вашем файле bean-компонентов, которые вводятся, когда вы получаете класс из вашей bean-фабрики. Этот класс также может использовать экземпляр SimpleJDBCTemplate, который можно настроить через файл bean-компонента, чтобы упростить ваш код.

3
ответ дан 26 November 2019 в 20:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: