Мегаобучалка Главная | О нас | Обратная связь


Java-программы и апплеты с интерфейсом JDBC-ODBC



2019-07-03 328 Обсуждений (0)
Java-программы и апплеты с интерфейсом JDBC-ODBC 0.00 из 5.00 0 оценок




JDBC (Java Database Connectivity) является не протоколом, а интерфейсом и основан на спецификациях SAG CLI (SQL Access Group Call Level Interface - интерфейс уровня вызова группы доступа SQL).

Сам по себе JDBC работать не может и использует основные абстракции и методы ODBC. Хотя в стандарте JDBC API и предусмотрена возможность работы не только через ODBC, а и через использование прямых линков к базам данных по двух- или трех-звенной схеме (см. Рис.1), эту схему используют гораздо реже, чем повсеместно используемый JDBC-ODBC-Bridge занимающий центральное место в общей схеме взаимодействия интерфейсов (см. Рис. 2)


Рис. 1. Непосредственный доступ к базе данных по 3-х-звенной схеме.

 


Рис. 2. Схема взаимодействия интерфейсов.

Даже беглого взгляда на Рис. 2 вполне достаточно, чтобы понять - общая схема взаимодействия интерфейсов в Java удивительным образом напоминает столь всем знакомую схему ODBC с ее гениальным изобретением драйвер-менеджера к различным СУБД и единого универсального пользовательского интерфейса. JDBC Driver Manager - это основной ствол JDBC-архитектуры. Его первичные функции очень просты - соединить Java-программу и соответствующий JDBC драйвер и затем выйти из игры. Естественно, что ODBC был взят в качестве основы JDBC из-за его популярности среди независимых поставщиков программного обеспечения и пользователей. Но тогда возникает законный вопрос - а зачем вообще нужен JDBC и не легче ли было организовать интерфейсный доступ к ODBC-драйверам непосредственно из Java? Ответом на этот вопрос может быть только однозначное нет. Путь через JDBC-ODBC-Bridge, как ни странно, может оказаться гораздо короче.

1. ODBC нельзя использовать непосредственно из Java, поскольку он основан на C-интерфейсе. Вызов из Java C-кода нарушает целостную концепцию Java, пробивает брешь в защите и делает программу трудно-переносимой.

2. Перенос ODBC C-API в Java-API нежелателен. К примеру, Java не имеет указателей, в то время как в ODBC они используются.

3. ODBC слишком сложен для понимания. В нем смешаны простые и сложные вещи, причем сложные опции иногда применяются для самых простых запросов.

4. Java-API необходим, чтобы добиться абсолютно чистых Java решений. Когда ODBC используется, то ODBC-драйвер и ODBC менеджер должны быть инсталлированы на каждой клиентской машине. В то же время, JDBC драйвер написан полностью на Java и может быть легко переносим на любые платформы от сетевых компьютеров до мэйнфреймов.

JDBC API - это естественный Java-интерфейс к базовым SQL абстракциям и, восприняв дух и основные абстракции концепции ODBC, он реализован, все-таки, как настоящий Java-интерфейс, согласующийся с остальными частями системы Java.

В отличие от интерфейса ODBC, JDBC организован намного проще. Главной его частью является драйвер, поставляемый фирмой JavaSoft для доступа из JDBC к источникам данных. Этот драйвер является самым верхним в иерархии классов JDBC и называется DriverManager. Согласно, установившимся правилам Internet, база данных и средства ее обслуживания идентифируются при помощи URL.

jdbc::

где под понимается имя конкретного драйвера, или некоего механизма установления соединения с базой данных, например, ODBC. В случае применения ODBC, в URL-строку подставляется именно эта аббревиатура, а в качестве используется обычный DSN (Data Source Name), т.е. имя ODBC-источника из ODBC.INI файла. Например:

jdbc:odbc:dBase

В некоторых случаях вместо ODBC может быть использовано имя прямого сетевого сервиса к базе данных, например:

jdbc:dcenaming:accounts-payable,
или
jdbc:dbnet://ultra1:1789/state

В последнем случае часть URL //ultra1:1789/state представляет собой и описывает имя хоста, порт и соответствующий идентификатор для доступа к соответствующей базе данных.

Однако, как уже говорилось выше, чаще всего, все-таки используется механизм ODBC благодаря его универсальности и доступности. Программа взаимодействия между драйвером JDBC и ODBC разработана фирмой JavaSoft в сотрудничестве с InterSolv и называется JDBC-ODBC-Bridge. Она реализована в виде JdbcOdbc.class (для платформы Windows JdbcOdbc.dll) и входит в поставку JDK1.1. Помимо JdbcOdbc-библиотек должны существовать специальные драйвера (библиотеки), которые реализуют непосредственный доступ к базам данных через стандартный интерфейс ODBC. Как правило эти библиотеки описываются в файле ODBC.INI. На внутреннем уровне JDBC-ODBC-Bridge отображает медоды Java в вызовы ODBC и тем самым позволяет использовать любые существующие драйверы ODBC, которых к настоящему времени накоплено в изобилии.

Рассмотрим типичное приложение на Java c доступом к типичному реляционному серверу или даже к обычной dBase-таблице.

// Следующий код на Java используется как пример. Простой подстановкой// соответствующих значений url, login, и password, и, затем подстановкой// SQL операторов вы можете посылать их в базу данных.//--------------------------------------//// Module: SimpleSelect.java//// Описание: Эта программа для ODBC API интерфейса. Java-приложение// будет присоединяться к JDBC драйверу, посылать select оператор // и показывать результаты в таблице // // Продукт: JDBC к ODBC Мост // // Автор: Karl Moss (С.Дунаев модификация для работы с кириллицей) // // Дата: Апрель 1997 // // Copyright: 1990-1996 INTERSOLV, Inc. // This software contains confidential and proprietary // information of INTERSOLV, Inc. //-------------------------------------- import java.net.URL;import java.sql.*;import java.io.*; class SimpleSelect { public static void main (String args[]) { String url = ?jdbc:odbc:dBase?; String query = ?SELECT * FROM my_table?; try { // Загрузка jdbc-odbc-bridge драйвера  Class.forName (?sun.jdbc.odbc.JdbcOdbcDriver?); DriverManager.setLogStream(System.out); // Попытка соединения с драйвером. Каждый из // зарегистрированных драйверов будет загружаться, пока // не будет найден тот, который сможет обработать этот URL Connection con = DriverManager.getConnection ( url, ??, ??); // Если не можете соединиться, то произойдет exception // (исключительная ситуация). Однако, если вы попадете // в следующую строку программы, значит вы успешно соединились с URL // Проверки и печать сообщения об успешном соединении // checkForWarning (con.getWarnings ()); // Получить DatabaseMetaData объект и показать // информацию о соединении DatabaseMetaData dma = con.getMetaData (); //System.out.println(?\nConnected to ? + dma.getURL()); //System.out.println(?Driver ? +  //dma.getDriverName());//System.out.println(?Version ? + //dma.getDriverVersion()); //System.out.println(??); // Создать Оператор-объект для посылки // SQL операторов в драйвер Statement stmt = con.createStatement (); // Образовать запрос, путем создания ResultSet объекта ResultSet rs = stmt.executeQuery (query); // Показать все колонки и ряды из набора результатов dispResultSet (rs); // Закрыть результирующий набор rs.close(); // Закрыть оператор stmt.close(); // Закрыть соединение con.close(); } catch (SQLException ex) { // Случилось SQLException. Перехватим и // покажем информацию об ошибке. Заметим, что это // может быть множество ошибок, связанных вместе // //System.out.println (?\n*** SQLException caught ***\n?); while (ex != null) { //System.out.println (?SQLState: ? + // ex.getSQLState ()); //System.out.println (?Message: ? + ex.getMessage ()); //System.out.println (?Vendor: ? + //ex.getErrorCode ()); ex = ex.getNextException (); //System.out.println (??); } } catch (java.lang.Exception ex) { // Получив некоторые другие типы exception, распечатаем их. ex.printStackTrace (); } } //---------------------------------- // checkForWarning // Проверка и распечатка предупреждений. Возврат true если // предупреждение существует //---------------------------------- private static boolean checkForWarning (SQLWarning warn)  throws SQLException { boolean rc = false; // Если SQLWarning объект был получен, показать // предупреждающее сообщение. if (warn != null) { System.out.println (?\n *** Warning ***\n?); rc = true; while (warn != null) { //System.out.println (?SQLState: ? + //warn.getSQLState ()); //System.out.println (?Message: ? + //warn.getMessage ()); //System.out.println (?Vendor: ? + //warn.getErrorCode ()); //System.out.println (??); warn = warn.getNextWarning (); } } return rc; } //---------------------------------- // dispResultSet // Показать таблицу полученных результатов //---------------------------------- private static void dispResultSet (ResultSet rs) throws SQLException, IOException {      // Объявление необходимых переменных и      // константы для желаемой таблицы перекодировки данных          int i, length, j; String cp1 = new String(?Cp1251?);  // Получить the ResultSetMetaData. Они будут использованы // для печати заголовков ResultSetMetaData rsmd = rs.getMetaData (); // Получить номер столбца в результирующем наборе int numCols = rsmd.getColumnCount (); // Показать заголовок столбца for (i=1; i 1) System.out.print(?,?); //System.out.print(rsmd.getColumnLabel(i)); } System.out.println(??);  // Показать данные, загружая их до тех пор, пока не исчерпается // результирующий набор boolean more = rs.next (); while (more) { // Цикл по столбцам  for (i=1; i

В этой простой программе, приводимой во множестве руководств, мною произведено одно небольшое изменение, позволяющее использовать ее для работы с различными базами данных, содержащих таблицы с полями в кириллической кодировке. Дело в том, что хотя Java автоматически производит преобразования из Unicode и обратно в соответствии с установленными на вашей машине языковыми спецификациями (так называемые locale), эти преобразования не всегда действуют по отношению к кириллическим фонтам, особенно, когда кириллические строки прописаны не непосредственно в Java-программе, а передаются из внешних источников, например из баз данных через несколько промежуточных слоев. Та же проблема, как мы увидим далее, возникает и при использовании сервлетов, работающих в тесной взаимоувязке с Web-серверами.

 

Реализация доступа к базам данных с использованием библиотеки .NET Framework (Visual Studio; С#, C++)

Как отмечено выше, в ADO.NET используется модель доступа, при которой соединение с БД устанавливается лишь на короткое время, когда необходимо проводить какую либо операцию по обмену информацией с базой данных. Естественно, такая технология не является эффективной для режимов работы, когда приложение проводит частые и объемные изменения содержания записей в БД. Для данного случая, более отвечающими требованиям, как и обычно, являются традиционные методы доступа - ODBC, ADO.

Функциональность ADO.NET, предоставляемая разработчикам приложений, аналогична функциональности ADO, предоставляемой разработчикам COM, различие заключается в способе манипулирования данными.

Компоненты ADO.NET позволяют отделить доступ к данным от их обработки. Разделение выполняется с помощью двух основных компонентов ADO.NET (Рис.1.):

· DataSet

· провайдер данных .NET Framework

Рис.1. Архитектура ADO.NET

Провайдер (поставщик) данных .NET Framework представляет собой набор компонентов, это:

· Connection - компонент для подключения к источнику данных;

· Command - компонент для обеспечения выполнения команд в БД, изменения данных, запуска хранимых процедур, отправки и получения значений параметров;

· DataReader - компонент для создания высокопроизводительного потока данных от источника данных;

· DataAdapter - компонент для обеспечения взаимодействие объекта DataSet с источником данных.

На Рис.1. изображен один провайдер данных. На самом деле их пять:

· Провайдер SQL Server .NET. Он обеспечивает связь с SQL серверами. Он имеет библиотеки, позволяющие выполнять прямое взаимодействие с SQL серверами через протокол Tabular Data Stream (TDS).

· Провайдер данных OLE DB .NET необходим для организации взаимодействия с отличными от SQL Server базами данных (Oracle, DB2). Провайдер использует OLE DB для соответствующих баз данных.

· ODBC .NET. Предоставляет доступ к любому источнику данных, имеющему драйвер ODBC.

· Провайдер Oracle. Предоставляет оптимизированный под Net доступ к Oracle.

· Провайдер SQL ServerCE для доступа к базам данных SQL Server CE из устройств, базирующихся на Windows CE и расположенных в управляемой среде.

Данные, полученные с помощью компонент провайдера, либо непосредственно обрабатываются, либо помещаются в объект DataSet.

Объект DataSet является основой поддержки многоуровневой архитектуры данных и механизмов, позволяющих работать с отключением от источников данных. DataSet представляет собой находящийся в памяти объект со снимком реальных данных БД. Он может включать таблицы (DataTableCollection), отношения между таблицами (DataRelationCollection). Для этого DataSet содержит ноль или более таблиц, представленных объектами DataTable, ноль или более отношений - объекты DataRelation (ключевая информация таблиц, хранящаяся в виде имя отношения, имена связанных таблиц и столбцов). Кроме того, как сам DataSet, так и некоторые его дочерние объекты имеют свойства ExtendedProperties - коллекция PropertyCollection, в которых можно сохранять различную информацию (в том числе и SQL операторы). Коллекция ExtendedProperties хранится со сведениями о схеме DataSet (как и объекты DataTable и DataColumn). Объектная модель DataSet показана на Рис.2.

Рис.2. Объектная модель DataSet

 



2019-07-03 328 Обсуждений (0)
Java-программы и апплеты с интерфейсом JDBC-ODBC 0.00 из 5.00 0 оценок









Обсуждение в статье: Java-программы и апплеты с интерфейсом JDBC-ODBC

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (328)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.006 сек.)