Видове изявления

Вече видяхме най-простия интерфейс на Statement . И въпреки че е доста подходящ за работа, той не е толкова подходящ за сложни заявки. В някои източници се изразява мнението, че изобщо не е необходимо да се използва Statement - instead of това са подходящи по-сложни и по-богати на функционалности интерфейси.

  • PreparedStatement
  • CallableStatement

Възниква съвсем резонен въпрос - защо са необходими тези интерфейси? Нека да го разберем.

Първо, ще разгледаме интерфейса PreparedStatement и други функции на JDBC. По-късно ще се обърнем към интерфейса CallableStatement - неговото използване, първо, не е толкова често, и второ, след всичко разгледано за него, разговорът вече може да бъде доста кратък.

Освен това PreparedStatement е голяма помощ от популярния подход за хакване на бази данни, наречен SQL инжекция.

Но повече за това малко по-късно.

PreparedStatement

Ако се опитате да преведете името PreparedStatement , можете да получите нещо като „подготвено изявление“. Най-важната дума тук е „подготвен“. Какво е "подготвеност"?

Преди да разгледаме този въпрос, предлагам да видим един доста важен момент от гледна точка на удобството, който се среща много често. Така че в някое приложение трябва да вмъкнем данни за контакт в tableта CONTACT. За да направим това, трябва да подготвим заявка като тази:

INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL) VALUES (‘Harry’,'Potter','+79112345678','harry@example.com);

На пръв поглед изглежда, че всичко не е толкова трудно и страшно. Трябва да напишем code, който ще събере необходимия низ от параметрите: име, фамorя, address и телефонен номер. Просто трябва да запомните, че всички низови данни трябва да бъдат заобиколени от един символ в кавички.

Ако направим това в отделна функция, тогава ще получим нещо подобно:

public String buildInsert(String firstName,, String lastName, String phone, String email) {
    String sql = "INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL)+
             	”VALUES ('" + firstName + "','" + lastName + "','" + phone + "','" + email + ")";
    return sql;
}

Подаваме името, фамorята, телефонния номер и address във функцията за параметри във формуляра и от тях съставяме низ на SQL заявка. Цитатите малко развалят картината, но засега не е страшно.

Добре, Howво ще кажете за числата? Не е необходимо да бъдат заобиколени от кавички. Opanki, в единия случай ти трябват цитати, в другия не. Ситуацията се усложнява.

Сега нека добавим още един проблем - Howво ще стане, ако има обикновена кавичка (и дори не такава) вътре в низа? Първо трябва да потърсите такива котировки и да ги обработите. Мдааа. НяHow си започваме да се чувстваме неудобно.

Ако сега добавим обработка на дати, тогава задачата става напълно скучна - трябва да свършите огромно количество работа. Като цяло датите са неприятни - различните SQL сървъри приемат различни формати за дати.

И така, Howво виждаме? Ако трябва да използваме параметри вътре в заявката, тогава ръчното изграждане на заявката става много неприятно. И не просто неприятен – дори бих казал скучен. Има огромен брой случаи за разглеждане, а това е ужасно скучна работа. По принцип именно за такива случаи е предложен интерфейсът PreparedStatement .

Тази заявка ви позволява да направите две неща:

  • Подгответе предварително заявка, като посочите местата, където ще бъдат заменени параметрите
  • Задайте параметри от определен тип и след това изпълнете заявка с вече зададени параметри

Пример за PreparedStatement

Структурата за PreparedStatement за нашата опция за задаване на параметри ще изглежда така:

// Example variables
String firstName = "Harry";
String lastName = "Potter";
String phone = "+12871112233";
String email = "harry@example.com";

// Request with indication of places for parameters in the form of "?"
String sql = "INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL) VALUES (?, ?, ?, ?)";

// Create a request. The con variable is an object of type Connection
PreparedStatement stmt = con.prepareStatement(sql);

// Set parameters
stmt.setString(1, firstName);
stmt.setString(2, lastName);
stmt.setString(3, phone);
stmt.setString(4, email);

// Execute the request
stmt.executeUpdate();

Както можете да видите, всичко е съвсем просто.

Първо, когато пишете SQL заявка, местата, където параметрите ще трябва да бъдат заменени, се изписват с въпросителни знаци - "?".

Второ, заявката се създава чрез извикване на con.prepareStatement() .

На трето място, настройката на параметрите минава през посочване на число и стойност. Имайте предвид, че броят на параметрите започва от 1, а не от 0, Howто сме свикнали при работа с масиви и колекции.

Интерфейсът PreparedStatement съдържа методи за задаване на низове — setString() , за задаване на числа — setInt() , setLong() , setDouble() , за задаване на дати — setDate() . И по-сложни типове - това се вижда в documentацията.

Четвърто, извикването на stmt.executeUpdate() вече е изпълнено без посочване на низа на заявката.

Горещо препоръчвам да се сприятелите с PreparedStatement - това е много ефективен инструмент.