Статьи

3 типичные ошибки SQL, которые вы, вероятно, делаете как Java-разработчик

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

Их карьера требует долгих рабочих часов и обширных знаний кодирования.

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

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

Здесь мы выделяем некоторые из распространенных ошибок, которые делает разработчик Java при кодировании на SQL.

SELECT TOP 3 common_mistakes FROM SQLProgrammingMistakes;

Результат вышеприведенного запроса выглядит следующим образом:

1.   Не используется пакетное обновление

Забывать о пакетном режиме — это самая большая и самая распространенная ошибка, которую может сделать разработчик Java при написании SQL. Не стоит вставлять тысячи записей в таблицу по одной за раз. Скорее разработчик должен создать пакетный оператор INSERT с одним оператором SQL и различными наборами параметров связывания. Скорость выполнения INSERT в пакетном режиме намного больше, чем выполнение каждого INSERT один за другим.

Давайте разберемся с этим на примере:

String [] queries = {

  “INSERT INTO Employee { Eno, Ename, Ecode, EDept} values (‘1’, ‘Allen’, ‘abc’, ‘Sales’)”,
  “INSERT INTO Employee { Eno, Ename, Ecode, EDept} values (‘2’, ‘Max’, ‘102’, ‘Marketing’)”,
  “INSERT INTO Employee { Eno, Ename, Ecode, EDept} values (‘3’, ‘Ward’, ‘xyz’, ‘Sales’)”,
  “INSERT INTO Employee { Eno, Ename, Ecode, EDept} values (‘4’, ‘Sam’, ‘55’, ‘Marketing’)”,

};

Connection  connection = new getConnection();
Statement statement = connection.createStatement();
for (String query : queries ) {
  statement.execute(query);
}
statement.close();
connection.close();  

Это плохой код. Вы выполняете каждый запрос отдельно. Это попадает в базу данных для каждого оператора вставки.

Вместо того, чтобы отправлять каждый запрос по одному и ждать завершения каждого из них, отправьте пакет вставок в базу данных за один раз:

import java.sql.Connection;

import java.sql.Statement;

//…

Connection connection = new getConnection();
Statement statement = connection.createStatement();
For (Employee employee: employees){
String query = “INSERT INTO Employee (Eno, Ename, Ecode, Edept) values (‘ “ + Employee. getEno()  + “’, ‘” + Employee.getEname() +“’, ‘” + Employee.getEcode() + “’, ‘” + Employee.getEdept() + “’)”; 
statement.addBatch(query);
}

statement. executeBatch();

statement.close();

connection.close();

Пакетирование очень важно при вставке больших наборов данных. Чтобы получить существенное улучшение производительности, когда это возможно, программист должен выполнить один оператор в пакетном режиме. Другой способ выполнить пакетную вставку — использовать объект PreparedStatement. Пакетное обновление не ограничивается только оператором Insert; Вы также можете использовать его для оператора Update и Delete.

2. Неоптимизирующие запросы для СУБД 

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

Например, если Java-программиста просят извлечь всех сотрудников из таблицы Employee, имя которой начинается с «A», они обычно предпочитают использовать функцию LEFT для возврата первого символа имени сотрудника:

SELECT Ename FROM Employee WHERE LEFT (Ename,1) = ‘A’;

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

Он не использует индекс, тем самым занимая много времени при выполнении запроса. Вместо этого программист должен получить результаты, используя запрос:

SELECT Ename FROM Employee WHERE Ename LIKE ‘A%’;

Приведенный выше запрос будет использовать индекс для быстрого и эффективного извлечения данных. Поэтому, как правило, разработчики должны использовать предикаты sargable, где это возможно. Запрос называется саргитивным, если механизм СУБД может использовать индекс для ускорения выполнения запроса.

Лучше убедиться, что все ваши запросы могут обрабатываться, так как несаргируемые запросы оказывают неблагоприятное влияние на время запроса. Итак, убедитесь, что вы оптимизируете свои запросы к движку СУБД.

3.   Неправильный порядок оценки предиката

Многие Java-программисты считают, что запрос обычно обрабатывается в следующем порядке:

ОТ, ГДЕ, ГРУППА ПО, ИМЕЯ, ВЫБЕРИТЕ

Приведенная выше последовательность описывает логический порядок выполнения запроса. Логически, сначала обрабатывается предложение FROM, определяющее исходную таблицу данных для извлечения данных; Далее следуют предикаты WHERE, затем GROUP BY и т. д.

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

Например, рассмотрим следующую таблицу Employee:

Eno

Ename

Ecode

Edept

1

Аллен

азбука

Продажи

2

Максимум

102

маркетинг

3

подопечный

55

маркетинг

4

Сэм

хуг

Продажи

Учитывая приведенную выше таблицу, представьте, что вы хотите получить всех сотрудников отдела маркетинга с кодом сотрудника, превышающим 100. Как правило, в этой ситуации разработчики будут запрашивать таблицу следующим образом:

SELECT Eno, Ecode AS Employee_No,Employee_Code
FROM Employee
WHERE Edept LIKE ‘M%’
  AND CAST (Ecode AS INT) > 100;

Однако приведенный выше запрос приводит к ошибке:

«Преобразование не удалось при преобразовании значения varchar« abc »в тип данных int»

Запрос не выполняется, поскольку, как отмечалось ранее, не существует предписанного порядка выполнения предикатов. В этом случае второй предикат оценивается первым, что приводит к ошибке преобразования.

Вместо этого использование здесь выражения CASE гарантирует, что только допустимые числовые значения будут преобразованы в тип данных INT:

SELECT Eno, Ecode AS Employee_No,Employee_Code
FROM Employee
WHERE Edept LIKE ‘M%’
AND CASE WHEN Ecode NOT LIKE ‘%[^0-9]%’
  THEN CAST (Ecode AS INT)
  END>100;

Заворачивать:

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