Видове изявления
Вече видяхме най-простия интерфейс на 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 - това е много ефективен инструмент.
GO TO FULL VERSION