Этот стиль программирования слишком много? - PullRequest
2 голосов
/ 16 мая 2011

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

Но сегодня я видел, как кто-то пишет код, подобный этому:

public void updateExistedRecord(SgsnMapping sgsnMapping) throws Exception {
        PreparedStatement ps = null;

        try {
            String updateSql = "";
            updateSql += "UPDATE " + schema + "." + tableSgsnMapping + " SET ";
            //other where clause

            ps = dbConn.prepareStatement(updateSql);

            ps.executeUpdate();
        } catch (Exception ex) {
            logger.error("Error when update an existing record on " + tableSgsnMapping + " table.\n" + ex.getMessage(), ex);
            throw ex;
        } finally {
            SqlHelper.close(ps);
        }
    }

Основное внимание уделяется таблице - tableSgsnMappingв другом месте написано так:

private String tableSgsnMapping = ConstantManager.TABLE_SGSN_MAPPING;

В свою очередь, TABLE_SGSN_MAPPING определяется в другом месте:

public final static String TABLE_SGSN_MAPPING = "OBDUA_SGSN_MAPPING";

Разве это не слишком много?Таблица не изменит свое имя, и она всегда будет там.Почему бы просто не кодировать это жестко в программе?Почему?

Ответы [ 3 ]

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

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

И это хорошая идея иметьтекст подготовленного оператора, определенный как постоянная строка в классе, где он используется, с заполнителями для параметров.Например:

private static final String query = 
"update dbName.tableName set field = ? where condition = ?";
1 голос
/ 16 мая 2011

Значение tableSgsnMapping всегда ConstantManager.TABLE_SGSN_MAPPING? Тогда я бы использовал эту константу, возможно, в качестве статического импорта, чтобы сэкономить место. Переназначение его в локальную переменную может сбивать читателей с толку и приводить к ошибкам, если его значение случайно изменяется.

0 голосов
/ 11 февраля 2012

Название таблицы может не измениться, как вы говорите.Но кто знает будущее?

Но мой главный аргумент в пользу ConstantManager.TABLE_SGSN_MAPPING заключается в том, что имена таблиц и столбцов обычно используются несколько раз в разных выражениях и местах кода.Используя константы, вы можете быть уверены, что в one нет опечаток, редко используемых SQL-выражений относительно этих вещей.Мой любимый в этом углу: имя таблицы во множественном числе или нет?(«клиенты» против «клиентов»).Я просто не хочу думать об этом каждый раз снова - используя константы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...