Использование JDBC
Сначала мы создаем объект Statement, а затем используем метод executeQuery этого объекта для выполнения запроса SELECT * FROM books. Возвращенный запросом объект ResultSet используется для вывода полученной информации.
Объект ResultSet предоставляет основной интерфейс выборки из базы данных. Он обладает двумя основными возможностями: возможностью последовательного перебора полученных записей и возможностью возвращения значения заданного поля текущей записи. Принцип перебора такой же, как в стандартных перечислениях Java: вы начинаете перебор в позиции перед первым элементом и последовательно переходите к следующему элементу методом next.
Метод next возвращает true в том случае, если объект ResultSet успешно перешел к следующей записи (то есть в итоговом наборе еще остались необработанные записи). Цикл whiIe в листинге 12.4 выводит значение первого поля каждой из возвращаемых записей. Если итоговый набор не содержит ни одной записи, первый же вызов next вернет false и программа ничего не выведет.
Класс ResultSet может возвращать значения различных типов; в листинге 12.4 первое поле интерпретируется как строка (Stri ng). К счастью, все стандартные типы данных SQL могут быть представлены в строковом виде, поэтому независимо от типа данных вы всегда сможете получить значение первого поля и вывести его. Класс ResultSet содержит множество других методов, включая методы выборки для всех типов данных SQL и преобразования их к типам Java. За дополнительной информацией обращайтесь к описанию ResultSet в документации API.
Другой важный метод, executeUpdate, тоже вызывается с одним аргументом – выполняемой командой SQL Различие между executeQuery и executeUpdate состоит в том, что метод executeUpdate предназначен для выполнения команд, изменяющих состояние данных в базе. Например, при вызове executeUpdate для команды CREATE, INSERT или UPDATE возвращается число типа int, определяющее количество модифицированных записей.
В листинге 12.5 метод executeUpdate используется для вставки новой записи в таблицу books.
Листинг 12.5. Простая вставка в JDBC.
Statement s – null: try { s = c.createStatement(): } catch (SQLException se) { System.out.printlnC'We got an exception while creating a statement:" + "that probably means we're no longer connected."): se.printStackTrace(); System.exlt(1): } int m = 0; try { m = s.executeUpdateC1 INSERT INTO books VALUES " + "(41472. 'Practical PostgreSGl'. 1212. 4)"):> } catch (SQLException se) { System.out.println("We got an exception while executing our query:" + "that probably means our SQL is invalid"):> se.printStackTrace(): System.exit(l): } System.out.println("Successfully modified " + m + " rows.\n"):
Нетривиальные возможности JDBC
Как упоминалось выше, кроме базового объекта Statement в JDBC существует два других типа объектов для представления команд: PreparedStatement и CallableStatement. Они будут описаны ниже.
В данном подразделе также будет рассказано об объектах ResultsSetMetaData и DatabaseMetaData. С их помощью можно запросить у JDBC описание результатов запроса или базы данных. Возможность получения такой информации на стадии выполнения программы позволяет динамически выполнять команды SQL – даже такие, параметры которых были неизвестны на момент написания программы.
Объект CallableStatement
Объект CallableStatement позволяет выполнять хранимые процедуры в JDBC-co-вместимых базах данных. Лучшим источником информации по этому вопросу является сайт Sun Javasoft (http://java.sun.com/products/jdbc/), поскольку стандарт вызываемых команд (callable statements) изменяется и развивается и его практические применения зависят от версии Java и JDBC.