JDBC statements, EasyJava

Java у прикладах для початківців

statements

statements
Інтерфейс JDBC орієнтований працювати з декларативними текстовими запитами (простіше кажучи — з sql запитами). Однак, маючи вже встановлене з'єднання з базою, безпосередньо відправити запит не можна. Спочатку необхідно отримати з'єднання об'єкт запиту і працювати з ним.

Об'єкт запиту виходить простим зверненням до об'єкта з'єднання:

У інтерфейсу Statement є три основні способи: executeQuery ( ) , executeUpdate ( ) і execute ( ) . Перший метод орієнтовано запити, повертають дані (select запити) і повертає об'єкт даних (result set). Другий метод, executeUpdate ( ) , служить виконання запитів не повертають даних, як-от insert чи update. Цей метод повертає кількість рядків, які торкнулися запиту. Останній метод, execute ( ) , підходить для всіх типів запитів і своїм значенням повідомляє, чи повернув запит дані чи ні: true якщо запит повернув дані і false якщо ні. У першому випадку об'єкт Statement може запитати отриманий ResultSet викликом методу getResultSet ( ) .

Примірник Statement можна використовувати кілька разів і, використовуючи той самий об'єкт, виконувати кілька запитів. Є одна умова — оскільки об'єкт ResultSet жорстко прив'язаний до Statement , що його породив, то будь-який наступний запит закриває раніше створений ResultSet і, якщо потрібно, створює новий ResultSet . Таким чином, якщо потрібно одночасно працювати з кількома ResultSet, необхідно мати і декілька Statement.

Підпорядкованийдержавний

Головним недоліком інтерфейсу Statement я назвав би необхідність передавати весь запит цілком у вигляді рядка, з параметрами і даними. По-перше, це призводить до незграбних конструкцій виду "INSERT INTOORDER_ITEMS (CLIENT_ID, ORDER_ID, ITEM_ID) values ​​(1, 1, " + i + ")" По-друге, при формуванні такого запиту дуже легко помилитися, особливо якщо він збирається з кілька рядків і довше мого прикладу раз на п'ять. третє, це прямий шлях до SQL ін'єкції, що в 21м столітті право слово смішно.

Для вирішення цих проблем у JDBC передбачено інтерфейс PreparedStatement, який розширює Statement. Створюється він також з об'єкта з'єднання, причому при створенні відразу потрібно передати запит. Запит цей може (і, швидше за все, буде) містити параметри, які на момент створення запиту невідомі і будуть встановлені пізніше.

Використання PreparedStatement дозволяє вбити відразу невелику зграйку зайців: запит один раз компілюється та оптимізується на боці бази даних; параметри передаються безпечно і не можуть викликати ін'єкцію sql; код стає читальнішим і запит простіше перевикористовувати: