пет тайни

Освежите връзката си с API JDBC

В JDBC, или Java ™ Database свързаност, - един от най-популярните пакети по JDK, и все пак, не много фирми използват Java-всички - или всички от най-модерните - неговите възможности. Тед Neward въвежда нови JDBC функции, като например ResultSet комплекти. че дава възможност за автоматично превъртане и динамично актуализиране на данните, редови набор. която може да функционира като отворена връзка с базата данни, и без него, и пакетни обновления - способността да се извърши на няколко SQL операторите с едно кратко предаване по мрежата.

Тед Nyuvord. Директор, Neward Associates

За тази серия

Вие мислите, че знаете за Java програмиране на всички? В действителност, повечето разработчици са само чесане на повърхността на платформата Java, разглеждането й просто достатъчно, за да изпълняват служебните си задължения. В тази серия, Тед Neward по-дълбоко в функционалността на възможностите на платформата Java, разкривайки малко известни факти, които могат да помогнат за решаването на най-сложните програмиране.

Днес, много Java-разработчици взаимодействат с API Java Database Connectivity (JDBC) чрез платформата за достъп до данни, като например на хибернация или пролет. Въпреки това, JDBC - това е не само посредник да се свърже с базата данни. Колкото по-добре го знаете, толкова по-ефективно ще бъде вашата работа до RDBMS.

В този цикъл освобождаване Пет тайни ... Аз ще демонстрира няколко нови функции, въведени през периода между JDBC 2.0 и JDBC 4.0. Предназначена е за съвременния програмен проблем, тези функции допринасят за мащабируемост и производителност на развитие приложения - решаване на два основни проблема пред които са изправени днешните Java програмисти.

1. скаларни функции

Развиване на умения сред по тази тема

Този материал - част от пътя на знанието за развитието на уменията си. Вижте статията на Java програмист

Различни приложения на СУБД предоставят някакъв вид подкрепа SQL и / или допълнителни функции, предназначени да облекчат живота на разработчика. Добре известно е, например, че SQL е операция скаларна брой на (). която връща броя на редовете, които отговарят на определени критерии, SQL-филтриране (т.е. където отчети). Но в други случаи, промените стойностите, върнати от SQL, е трудно - и се опита да направи на базата данни, за да даде на текущата дата и час може да бъде влудяващо и най-пациент (и смели) JDBC-разработчик.

В тази връзка JDBC спецификация осигурява степен на изолация / адаптация за различни приложения на бази данни от скаларни функции. Спецификацията на JDBC предоставя списък на поддържаните операции, които JDBC драйвери трябва да признаят и да се адаптират, колкото е необходимо за конкретното прилагане на базата данни. За база данни, която поддържа Връща текущата дата или час може да бъде достатъчно само това, което е показано на Обява 1.

Обява 1. Колко е часът?

Пълен списък на скаларни функции, които се поддържат от API JDBC, приложен към спецификацията JDBC (см. Ресурси), но конкретната водача или на базата данни може да не поддържа целия списък. Използването DatabaseMetaData обект. Връща обект Connection. можете да получите списък от функции, поддържани от тази изпълнението на JDBC, както е показано на Обява 2.

Обява 2. Какво можете да направите?

Списък на скаларни функции - низ (стринга), разделени със запетая стойности върнати чрез различни методи DatabaseMetaData клас. Например, наричайки getNumericFunctions () съдържа списък на всички числови скалари. Нанесете на метод и -vualya String.split () резултатът! - веднага се показва списък с равни () - проверими.

2. Преминете определя ResultSet

JDBC много често процедура за създаване (или за получаване на съществуващи) Connection обект и да го използвате за създаване на резюме обект. В отговор на изразяването на SQL SELECT изявление връща ResultSet. След това преминава през ResultSet а (като Итераторът) цикъл, докато ResultSet уведоми, че тя е празна, тялото на цикъла извлича една колона в даден момент от ляво на дясно.

Цялата операция е толкова познато, че е почти не се забелязва: тя се извършва автоматично. Но, уви, не е задължително.

превъртате ResultSet

Много разработчици не осъзнават, че с JDBC години се развиват, но подобренията са отразени в новия брой версия и версия. Първата голяма актуализация, JDBC 2.0, ще се появи някъде в дните на JDK 1.2 освобождаване. Към момента на написването на тази статия е на разположение в JDBC 4.0.

Един от най-интересните (макар и често се пренебрегват) Подобрения в JDBC 2.0 - е способността да "Scroll" настроен ResultSet. до степента, необходима, тя може да преминете напред / назад, или дори и в двете посоки едновременно. Това обаче изисква някаква предварителна информация - JDBC в поканата по време на изявление обекта трябва да се каже, че това отнема превъртате ResultSet.

Проверете типа на ResultSet

Ако, въпреки това, което се казва в DatabaseMetaData. подозирате, че водачът може да не поддържа превъртане комплекти ResultSet. се провери вида на ResultSet. вика метода на getType (). Разбира се, с такава параноя не може да се има доверие и стойността върна getType (). Е, дори и ако getType () се лъже за връщането определя ResultSet. те очевидно се крият от вас.

Ако драйверът поддържа превъртане, на изложението ще се върне превъртате ResultSet. но това е по-добре да разберете преди началото му. Подкрепа за книгата може да се намери чрез обекта DatabaseMetaData. които могат да бъдат достъпни от всеки израз връзка. както е описано по-горе.

Като DatabaseMetaData обект и причинява getJDBCMajorVersion (). може да се определи дали водачът подкрепя, най-малкото, JDBC 2.0 спецификация. Разбира се, водачът може да лъже за тяхното ниво на подкрепа за тази спецификация, следователно, за по-голяма сигурност предизвиква метод supportsResultSetType () с желания тип ResultSet. (Тази постоянна клас ResultSet; ние ще говорим за всички тези стойности.)

Обява 3. дали превъртане се поддържа?

Искане за превъртане комплект ResultSet

Ако шофьорът каза "да" (в противен случай е необходимо да се заменят от водача или данни), можете да направите заявка за превъртате обект ResultSet. преминаване Connection.createStatement повикване () са два параметъра, както е показано на Обявата 4.

Обява 4. Искам да преминете!

Когато се обаждате createStatement () трябва да бъдат особено внимателни, тъй като на първия и втория параметри са стойности от тип Int. (Колко жалко за Java 5 не са изброени видове!) С createStatement () ще се проведе никаква стойност инт (включително погрешна стойност на константа).

Първият параметър показва, "че е желателно да prokruchivaemosti» ResultSet. Това може да отнеме един от трите възможни стойности:

  • ResultSet.TYPE_FORWARD_ONLY. Това е по подразбиране тип курсор запознат огън маркуч;
  • ResultSet.TYPE_SCROLL_INSENSITIVE. а ResultSet позволява повторения напред-назад, но ако данните са в промяна на база данни, ResultSet не отразява това. Може би този тип превъртате ResultSet - най-много в търсенето;
  • ResultSet.TYPE_SCROLL_SENSITIVE. този тип ResultSet не само позволява двупосочен итерация, но също така създава "на живо" изглед на данните в базата данни, тъй като те се променят данните.

Вторият вариант се обсъжда в следващия съвет, така че сега нека си го напуснат.

превъртане посока

Тя може също така да бъдат полезни при методи за относителната () и абсолютен (). първо се движи курсора определен брой линии (напред, ако стойността е положителна, и назад, ако е отрицателен), а вторият - към определена линия ResultSet. без значение къде се намира в момента. Разбира се, броят на текущата линия, могат да бъдат достъпни с помощта на метод getRow ().

Ако очаквате много превъртане в определена посока, може да бъде полезно да се посочи тази насока, като се обадите setFetchDirection (функция). (ResultSet ще работи независимо от посоката на превъртане, но тя предварително да се знае ще позволи да се оптимизира процеса на извличане на данни.)

3. Може да се редактира определя ResultSet

JDBC подкрепя не само двупосочно превъртане, но също така и редактиране на комплекта ResultSet. Това означава, че вместо да създаде нов SQL изявление за промяна на стойностите, съхранявани в базата данни, можете просто да промените стойността вътре в ResultSet. и той автоматично ще бъде отразено в съответната графа на желания ред на базата данни.

Научете повече за renewability на ResultSet може да поддържа, както и подкрепа и превъртане. Има нещо просто и втори параметър на createStatement на оператор (). Вместо ResultSet.CONCUR_READ_ONLY изберете като втори параметър ResultSet.CONCUR_UPDATEABLE. както е показано в Пример 5.

Обява 5. Искам актуална ResultSet

Ако водачът поддържа бъдат актуализирани курсори (Това е още една особеност на спецификацията JDBC 2.0, който поддържа повечето от действителната база данни), която и да е стойност в ResultSet може да бъде актуализиран, като отидете на реда и призова един от методите за актуализация. () (Както е показано в Пример 6). Като методи получите. (ResultSet клас). Има много методи актуализация. () ResultSet за различни видове колони. Например, за да се промени колона от плаващ ЦЕНА точка. трябва да се обадите updateFloat ( "цена"). Все пак, това само ще доведе до актуализирането на стойностите в комплект ResultSet. За да го прехвърли към базата данни, обадете updateRow (). Ако потребителят е променил решението си за промяна на цената, cancelRowUpdates разговора () ще анулират всички чакащи актуализации.

Обява 6. Най-добрият начин да се

JDBC 2.0 поддържа не само обновяване. За да добавите нов ред без да се създава нов обект изявление и изпълнение отчета за INSERT. просто се обадете метод moveToInsertRow (). метод за актуализация. () За всяка колона и метод накрая, insertRow (). Ако не е посочена стойност за колоната, се приема, SQL NULL (което може да предизвика изключение SQLException. Ако схемата на базата данни не позволява NULL стойности за тази колона).

Естествено, ако ResultSet подкрепя актуализация ред, тя трябва да подпомага и неговото изваждане, като се обадите deleteRow ().

Да, преди да забравя, всичко това може да се редактира и prokruchivaemost еднакво приложими към PreparedStatement (чрез преминаване на метода на същите параметри prepareStatement ()), което е много по-за предпочитане пред обичайния отчет поради постоянната опасност от SQL-инжекция атаки.

4. Определя редови набор

Ако всичко това функционалност е известно JDBC-голямата част от десетилетие, тогава защо повечето разработчици все още седи на два сета превъртане ResultSet и изключен достъп?

Основната причина - мащабируемост. Запазва се минималният брой на връзките към базата данни - ключово условие за подкрепа на голям брой потребители, че интернет може да донесе на уеб-сайта на компанията. Тъй като превъртане и / или редактиране на ResultSet обекти обикновено изисква отворена връзка към мрежата, много фирми не искат (или не могат) да ги използват.

За щастие, JDBC 3.0 и алтернатива, която ви позволява да направите много от нещата, които можете да направите с ResultSet. оставяйки отворена връзка към базата данни.

Идеята е, че обектът редови набор. по същество това е една и съща ResultSet. но позволява на модела като връзка, и без него. Това е достатъчно, за да се създаде редови набор. му покажа ResultSet. и когато тя е пълна, да я използват вместо ResultSet. както е показано в Пример 7.

Обявата 7. редови набор вместо ResultSet

JDBC пет "изпълнение" (т.е., разширения) редови набор интерфейс. JdbcRowSet - е реализацията на редови набор със свързването; останалите четири без връзка:

  • CachedRowSet - това е просто редови набор без връзка;
  • WebRowSet - подклас на CachedRowSet. който "знае" как да конвертирате резултатите до XML и обратно;
  • JoinRowSet - това WebRowSet. който също така "да" генерира равностоен SQL JOIN без да е необходимо да се свърже с базата данни;
  • FilteredRowSet - това WebRowSet. в състояние да филтрирате данните, без да се налага да се свърже с базата данни.

Редови набор класове - цяло JavaBean модули, които подкрепят събития като слушане, така че всички промени в редови набор могат да бъдат фиксирани, за разглеждане и приемане, ако е необходимо. В действителност, един редови набор може дори да контролира всички действия на базата данни, ако укажете свойствата му име. Парола. URL и DatasourceName (т.е. тя създава връзка с помощта DriverManager.getConnection ()) или свойства Datasource (което вероятно може да бъде получена чрез JNDI). След това можете да си поръчате изпълнение на SQL изявления в имота Command. наричаме изпълни () и да започне да работи с резултатите - нищо друго не е необходимо.

Реализация редови набор. обикновено се осигурява от водача JDBC, действителното наименование и / или пакет, ще зависи от драйверът. Редови набор внедрявания стават част от стандартното разпределение като се започне с Java 5, така че просто достатъчно, за да се създаде. RowsetImpl () и работа. (В малко вероятния случай, че не е в шофьора, Sun осигурява референтна изпълнение, вижте линка в ресурси.).

5. Партида Updates

Въпреки всичко тяхната полезност, редови набор опции понякога не отговарят на всички изисквания, а ние трябва да се върнем към писане на преките SQL-оператори. В такива ситуации, особено когато има много работа, че е възможно да се направи оценка на възможността за актуализация на партида, т.е. изпълни няколко SQL операторите на базата данни в едно взаимодействие в мрежата.

За да се определи дали водачът подкрепя JDBC пакетни обновления, обадете DatabaseMetaData.supportsBatchUpdates (). и ще получите еднозначен отговор. Ако се поддържат актуализации на партидата (това може да означава нищо друго, освен SELECT -vyrazheny), направи завой и да го мине с един замах, както е показано на Обява 8.

Обява 8. Хванете, базата данни!

setAutoCommit () повикване е необходимо, тъй като драйвер по подразбиране ще се опита да изпълни всеки оператор поотделно. В останалата част от кода е много проста: обичайните SQL-отчети, като използвате изрази изявление или PreparedStatement. но executeBatch () метод се нарича вместо изпълнение () метод. че вместо просто да изпрати искане, го поставя в режим на изчакване.

Когато всичко е готово, изпрати цялото място в база данни, като се обадите метод executeBatch () - връща масив от цели числа, съдържащи същите резултати, както при използване на метод executeUpdate ().

заключение

API JDBC, един от стълбовете на Java-програми, една Java-разработчик трябва да знае като "Отче наш". Това е смешно, че повечето програмисти не са в крак с подобренията в API, както и в резултат на тези разработчици са изчезнали възможност да се спести време чрез използване на техниките, описани в тази статия.

Разбира се, дали да се използват новите функции JDBC, вие решавате. Основният аспект да се обърне внимание - това е скалируемостта на системата, на която работите. Колкото повече е необходимо да се изградят, толкова по-ограничен, ще имат достъп до базата данни, и следователно по-голяма е необходимостта от намаляване на мрежовия трафик към него. В този случай, вашите помощници ще rowsets редови набор. скаларна предизвикателства и пакетни обновления. В други случаи, опитайте да превъртате и актуализирана ResultSet (които не консумират толкова много памет като редови набор комплекта) и измерване на въздействието им върху мащабируемост. Възможно е, че тя няма да бъде толкова голяма, колкото може да изглежда.

На следващо място, в цикъл 5 ... тайни. командния ред знамена.

Вземете продукти и технологии