JDBC, драйверы строка соединения, класс DriverManager, интерфейс Connection.
Кроме классов с методами доступа к базам данных для каждой СУБД необходим драйвер JDBC — промежуточная программа, реализующая методы JDBC. Существуют четыре типа драйверов JDBC.
1. JDBC-ODBC "мост". Драйверы данного типа реализуют доступ к базе данных, используя механизм ODBC (Open Database Connectivity). При использовании такого драйвера будет необходимо установить на каждом рабочем месте клиентскую часть базы данных. В некоторых случаях потребуется еще и ODBC-драйвер. JDBC-ODBC "мост" наиболее приемлем для использования в корпоративных сетях, а также для реализации на Java серверной части приложения с так называемой "трехуровневой" архитектурой. (пример: JavaSoft)
2. Драйвер, написанный с использованием native-методов. Этот драйвер преобразует JDBC-вызовы в вызовы архитектурно-зависимой клиентской части Oracle, Sybase, Informix, DB2 и других баз данных. Это требует, как и в случае использования JDBC-ODBC "моста" установки на каждое клиентское место некоторого программного обеспечения. (IBM)
3. Драйвер клиент-серверной архитектуры с клиентской частью, реализованной на Java. Драйвер данного типа преобразует JDBC-вызовы к сетевому протоколу, независимому от базы данных, которые затем преобразуются сервером к протоколу конкретной базы данных. Сервер имеет возможность подключить своих Java клиентов к различным базам данных. Использование конкретного протокола зависит от производителя. Многие компании уже при создании своих программных продуктов учитывают возможность использования JDBC. (IDS Software)
4. Драйвер, реализованный на Java и использующий протокол конкретной базы данных. Данный драйвер реализует непосредственный доступ клиента к полям базы данных, что является наилучшим решением при использовании баз данных в корпоративной сети. Поскольку этот механизм зависит от реализации базы данных, компании-производители берутся сами за создание драйверов JDBC. (Imaginary)
|
Подключение Java-программы к реляционной СУБД с помощью JDBC выполняется в три этапа:
· Установка связи между Java-программой и диспетчером базы данных.
· Передача SQL-команды в базу данных с помощью объекта Statement.
· Чтение полученных результатов из базы данных и использование их в программе.
Работа с классом DriverManager
Для подключения к базе данных среда выполнения Java должна загрузить соответствующий драйвер указанной базы данных. Загрузка и выгрузка таких драйверов осуществляется с помощью класса DriverManager.
Стандартный способ получения соединения - это вызов метода DriverManager.getConnection. Этому методу передается строка, содержащая т.н. "URL". Класс DriverManager, представляющий собой уровень управления в JDBC, пытается найти драйвер, который может соединиться к БД с помощью данного URL. Класс DriverManager содержит список зарегистрированных классов Driver, и при вызове метода getConnection он проверяет каждый драйвер и ищет среди них тот, который "умеет" соединятся с БД, указанной в URL. Метод connect драйвера использует этот URL для установления соединения.
Перед обращением к базе данных следует установить нужный драйвер.
После того как драйвер установлен, надо связаться с базой данных. Методы связи описаны в интерфейсе connection. Экземпляр класса, реализующего этот интерфейс, можно получить одним из статических методов getConnection () класса DriverManager, например:
|
Class.forName("com.mysql.jdbc.Driver").newInstance();
String host = "jdbc:mysql://localhost:3306/";
String database = "vinogradovadz?useUnicode=true&characterEncoding=utf8";
String user = "root";
String password = "gfhjkm";
connection = DriverManager.getConnection(host+database,user,password);
JDBC-URL
JDBC-URL предоставляет способ указания БД и определенного драйвера, который устанавливает соединение с данной БД.
Стандартный синтаксис JDBC URL показан ниже. Он имеет три части, разделенных двоеточием:
jdbc:<subprotocol>:<subname>JDBC URL состоит из:
jdbc - протокола. Протокол, используемый в JDBC URL - всегда jdbc.
<subprotocol> (подпротокола) - это имя драйвера или имя механизма соединения с БД. Подпротокол может поддерживаться одним или несколькими драйверами. Лежащий на поверхности пример подпротокола - это "odbc", отведенный для URL, обозначающих имя источника данных ODBC. Например, для доступа к БД через мост JDBC-ODBC нужно использовать URL такого вида:
jdbc:odbc:fred
В этом примере подпротокол задан как "odbc", а подимя "fred" является локальным источником данных.
<subname> (подимени) - это идентификатор БД. Значение подимени может менятся в зависимости от подпротокола, и может также иметь подподимя с синтаксисом, определяемым разработчиком драйвера. Назначение подимени - это предоставление всей информации, необходимой для поиска БД Например, если БД находится в Интернет, то в состав подимени JDBC-URL должен быть включен сетевой адрес, подчиняющийся следующим соглашениям:
//hostname:port/subsubname
Предполагая, что "dbnet" - это протокол соединения к хосту в Интернет, JDBC-URL может выглядеть так:
|
jdbc:dbnet://wombat:356/fred
JDBC, создание SQL запросов, интерфейсы Statement, PreparedStatement
Класс Statement.
Объект Statement используется для выполнения SQL-запросов к БД. Существует три типа объектов Statement. Все три служат как бы конейнерами для выполнения SQL-выражений через данное соединение: Statement, PreparedStatement, наследующий от Statement, и CallableStatement, наследующий от PreparedStatement. Они специализируются на различных типах запросов: Statement используется для выполненияпростых SQL-запросов без параметров; PreparedStatement используется для выполнения прекомпилированных SQL-запросов с или без входных (IN) параметров; CallableStatement используется для вызовов хранимых процедур.
Создание объектов Statement
Как только соединение с определенной БД установлено, оно может использоваться для выполнения SQL-запросов. Объект Statement создается методом Connection.createStatement, как показано ниже:
Statement stmt = con.createStatement();Посылаемое в БД SQL-выражение передается в качестве аргумента одному из методов объекта Statement для выполнения SQL-запроса:
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table");Выполнение запроса через объект Statement
Интерфейс Statement предоставляет три различных метода выполнения SQL-выражений: executeQuery, executeUpdate и execute, в зависимости от SQL-запроса.
Метод executeQuery необходим для запросов, результатом которых является один единственный набор значений, таких как запросов SELECT.
Метод executeUpdate используется для выполнения операторов INSERT, UPDATE или DELETE, а также для операторов DDL (Data Definition Language - язык определения данных), например, CREATE TABLE и DROP TABLE. Метод executeUpdate возвращает целое число, показывающее, сколько строк было модифицировано. Для выражений типа CREATE TABLE и DROP TABLE, которые не оперируют над строками, возвращаемое методом executeUpdate значение всегда равно нулю.
Метод execute используется, когда операторы SQL возвращают более одного набора данных, более одного счетчика обновлений или и то, и другое.
Все методы выполнения SQL-запросов закрывают предыдущий набор результатов (result set) у данного объекта Statement. Это означает, что перед тем как выполнять следующий запрос над тем же объектом Statement, надо завершить обработку результатов предыдущего (ResultSet).
класс PreparedStatement
В случае использования этого объекта программа подготавливает SQL-оператор при помощи метода prepareStatement (String sql) объекта Connection: берется SQL-строка и передается СУБД. Строка проходит через стадии синтаксического анализа, оптимизации и генерирования плана выполнения, но не выполняет оператор SQL. Ссылка на план выполнения возвращается JDBC, который сохраняет ее в объекте PreparedStatement.
Одно из важных свойств метода prepareStatement - возможность обработки входных параметров. Они помечаются в операторе SQL символом "?" на месте фактического значения. В программе Java проводится соответствие между параметрами и методами setXXXX() - setInt, setFloat, setString и т.д., в соответствии с типами входных параметров. Все методы setXXXX() принимают в качестве параметров значение параметра и указатель parameterIndex, который равен 1 для первого "?", 2 - для второго и т.д. Выполнение sql-оператора обеспечивается методами объекта PreparedStatement:
- executeQuery() - для выполнения запроса выборки SELECT;
- execute() - для выполнения запроса, возвращающего множественные наборы данных;
- executeUpdate() - для выполнения запроса модификации данных INSERT, UPDATE или DELETE.
Объект PreparedStatement обеспечивает более быстрое выполнение оператора SQL и является примером реализации динамического SQL.
PreparedStatement mySt=myCon.prepareStatement
("SELECT * FROM Users WHERE name =? AND psw=?");
mySt.setString(1, "nam");
mySt.setString(2, "123");
int res=mySt.executeUpdate();
Закрытие объектов Statement
Объекты Statement закрываются автоматически с помощью сборщика мусора виртуальной машины Java. Тем не менее рекомендуется закрывать их явно после того, как в них отпадает необходимость.