- •Доступ до баз даних з Java
- •Завантаження та реєстрація jdbc-драйвера
- •Формування jdbc-url-рядка
- •Отримання екземпляра об’єкта класу Connection
- •Формування sql запиту
- •Виконання і обробка sql-запиту
- •Закриття одержаних з'єднань (ResultSet, Statament, Connection)
- •Попередньо відкомпільовані (підготовлені) запити
- •Пакетное выполнение sql запросов
- •Вызов хранимых процедур и функций
- •Замечание об исключениях
Попередньо відкомпільовані (підготовлені) запити
При необхідності виконання схожих SQL-операторів декілька разів використання підготовлених операторів виявляється більш ефективнішим, ніж виконання кожного разу одного і того ж оператора із різними значеннями параметрів. Створюється параметризований оператор стандартного виду, який надсилається БД на компіляцію перед тим, як він використовуватиметься. Для позначення місць у запиті, де підставлятимуться реальні значення параметрів, використовують знаки питання. Кожного разу при використанні підготовлених операторів достатньо замінити один з параметрів за допомогою методів setXxx. Потім викликається метод executeQuery або executeUpadate.
Приклад:
. . .
Connection connection = DriverManager.getConnection(URL, username, password);
String Template = “UPDATE employees SET Salary = ? WHERE id = ?”;
PrearedStatement statement = connection.prepareStatement(template);
Float[] newSalaries = getNewSalaries();
Int[] employeeIDs = getIDs();
for(int i=0; i<employeeIDs.length; i++)
{
statement.setFloat(1, newSalaries[i]);
statement.setInt(2, employeeIDs[i]);
statement.execute();
}
. . .
Пакетное выполнение sql запросов
Иногда требуется выполнить несколько SQL запросов один за другим скажем: вставить запись, обновить другую запись и т. д. Для таких случаев принято использовать механизм пакетного (batch) выполнения SQL запросов:
st = con.createStatement();
st.addBatch("INSERT INTO CUSTOMER VALUES (10, 'John', 1000)");
st.addBatch("UPDATE CUSTOMER SET SALARY = 250 WHERE ID = 1");
st.addBatch("UPDATE CUSTOMER SET SALARY = 350 WHERE ID = 2");
int[] results = st.executeBatch();
Результатом выполнения будет массив целых чисел, каждый элемент массива соотвествует одному запросу, значения элементов расшифровываются так:
больше или равно «0» выполнение успешное и количество обновленных записей равно значению элемента;
«-2» выполнение успешное, но количество записей затронутых обновлением неизвестно;
«-3» выполнение неуспешное, но при этом выполнение следующей команды в пакете продолжено.
Вызов хранимых процедур и функций
Вряд ли сейчас можно представить работу с базами данных без использования хранимых процедур и функций, которые выполняются на стороне сервера базы данных и являются неотьемлемой частью современной СУБД.
Рассмотрим пример использования хранимой функции getSumSalary, возвращающей сумму полей SALARY для всех ID, которые меньше величины указанной в аргументе. Для вызова хранимой процедуры/функции используется субинтерфейс PreparedStatement — CallableStatement. Пример вызова нашей хранимой функции будет выглядеть так:
CallableStatement cst = con.callableStatement("{? = call getSumSalary(?)}");
cst.setInt(2, 10);
cst.registerOutParameter(1, java.sql.Types.DOUBLE);
cst.execute();
System.out.println("Sum salary for id < 10 = " + cst.getDouble(1));
Следует обратить внимание на фигурные скобки — это часть синтаксиса вызова хранимых процедур. В некоторых случаях синтаксис вызова хранимых процедур может отличаться, например указанный пример для Oracle можно написать и так:
{begin :1 = getSumSalary(:2); end;}