Каква е разликата между двата примера? Тя е в редове 6 и 7, където се указва с каква база данни желаем да се свържем (избор на драйвер, ред 6) и с коя база данни желаем да работим (ред 7). както накратко беше споменато в предната глава за указване на базата данни се използва JDBC URL (URL- Universal Resource Locator). С негова помощ се указва протокола, местоположението и параметрите на връзката с базата данни.
JDBC URL е адрес подобен на тези, които се използват при работа с Интернет. Те съдържат пълно описание на съдържанието, до което желаем да получим достъп. За една комуникационна програма е наложително да укаже какъв език ще се използва за комуникация. За да не се бърка той с начина на изобразяване на буквите (друга страна на комуникационния процес (character encoding- символно кодиране)) езикът на общуване между програмите се нарича протокол. Формално погледнато, протоколът е най-елементарната форма за използване на език за общуване. Протоколът е нещо от вида:
“Когато аз кажа A, очаквам другата страна да ми отговори с B, C, D...”
, т.е. Протоколът представлява закон в комуникационния процес, който указва последователността и вида на думите, които могат да се разменят (както при хората за всеки език съществуват отделни правила от същия род). Протоколът е така разработен, че да може да спомага за решаването на задачите при които се използва.
Формално, задачата която се опитваме да решим е поставена по следния начин:
Искаме нашата програма да осъществи връзка със база данни разположена някъде си и да изискаме информация от нея. Трябва да укажем как и с кого сте обменяме информация.
Комуникационната част на този проблем може да бъде представена като верига комуникационни процеси:
програма->драйвер->комуникационна среда->база данни
Обуването между всеки две нива става с помощта на споменатия вече протокол за общуване: програмата трябва да знае как да общува с драйвера, драйверът да използва комуникационната среда, комуникационната среда да прехвърля информация от и към базата данни.
Схемата на информационния поток би могла да бъде много по-опростена, например
, или по-усложнена
При условие, че желаем да напишем програма, която да работи с база данни би трябвало да сме наясно само с най-лявата част на тези диаграми, т.е. как нашата програма ще изпраща информация до следващото ниво (драйвер или база данни).
Тук става ясен смисълът на това многослойно предаване на информация (communications stack). При условие, че отделните нива спазват протоколите за комуникация, те са независими едни от други. Това от своя страна означава, че нас ни интересува само как ще предваме информация на следващото ниво, без да се интересуваме как е написан драйвера, колко нива има в комуникационния процес и т.н. Веднъж написана, нашата програма ще може да общува с всички драйвери поддържащи избрания протокол.
JDBC технологията е точно такъв протокол. Той стои най-вляво от всички протоколи, т.е. ние трябва да използваме този език за общуване, независимо каква база данни ще използваме.
Ето как е описана нишката протоколи в JDBC URL:
jdbc:подпротокол:име на БД
Отделните протоколи са разделени с “:”. С подпротоклите се занимават драйверите на базите данни, които трябва предварително да са инсталирани. При различните бази данни неговото име е различно. Най-вляво, обаче, стои jdbc, т.е. за нас това е езикът който ще използваме.
Примери:
jdbc:hsqldb:/hsqldb/data/produkti
Най-вляво стои jdbc, протоколът, чрез който ние ще обменяме информация. Подпротоколът е hsqldb. Драйверът на базата данни общува с нея използвайки този протокол. Задачата на драйвера е да превежда от jdbc на hsqldb ;-).
jdbc:odbc:Produkti
Отново най-вдясно е jdbc. Междинният протокол за комуникация е odbc. Строго погледнато odbc съдържа поне още едно протоколно подниво, но то е вътрешно за odbc и затова то не ни интересува.
Най-вдясно на JDBC URL стои името на базата данни. Това е частта от адреса, която отговаря на въпроса: с кого ще обменяме информация.
Тази част зависи от драйвера на базата данни. За всеки един драйвер начинът на определяне на желаната база данни е различен (макар и сходен в повечето случаи).
Например:
jdbc:hsqldb:/hsqldb/data/produkti
hsqldb изисква да се укаже пълния път до базата данни. Пълният път би могъл да включва и името на компютъра на който се намира базата данни:
jdbc:hsqldb://localhost/hsqldb/data/produkti
Може да бъде добавен и номера на порт, към който да се свърже драйверът:
jdbc:hsqldb://localhost:1599/hsqldb/data/produkti
При ODBC случая:
jdbc:odbc:Produkti
задаваме само името на базата данни, което е достатъчно за odbc драйвера да разбере за какво става дума. Този начин за определяне на базата данни (според мен) е най-удобен, но не е единствен. Ако познавате правилата за описване на базата данни, можете да добавите множество параметри, например:
jdbc:odbc:FILEDSN=D:\\RDBMS-JDBC\\db\\demo.dsn;DRIVER={Microsoft Access Driver (*.mdb)}
Това е начин за указване на работа с база данни дефинирана в ODBC мениджъра от страницата FileDSN (DSN- Data Source Name- име на базата данни). С помощта на този начин за свръзка се осъществява достъп до база данни без дефиниране на самата като такава. При промяна на съдържанието на demo.dsn може да се посочи друга база данни.
Съвет:
Разгледайте отново един от примерните файлове, които сте създали до сега с помощта на ODBC администратора. Обърнете внимание на параметрите които се задават за базата данни. Всеки един от тях може да бъде променян. Така, например, чрез промяна на параметъра DBQ може да се “пренасочите” към друга база данни без да променяте нищо във вашата програма.
Задача:
Опитайте да се свържете с вашата база данни като създадете FileDSN. За целта е нужно в програмата AccessDemo.java, описана в предната глава да се промени JDBC URL. Използвайте горния пример като шаблон. С помощта на “\” в стринговото представяне могат да се слагат служебни символи (нов ред, табулатор, т.н.). Терминът е “escape characters” Ако е нужно да се постави “\” в самия стринг, то се поставя “\\”. Това е особеност на задаването на стрингови константи при Java, която би трябвало да я знаете. Поради тази причина в примерния JDBC URL има доста “\\”, тъй-като това е символът за разделяне на директориите в Windows.
При задаването на JDBC URL бихте могли да използвате “\\” и “/” за разделители на директориите. Вторият начин е за предпочитане, защото той е платформено независим или грубо казано не зависи от операционната система. Тогава примерът би изглеждал ето така:
jdbc:odbc:FILEDSN=D:/Mine/vangelov/RDBMS-JDBC/db/demo.dsn;DRIVER={Microsoft Access Driver (*.mdb)}