Здравствуйте! Записался на ваш курс, но не понимаю как произвести оплату. Надо ли писать заявление и, если да, то куда отправлять? как я получу диплом о профессиональной переподготовке? |
Внедрение SQL-операторов в прикладные программы
Взаимодействие с базой данных в Java-программах
Извлечение и обработка информации из базы данных в общем случае связаны с решением следующих задач:
- подключение / отключение базы данных;
- запуск, фиксация и откат SQL-транзакций;
- отображение результатов SQL-запроса;
- создание обновляемых курсоров для просмотра, вставки, удаления и изменения данных;
- доступ к большим бинарным объектам с мультимедиа-содержимым.
В качестве примера организации доступа к базе данных из прикладных программ рассмотрим:
- взаимодействие с базой данных в Java-программах;
- обращение к базе данных из языков сценариев с использованием технологии ADO.
Java-программа может быть специализирована для работы с внешними базами данных. С этой целью в Java включены классы для доступа к БД (java.sql.*).
Взаимодействие Java-программы с внешним сервером баз данных осуществляется посредством специализированного протокола, отвечающего за совместимость Java с базами данных ( Java Database Connectivity, JDBC ). Он построен на принципах интерфейса ODBC и применяется для стандартизации Java-кода при организации доступа к различным СУБД. Созданный вслед за спецификацией ODBC, пакет JDBC стал одним из методов доступа к реляционным СУБД из Java-программ. Протокол JDBC, по сути, является посредником Java-кода и драйвером ODBC.
Этап подключения к базе данных включает загрузку драйвера и создание соединения.
Загрузка драйвера
Конкретная база данных обычно доступна с помощью одного или нескольких драйверов. Составная часть JDBC - драйвер для доступа из JDBC к источникам данных ODBC. Этот драйвер называется программой сопряжения JDBC-ODBC и реализован в виде JdbcOdbc.class.
Поскольку JDBC конструктивно близок к ODBC, программа сопряжения представляет собой надстройку над JDBC. На внутреннем уровне этот драйвер отображает методы Java в вызовы ODBC и тем самым взаимодействует с любым ODBC-драйвером. Достоинство такой программы сопряжения состоит в том, что JDBC имеет доступ к любым базам данных, поскольку ODBC-драйверы распространены очень широко. Драйвер JDBC-ODBC является мост-драйвером, т.к. создает мост между JDBC и другим интерфейсом уровня обращения (Call Level Interface, CLI). Он обрабатывает обращения JDBC и, в свою очередь, вызывает функции ODBC, которые передают запросы SQL источнику данных ODBC. Драйвер JDBC-ODBC загружается командой:
Class.forName( "com.ms.jdbc.odbc.JdbcOdbcDriver");
Создание соединения: класс Connection
Класс DriverManager - самый верхний в иерархии классов. Он отслеживает информацию о драйвере, о состоянии, регистрирует драйвер в процессе его загрузки и т.д. Когда требуется установить связь, этот класс выбирает драйвер в зависимости от URL JDBC.
Создать соединение с источником данных можно с помощью метода getConnection класса DriverManager.
Для задания источника данных используются соглашения по присвоению имен URL. В соответствии с правилами Internet, JDBC идентифицирует базу данных при помощи URL, который имеет следующую форму:
jdbc:<субпротокол>:<имя, связанное с СУБД или протоколом>
Имя субпротокола odbc зарезервировано для источника данных формата ODBC. Типичный JDBC URL для БД ODBC выглядит следующим образом:
jdbc:odbc:<DSN-имя ODBC>; user=<имя пользователя>;pw=<пароль>
Класс Connection ( соединение ) - один из самых важных в JDBC. Он предоставляет широкий спектр возможностей: от создания операторов до обработки транзакций. Объект Connection управляет всеми аспектами установки связи. Фактически, Connection - это класс, ведущий к драйверу СУБД. Успешно создав объект Connection для источника данных, программист может взаимодействовать с источниками самыми разными способами. Наиболее распространенный подход состоит в том, чтобы объекты управляли SQL-операторами.
В JDBC имеется три основных типа объектов для операторов:
- Statement ;
- PreparedStatement ;
- CallableStatement.
Оператор SQL может быть выполнен немедленно ( Statement ), откомпилирован ( PreparedStatement ), представлен в виде вызова процедур ( CallableStatement ).
Для создания этих объектов класс Connection предлагает, соответственно, три метода:
- createStatement() ;
- prepareStatement(String sql) ;
- prepareCall(String sql).
Создание оператора: класс Statement
Объект Statement создается методом createStatement() из объекта Connection и лучше всего подходит для SQL-операторов, выполняемых один раз.
Когда запрос возвращает обычные строки данных, для выполнения SQL-оператора необходимо использовать метод executeQuery(String sql). В таком случае запрос - это статический SQL-запрос выборки SELECT. Метод executeQuery(String sql) принимает строку SQL, передает ее источнику данных через диспетчер драйверов, получает набор результатов и возвращает его прикладной программе. Метод возвращает только один набор результатов типа ResultSet. Если необходимо возвращать несколько наборов данных, применяется метод execute(String sql).
Для SQL-операторов, не возвращающих наборы результатов (например UPDATE, DELETE и INSERT ), объект Statement применяет метод executeUpdate(String sql), который берет строку SQL и возвращает целое. Это целое указывает количество строк, обработанных оператором SQL.
Получение результатов: класс ResultSet
Объект ResultSet, представляющий набор результатов, фактически является табличным набором данных, т.е. состоит из рядов данных, организованных в унифицированные столбцы. Программа на языке Java, использующая JDBC, единовременно способна выдать только один ряд данных. Чтобы перейти к следующему ряду, она должна вызвать метод next(). JDBC не предоставляет метод для обратного движения по ResultSet или запоминания рядов ("закладки" в ODBC). Получив ряд, программа может пользоваться позиционным указателем (1 - для первого столбца, 2 - для второго и т.д.) или названием столбца и получить значение поля, вызвав метод getXXXX ( getInt, getByte, getString и т.д.) в соответствии с типом возвращаемых данных.
Class.forName( "com.ms.jdbc.odbc.JdbcOdbcDriver"); // при создании соединения указывается // DSN источника данных (mystud), // имя пользователя (user1), его пароль(123) Connection myCon=DriverManager.getConnection ("jdbc:odbc:mystud","user1","123"); Statement mySt=myCon.createStatement(); ResultSet rs=mySt.executeQuery( "SELECT название, тип, цена FROM товар"); while (rs.next()) { String var1=rs.getString(1); String var2=rs.getString(2); int var3=rs.getInt(3); // значения переменных var1, var2, var3 могут // далее быть использованы в элементах // пользовательского графического интерфейса }18.1. Выполнение статического SQL-запроса к учебной базе данных из Java-программы.
Создание оператора: класс 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.
Class.forName( "com.ms.jdbc.odbc.JdbcOdbcDriver"); Connection myCon=DriverManager.getConnection ("jdbc:odbc:mystud","user1","123"); PreparedStatement mySt=myCon.prepareStatement ("INSERT товар(название, тип, цена) VALUES(?,?,?)"); mySt.setString(1, "Трюфели"); mySt.setString(2, "Конфеты"); mySt.setInt(3,156); int res=mySt.executeUpdate();18.2. Выполнение динамического SQL-запроса к учебной базе данных из Java-программы.