Задача: С объекта Connection получить и распечатать getMetaData(). — КиберПедия 

Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...

Задача: С объекта Connection получить и распечатать getMetaData().

2022-10-10 57
Задача: С объекта Connection получить и распечатать getMetaData(). 0.00 из 5.00 0 оценок
Заказать работу

run: List of tables:   temp_company null belongings TABLE temp_company null cities TABLE temp_company null class_of_engine TABLE temp_company null classification_of_unit_defect TABLE temp_company null codes_of_document_by_gost_34.201_89 TABLE temp_company null defects TABLE temp_company null documents TABLE temp_company null dump_files TABLE temp_company null engine_names TABLE temp_company null engines TABLE temp_company null engines_has_documents TABLE temp_company null exhausting_fraction_of_fault_probability TABLE temp_company null failures TABLE temp_company null fault_probability_of_details TABLE temp_company null fraction_of_exhaustion_of_details TABLE temp_company null groups_of_defect_place_in_engine TABLE temp_company null manufactured_symbols_of_engine TABLE temp_company null mon_files TABLE temp_company null organisations TABLE temp_company null positions_of_employee TABLE temp_company null priveledges TABLE temp_company null state_of_users TABLE temp_company null stressing_cycle TABLE temp_company null technical_states_by_gost_15467 TABLE temp_company null type_of_guarantee TABLE temp_company null type_of_units TABLE temp_company null types_of_defect_by_gost_15467 TABLE temp_company null types_of_document TABLE temp_company null types_of_failure_by_gost_15467 TABLE temp_company null types_of_production TABLE temp_company null types_of_technical_service TABLE temp_company null types_of_test TABLE temp_company null units TABLE temp_company null units_has_defects TABLE temp_company null units_has_documents TABLE temp_company null units_has_failures TABLE temp_company null universities TABLE temp_company null users TABLE СБОРКА УСПЕШНО ЗАВЕРШЕНА (общее время: 0 секунд)

По поводу meta.getTablesи четырех null. Смотрите. Все правильно. Вот эти четыре nullна самом деле являются фильтром. Если вы пишите четыре раза null, значит вы ничего не фильтруете. А если хоть один из 4 параметров используете, то можете отфильтровать таблицы по:

· 1 имени базы

· 2 схеме

· 3 имени таблицы

· 4 типу

Можно отфильтровать, например так, чтобы вывести все таблицы начинающиеся на «en»

run: List of tables:   temp_company null engine_names TABLE temp_company null engines TABLE temp_company null engines_has_documents TABLE СБОРКА УСПЕШНО ЗАВЕРШЕНА (общее время: 0 секунд)

 

Мне периодически попадаются слушатели, которые задают такой вопрос: «а как мне написать программу, которая позволяет получить любую информацию об устройстве БД?». Да ради Бога! Есть такие технологии, есть такие классы, можете писать. Правда то было не на Java, а на C++. Но там, конечно, посложнее. Там, конечно, программирование пожестче, чем на Java. Там мы через OLEDBделали.

Следующий шаг. Получили информацию, нашли таблицу, разобрались, поэтому теперь запросы пора писать. И первый простейший интерфейс, который мы должны освоить – это интерфейс Statement.

Конечно, в этом интерфейсе больше методов, чем изображено на слайде (причем намного больше). Поэтому давайте мы заглянем в документацию, а уже потом заглянем перейдем к основным методам, которые называются execute.

Итак, в интерфейсе Statement есть методы, которые:

По поводу get-методов:

· позволяют выполнить команды много разных перегруженных execute()

· позволяют управлять размерами получаемых элементов – тут может быть размер записи, размер еще чего-то, размер одного поля.

По поводу set-методов:

Есть и setметоды. Вдруг вам нужно, действительно, ограничить или увеличить или уменьшить query-timeout. Для отладки мы обычно увеличиваем, если мы не хотим нарваться на проблемы, что все медленно работает. А где-то на боевой системе этот параметр обратно в норму вернуть. Так что про это не забывайте.

Далее… Если настройки мы все сделали или нас устраивают варианты по умолчанию, то следующий будет метод один из execute(). Может так получиться, что вы знаете, что у вас за запрос исполняется (ну такое бывает). Тогда вы вызываете либо executeQuery(), либо executeUpdate(). Дело в том, что executeQuery()исполняет запрос, который возвращает данные. Вы получите ResultSet, как тип возвращаемого значения из executeQuery(). Но с другой стороны у вас может быть запрос, который просто в БД, что-то меняет: обновляет или удаляет какие-то записи. Тогда мы точно знаем, что зачем нам возвращать данные? Поэтому в этой ситуации вам ресурсы лишние тратить неразумно. И возвращать ResultSetсмысла нет. И мы используем executeUpdate(). Он возвращает Integer – счетчик обновлений. Допустим, было удалено 2 записи. Всё, понятно.

А бывает ситуация, когда вы не знаете, что за команду SQL вы выполняете. Вы вообще не в курсе. Тогда execute() без слов Queryили Update. Что он возвращает? Boolean. На этот Booleanпридется смотреть. Если вызвать execute() и он вам вернул true, это означает, что команда которая была выполнена, она вернула данные, а значит вы должны вызвать теперь вариант getResultSet().Соответственно, если вы выполнили execute() и он вернул false, то вызываете getUpdateCount() потому что это была команда, которая привела к тому, что какие-то изменения произошли и вы можете прочитать счетчик обновлений.

Кстати, вы же можете написать в один текст несколько команд подряд?SELECT, UPDATE, SELECT, UPDATE. Да, друг за другом. Выполнилась одна команда. А если там есть еще команды? То, вы можете попросить их тоже выполниться. Здесь есть вызов getMoreResults(). Т.е. получается, что execute() является самым универсальным. Вы его вызвали, и дальше разбираетесь, что там произошло. Значит, больше всего кода придется писать. Но если вы точно знаете, чего вы хотите, вызываете самый простой вариант executeQuery() или executeUpdate().

Сейчас наша задача такая: создать команду, выполнить ее и распечатать результат. Объект ResultSetу нас уже есть, поэтому создавать его не надо. close() у меня останется в конце. Значит, мы с нашего Connection, выполняем следующие команды:

· для того, чтобы добраться до объекта, который мы изучаем (Statement), нам нужно его создать и это делается с помощью вызова createStatement().Но все уже поняли, почему никогда не пишется слово new. Да? Потому что мы не знаем его имени. А этот метод является фабрикой. Он создает нужный объект нужного типа. А откуда я знаю какой у него тип? Мне это знать не положено. Тем более это может в следующих версиях измениться. А я с ним работаю через интерфейс. Поэтому я буду называть его «st».

· И вот теперь на этом объекте «st» я и вызываю executeQuery();, который требует всего лишь на всего в качестве параметра какой-то SQL.Не буду ради этого параметра целую отдельную строчку писать.

 - для MS SQL

 - для MySQL

И куда это все положить? В ResultSetres. Чтобы не терять время, я могу скопировать цикл whileдля распечатки информации. Всё. Вот он весь запрос. Обратите внимание, сколько строк кода нужно написать, чтобы получить данные из БД.

run: List of tables:   temp_company null belongings TABLE temp_company null cities TABLE temp_company null class_of_engine TABLE temp_company null classification_of_unit_defect TABLE temp_company null codes_of_document_by_gost_34.201_89 TABLE temp_company null defects TABLE temp_company null documents TABLE temp_company null dump_files TABLE temp_company null engine_names TABLE temp_company null engines TABLE temp_company null engines_has_documents TABLE temp_company null exhausting_fraction_of_fault_probability TABLE temp_company null failures TABLE temp_company null fault_probability_of_details TABLE temp_company null fraction_of_exhaustion_of_details TABLE temp_company null groups_of_defect_place_in_engine TABLE temp_company null manufactured_symbols_of_engine TABLE temp_company null mon_files TABLE temp_company null organisations TABLE temp_company null positions_of_employee TABLE temp_company null priveledges TABLE temp_company null state_of_users TABLE temp_company null stressing_cycle TABLE temp_company null technical_states_by_gost_15467 TABLE temp_company null type_of_guarantee TABLE temp_company null type_of_units TABLE temp_company null types_of_defect_by_gost_15467 TABLE temp_company null types_of_document TABLE temp_company null types_of_failure_by_gost_15467 TABLE temp_company null types_of_production TABLE temp_company null types_of_technical_service TABLE temp_company null types_of_test TABLE temp_company null units TABLE temp_company null units_has_defects TABLE temp_company null units_has_documents TABLE temp_company null units_has_failures TABLE temp_company null universities TABLE temp_company null users TABLE 1 Уфа NULL 2 Казань NULL 3 Саратов NULL 4 Сим NULL 5 Пермь NULL 6 Омск NULL 7 НижнийНовгород NULL 8 Мичуринск NULL 9 Курск NULL 10 Самара NULL СБОРКА УСПЕШНО ЗАВЕРШЕНА (общее время: 0 секунд)

Вопрос: Кто-нибудь видел когда-нибудь работу с БД на С++ в рукопашную?

Ответ: Только через библиотеки. Там по-моему две страницы текста создается, чтобы простой запрос в SELECTсделать. Там формируются структуры. Сейчас есть библиотеки, правда. И уже все намного легче.

Давайте сдвинемся на один слайд. Может быть там что-то ценное. Как раз я сейчас рекламировал интерфейс ResultSet. Давайте с ним разбираться.

Давайте сейчас назовем объект ResultSetправильным словом – есть такой термин «курсор базы данных» - т.е. грубо говоря – это текущая строка. Вы мне говорите: «дай мне данные». А БД должна же эти данные во что-то положить в какой-то контейнер, и вам передать. Вот этот контейнер и называется «обертка-класс ResultSet». А на уровне разработчиков – «курсор базы данных».

Также в ResultSetесть вызов типизированных методов getString(), getDouble(), getLong(). Т.е. получается, если вы точно знаете в каком столбце находятся какие данные, то вы можете использовать типизированные методы. А это приведет к чему? Это будет эффективнее. Вы не будете создавать обертки. А если у вас там числа лежат? А вы будете писать getString(). Это «раз» оптимизация.

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

Когда вы читаете строку в БД, то вы же понимаете, что этой строки может и не быть. Она может быть незаполненной. Не вопрос, тогда вам вернут NULL.

Теперь представьте, что вы из БД читаете число. Оно может быть там незаполненное. Что вам вернет getInt()? Он вернет 0. И тогда вы должны задаться вопросом: Это 0 или «незаполненное значение»? Потому что это разные вещи. И вот вы должны сразу после getInt() вызвать метод wasNull().

А вот иметод getMetaData(). Вся информация, если она нам нужна, будет в специальном объекте. Ну и позиции сверху мне тоже нравятся first(), last(), next().

next() переводит на следующую запись. А вдруг вам так понравились данные, что вы хотите вернуться в начало и снова пойти? Тогда используйте метод first().

Ведь мы же сейчас создали объект ResultSetне уточняя и не выбирая какой у нас курсор. Нам его по умолчанию создали. Кстати, в объекте «res»есть возможность спросить: «а что это за курсор?». Там есть два варианта: «тип» и «параллельный».

Мы можем попросить уточнить, что же это за курсор? Давайте ответим очень просто. Когда вы курсор делаете по умолчанию, то курсор создается самый легковесный, чтобы ресурсы по минимуму тратить. А самые легковесный курсор он называется так: «ReadOnly – ForwardOnly». Он только позволяет читать данные и по этим записям, которые вам в этом контейнере ResultSetпредоставляет, вы можете идти только 1 раз сверху вниз. Прошли? Всё. Закрываете соединение и до свидания. А если вам такой курсор не нравится? Вы скажете: «А я хочу что-нибудь покруче!». А у меня много ресурсов. Их девать некуда. Не вопрос. Смотрим следующий 26 слайд.

На 26 слайде вы теперь видите, что метод createStatement() мы вызывали, но он у нас был без параметра, а тут мы видим перегруженный вариант. И здесь вы можете указать параметр и первый, и второй. У первого параметра три варианта, у второго два варианта. Это не означает, что здесь шесть вариантов. Эти параметры между собой не все сочетаемы. Если вы напишете несочетаемый вариант, то вылетит Exception. Ниже вы можете увидеть, что позволяет выбрать второй параметр. Первый вариант по умолчанию понятен CONCUR_READ_ONLY – это то, что нам подставили. А если вы скажете: «хочу что-то более крутое». Вы можете сделать, чтобы курсор позволял вносить изменения в БД – CONCUR_UPDATABLE. Т.е. это будет выглядеть так. Вы читаете данные с помощью SELECT, на какой-то строчке останавливаетесь и говорите: «Ну это же лажа!». И тут же меняете данные в БД с SELECT’а.


Поделиться с друзьями:

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...

Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...

Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций...

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.016 с.