Подготовка не работает с последовательным вопросительным знаком [дубликат]

Java допускает пустой блок в любом месте, где разрешен блок-оператор. Я уверен, что это общее правило для всех блоков упрощает компилятор.

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

while (condition);
{
    statement;
    statement;
}

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

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

if (condition1) {
    do_action_1();
}
else if (condition2) {
    //nothing really to do in this case
}
else if (condition3) {
    do_action2();
}
else {
    do_action3();
}

В приведенном выше примере вы хотите иметь возможность разделить различные условия. Помните, что эти условия могут быть перекрывающимися, поэтому не всегда возможно изменить порядок. Если одному из условий действительно ничего не нужно, то хорошо, что Java позволяет вам иметь пустой блок. В противном случае языку понадобится некоторая форма метода «noop» для использования, когда вы действительно ничего не хотите делать.

Я лично предпочел бы явный оператор noop, но это не так, как определена Java.

15
задан Vikdor 14 September 2012 в 19:45
поделиться

3 ответа

Заполнители ? могут использоваться только для значений параметров, но не для указаний столбцов и порядков сортировки. Таким образом, стандартный способ сделать это, как указано, например, здесь использовать String # format () или что-то похожее на добавление вашего имени столбца и значения порядка в ваш запрос.

Другой вариант - использовать Spring Data JPA, где вы можете передать вашему методу в качестве аргумента экземпляр типа Sort , который может содержать всю необходимую информацию для сортировки базы данных.

16
ответ дан Community 20 August 2018 в 10:32
поделиться

Мое предложение - это отображение ключей и столбцов. Это безопасное решение.

Сначала мы начинаем нашу карту простейшим способом. Для удобства я перегрузил метод get (Obiect key), чтобы вернуть столбец по умолчанию («fullName») в случае отказа. Это будет защищать от SqlExeption.

    static Map<String,String> sortCol;
{
    sortCol = new HashMap<String, String>(){
        {//Enter all data for mapping
            put("name","fullName");
            put("rok","year");
            put("rate","likes");
            put("count-rate","countRate");

        }
        /**
         * 
         * @param key for column name
         * @return column name otherwise default "fullName"
         */
        @Override
        public String get(Object key) {
            String col =super.get(key);
            return null==col?"fullName":col;
        }
    };
}

Вот простой пример использования.

String sqlQuery= "Select \"fullName\",year,likes,count-rate, country ..."+
 "from  blaBla..."+
 "where blaBla..."+
 "order by "+sortCol.get("keySort") "\n"; // keySort can have the value name, count-rate etc .. 

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

0
ответ дан Adam111p 20 August 2018 в 10:32
поделиться

Я бы просто связал имя столбца и порядок с SQL-запросом, но только после того, как

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

Я считаю, что это эффективно по сравнению с получением результатов на прикладном уровне и их сортировкой здесь.

2
ответ дан Vikdor 20 August 2018 в 10:32
поделиться
Другие вопросы по тегам:

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