|
Все методы JDBC могут возбуждать SQLException или один из подклассов этого
класса, если что-то происходит при обращении к базе данных. Ваш код должен
уметь перехватывать исключительную ситуацию, обрабатывать ее и освобождать все
размещенные в памяти ресурсы базы данных. Все перечисленные до сих пор классы
JDBC имеют метод close(). Однако на практике вы должны обеспечить закрытие
только тех объектов, которые вызваны процессами, продолжающими оставаться
открытыми. В приведенных до сих пор примерах практически требовалось закрыть
только соединение с базой данных. При закрытии соединения автоматически
закрываются все связанные с ним команды и результирующие наборы. Однако если вы
намерены сохранить соединение открытым в течение некоторого времени, будет
правильным поспешить закрыть все объекты statement, которые вы создали с
использованием этого соединения, когда они вам больше не нужны. В примерах JDBC,
которые вы видели, это освобождение ресурсов производится в предложении
finally. Это делается для того, чтобы обеспечить закрытие соединения независимо
от того, что произойдет.
Динамический доступ к базе данных
До сих пор мы имели дело с приложениями, в которых во время компиляции точно
известно, что нужно будет делать. Если бы это был единственный тип поддержки,
обеспечиваемый JDBC, никто не смог бы написать для Mysql и msql интерактивные
инструменты командной строки, способные во время исполнения принимать команды
SQL и выполнять их. Класс JDBC Statement поддерживает метод execute() для
выполнения SQL-команд, которые могут быть запросами или обновлениями. Кроме
того, экземпляры ResultSet обеспечивают предоставление о себе информации
времени исполнения через интерфейс с именем ResultSetMetaData, доступ к
которому осуществляется через вызов метода getMetaData() для ResultSet.
Метаданные
Термин метаданные звучит официозно, но на самом деле это не более чем
дополнительные данные о некотором объекте, которые, если бы действительно
хранились в объекте, просто зря тратили бы ресурсы. Например, для простых
приложений не нужны имена колонок, связанных с результирующим набором
ResultSet: программисту они, скорее всего, известны во время написания
программы. Поэтому помеще
ние этих дополнительных данных в класс ResultSet не рассматривается
разработчиками JDBC как нечто существенное для функциональности ResultSet.
Однако в некоторых случаях программирования баз данных i такие вещи, как имена
колонок, очень важны, особенно при осуществлении динамического доступа к базам
данных. Доступ к этим дополнительным данным - метаданным - разработчики JDBC
обеспечили через интерфейс ResultSetMetaData. Этот класс позволяет узнать:
* Число колонок в результирующем наборе.
* Является ли NULL допустимым значением в колонке.
* Метку, используемую для заголовка колонки.
* Имя заданной колонки.
* Таблицу, служащую источником данных для данной колонки.
* Тип данных колонки.
Другим примером класса, поставляемым вместе с драйвером mSQL-JDBC, является
приложение Exec. Оно принимает любую команду SQL, задаваемую в командной строке,
и выполняет ее. В примере 14-6 приводится соответствующий исходный код.
Пример 14-6. Исходный код приложения Exec для выполнения динамического SQL
import java.sql.*;
public class Exec {
public static void main(String args[]) {
Connection con = null; String sql = "";
for(int i=0; i
|
|