Основы программирования JDBC
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Классы, используемые для программирования JDBC, содержатся в пакетах java.sqlи javax.sql.

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

java – Djdbc . drivers = org . postgresql . DriverMyClass

Кроме того, приложение может установить системное свойство с помощью вызова:

System.setProperty("jdbc.drivers", "org.postgresql.Driver");

Драйвер также можно зарегистрировать вручную, загрузив его класс:

Class.forName("org.postgresql.Driver");

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

После регистрации драйвера можно установить соединение с БД. При работе с JDBC база данных представляется с помощью URL (UniformResourceLocator). Для PostgreSQL он принимает одну из следующих форм:

jdbc:postgresql:database

jdbc:postgresql://host/database

jdbc:postgresql://host:port/database

Для подключения к базе нужно использовать класс Connection:

Connection connection = DriverManager.getConnection(url, username, password);

Например:

Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/MyTest", "postgres", "root");

Для указания драйвера, URL, имени пользователя и пароля удобно применять файл свойств:

jdbc.drivers =org.postgresql.Driver

jdbc.url = jdbc:postgresql://localhost:5432/MyTest

jdbc.username = postgres

jdbc.password = root

Далее читаем файл свойств и устанавливаем соединение с БД:

Properties props = new Properties();

FileInputStream in = new FileInputStream("database.properties");

props.load(in);

in.close();

String drivers = props.getProperty("jdbc.drivers");

if(drivers != null) System.setProperty("jdbc.drivers", drivers);

String url = props.getProperty("jdbc.url");

String username = props.getProperty("jdbc.username");

String password = props.getProperty("jdbc.password");

Connection connection = DriverManager.getConnection(url, username, password);

Метод getConnection () возвращает объект Connection, с помощью которого создаётся объект Statement ,который используется для выполнения SQL – команд. Метод executeQuery ()возвращает объект ResultSet , который можно использовать для построчного просмотра результатов.

Извлечениеданных:

Statement statement = connection.createStatement();

ResultSet resultSet = statement.executeQuery("SELECT * FROM item");

while (resultSet.next()) {

    String str = resultSet.getString("name");

    System . out . println ( str );

}

В классе ResultSetитератор располагается в начале работы перед первой строкой, поэтому для перемещения его к первой строке нужно вызвать методnext ().Строки в наборе результатов располагаются совершенно произвольно. Если порядок следования важен, его необходимо установить с помощью оператора ORDERBY.

При обработке каждой отдельной строки нужно с помощью специальных методов получить содержимое каждого столбца.

resultSet.getString(1);

resultSet.getDouble("Price");

Для каждого типа данных языка Javaпредусмотрен отдельный метод извлечения информации, например, getString () и getDouble (). Для каждого из них реализовано два варианта, один из которых предполагает числовой, а второй – строковый параметр. При использовании числового параметраметод извлечет данные из столбца с указанным номером, нумерация столбцов начинается с 1. При использовании строкового параметра метод извлечет данные из столбца с указанным именем.

Если указанный тип не соответствует фактическому типу, метод извлечения данных выполняет преобразование. Например, метод resultSet . getString (" Price ")преобразует число с плавающей точкой из столбца Price в строку.

Типы данных SQLи Javaне всегда совпадают. В таблице 1 приведен список основных типов данных языка SQL и их эквивалентов в Java.

Таблица 1

Типы данных языка SQL Типы данных языка Java
INTEGER или INT int
SMALLINT short
NUMERIC(m,n), DECIMAL(m,n) илиDEC(m,n) java.math.BigDecimal
REAL float
DOUBLE double
CHARACTER(n) илиCHAR(n), VARCHAR String
BOOLEAN boolean
DATE java.sql.Date
TIME java.sql.Time

Метод executeUpdate ()возвращает количество строк, полученных в результате выполнения SQL-команды. Он может применяться для выполнения команд INSERT, UPDATEи DELETE, а также команд определения данных, в частности, CREATETABLEи DROPTABLE.

Закончив работу с классом ResultSet, StatementилиConnectionнужно вызвать метод close (), так как перечисленные объекты используют структуры данных большого объема и не стоит ждать, пока процедура сборки мусора освободит ресурсы. Метод close () класса Statement автоматически закрывает связанные с ним наборы результатов( если они открыты). Аналогично, метод close ()класса Connection закрывает все объекты Statement для этого соединения. Если время существования соединения невелико, нужно поместить вызов метода close ()в блок finally, гарантируя, что объект соединения не останется открытым.

Предварительно подготовленные команды

Вместо создания отдельной SQL-команды для каждого запроса следует предварительно подготовить запрос с подстановочной переменной и многократно использовать его, меняя только значение переменной. Эта возможность существенно повышает эффективность работы программы. Перед каждым выполнением запроса СУБД создает план его эффективного исполнения. Предварительно подготавливая запрос для последующего многократного повторного использования, можно избежать повторного создания плана. Подстановочная переменная в запросе обозначается символом ?. При использовании нескольких подстановочных переменных нужно следить за их расположением, чтобы правильно выполнять подстановку фактических значений.

String s = "SELECT name, price FROM tovar WHERE price >? AND price <?";

PreparedStatement ps = connection.prepareStatement(s);

ps.setDouble(1,2000);

ps.setDouble(2,6000);

ResultSet rs1 = ps.executeQuery();

Перед выполнением предварительно подготовленногозапроса нужно с помощью метода set () связать подстановочные переменные с их фактическими значениями. Как и при использовании методов get (), класса ResultSet ,для различных типов предусмотрены разные методы set (). Например:

ps . setDouble (1,2000);

Первый параметр обозначает номер позиции подстановочной переменной, второй – её фактическое значение. При повторном использовании предварительно подготовленного запроса с несколькими подстановочными переменными все связи остаются в силе, если только они не изменены с помощью метода set ().Это значит, что методы set ()нужно вызывать только для тех подстановочных переменных, которые изменяются в последующих запросах. Для изменения данных используется метод executeUpdate ().

Метаданные

В JDBCпредусмотрены дополнительные возможности для получения информации о структуре таблиц и самой БД. Например, можно получить список всех таблиц БД либо имена всех столбцов с типами данных в них. Эти сведения пригодятся, если вы пишете программный продукт для работы с произвольной БД.

В языке SQL информация и структуре БД и её компонентов называется метаданными. Информация о структуре БД хранится в классе DatabaseMetaData. Ниже приведен пример получения набора результатов, содержащего информацию обо всех таблицах БД.

DatabaseMetaData meta = connection.getMetaData();

ResultSet mrs = meta.getTables(null, null, null, new String[] {"TABLE"});

МетодgetTables(String catalog, String schemaPattern, String tableNamePattern String types[]) представляетописаниевсехтаблицвкаталоге, которыесоответствуютшаблонамсхемыииментаблиц, атакжезаданнымтипам. Схемой называется группа связанных таблиц и полномочий доступа. Каталогом называется связанная группа схем. Параметры catalogи schemaPatternмогут быть пустыми строками("") для извлечения таблиц без каталога и схемы либо иметь значение null, если нужно возвращать таблицы без учета каталога или схемы. Массив typesсодержит имена типов таблиц: TABLE, VIEW, ALIASи т.д. Если дляtypesзадано значение null, то будут возвращены таблицы всех типов. Результат выполнения запроса содержит 5 столбцов, которые имеют тип Stringи показаны в таблице 2.

Таблица 2

1 TABLE_CAT Каталог таблиц (значение может быть равно null)
2 TABLE_SCHEM Схема (значение может быть равно null)
3 TABLE_NAME Имя таблицы
4 TABLE_TYPE Тип таблицы
5 REMARKS Комментарии для таблицы

Если нас интересует имя таблицы, т.е. третий столбец, то нужно вызвать метод mrs . getString (3).

Сведенияоструктурунаборарезультатов хранятся в классе ResultSetMetaData.

ResultSet rs = statement.executeQuery("SELECT * FROM item");

ResultSetMetaData rsmd= rs.getMetaData();

ПослеполучениярезультатоввыполнениязапросаможноопределитьколичествостолбцовметодомgetColumnCount(), именастолбцовgetColumnLabel(intcolumn)ит.д.


 


XML

SGML(Standard Generalized Markup Language)

HTML                                                  XML

(Hypertext Markup Language)                      (Extensible Markup Language)

• SGML – с 1970-х годов использовался для описания структуры сложных документов в некоторых отраслях промышленности с высокими требованиями к документации.

• HTML – язык разметки гипертекста.

• XML – язык для описания иерархических данных.

Отличия XML от HTML

• В отличие от HTML, в языке XML учитывается регистр символов.

• В языке HTML некоторые закрывающие дескрипторы могут отсутствовать, в XML это не разрешается.

• Для элементов, тело которых отсутствует, в XML предусмотрена сокращенная запись открывающего дескриптора, совмещённого с закрывающим. В этом случае открывающий дескриптор заканчивается символом /

• В XML значения атрибутов должны быть помещены в кавычки, а в HTML кавычки могут отсутствовать.

• В HTML допускается использование имен атрибутов без указания их значений, а в HML все атрибуты должны иметь значения.

Пример 1

ПримерXML:

<configuration>

<title>

<font>

              <name>Helvetica</name>

              <size>36</size>

</font>

</title>

<body>

<font>

<name>Times Roman</name>

<size>12</size>

</font>

</body>

<window>

<width>400</width>

<height>200</height>

</window>

<color>

<red>0</red>

<green>50</green>

<blue>100</blue>

</color>

<menu>

<item>Times Roman</item>

<item>Helvetica</item>

</menu>

</configuration>

Структура XML - документа

XML - документ начинается с заголовка (необязательно)
<?xml version="1.0"?>

<?xml version="1.0" encoding="UTF-8"?>

Далееидёт DTD (Document Type Definition) ( необязательно )
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.

//DTD Web Application 2.2//EN“

"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">

Наконец, тело XML -документа содержит корневой
элемент,
в состав которого могут входить другие
элементы

    <configuration>– корневой элемент

• Каждый элемент может содержать дочерние элементы, текст либо и то, и другое

• XML-документы рекомендуется формировать так, чтобы элементы содержали либо дочерние элементы, либо текст, т.е. следует избегать создания структур:

<font>

    Helvetica

    <size>36</size>

</font>

Такая структура называется смешанным содержимым/

• XML-элементы могут содержать атрибуты

              <size unit="pt">36</size>

• Элементы и текст являются основными компонентами XML-документов, но возможны и другие инструкции:

§ Ссылки на символы &#d или &#xh, где d – десятичное, а h – шестнадцатеричное Unicode-значение. Например, &#233, &#x2122

§ Ссылки на примитивы имеют вид &name. Например,
&lt; &gt; &amp; &quot; &apos;

§ CDATA-разделы ограничены группами символов <![CDATA[ и ]]>, предназначены для включения строк с символами <>&, которые не следует интерпретировать как символы разметки

    < ! [CDATA[ <&> are my favorite delimiters ] ] >

§ Инструкции обработки ограничиваются символами <? и ?>, нужны приложению в котором используется данный XML-документ
<?xml version ="1.0"?>

§ Комментарии ограничиваются символами <! -- и -->. В комментариях нельзя использовать строки типа --. Не следует включать в комментарии скрытые команды, для их выполнения предназначены инструкции обработки

    <!-- This is a comment. -->







DTD и XML- схема

• XML-анализатор может автоматически проверять корректность структуры документа

• Для указания структуры документа нужно создать DTD либо XML-схему

• Они указывают допустимые дочерние узлы элементов и атрибутов каждого элемента

• XML-схема позволяет формулировать сложные правила, которые нельзя выразить средствами DTD

• В отличие от DTD, правила, соответствующие схеме, выражаются на языке XML, что упрощает их обработку

• XML-схема сложнее DTD

Document Type Definition (DTD)

• Существует несколько способов связывания DTD с XML-документом:

§ Первыйспособ
<?xml version="1.0"?>
<!DOCTYPE configuration [
                      <!ELEMENT configuration …>

другие правила

   …

]>

< configuration >

</ configuration>

§ Второйспособ
<!DOCTYPE configuration SYSTEM "config.dtd">

§ Третийспособ
<!DOCTYPE configuration SYSTEM "http://myserver.com/config.dtd">

§ Рассмотрим правила, которые могут задаваться посредством DTD.

§ Правило ELEMENT указывает дочерние узлы данного элемента в виде регулярного выражения, которое состоит из перечисленных в таблице 3 компонентов.

Таблица 3

Правило Описание
E* 0 или более элементов Е
E+ 1 или более элементов Е
E? 0 или 1 элемент Е
E1|E2|…|En Одно из элементов Е1, Е2, …, Еn
E1, E2, …, En Элемент E1, за которым следуют E2, …, En
#PCDATA Текст
(#PCDATA|E1|…|En)* 0 или более текстовых элементов и элементы Е1, Е2, …, Еn, расположенные в произвольном порядке (смешанное содержание)
ANY Любой дочерний узел
EMPTY Нет дочерних узлов





Примеры правил

<!ELEMENT menu (item)*>

<!ELEMENT font (name,size)>

    <!ELEMENT name (#PCDATA)>

    <!ELEMENT size (#PCDATA)>

<!ELEMENT chapter (intro,(heading,(para|image|table|note)+)+)>

• Для описания допустимых атрибутов элементов используется приведенный ниже синтаксис:
<! ATTLIST элемент атрибут тип поведение_по_умолчанию>

• В таблицах 4 и 5 приведены допустимые типы атрибутов и синтаксис параметра поведение_по_умолчанию.

Таблица 4 – Типы атрибутов

Тип Описание
CDATA Произвольная символьная строка
(A1|A2|…|An) Один из строковых атрибутов A1| A2| …|An
NMTOKEN, NMTOKENS Одна или несколько лексем, соответствующих имени
ID Уникальный идентификатор
IDREF, IDREFS Одна или несколько ссылка на уникальный идентификатор
ENTITY, ENTITIES Один или несколько непроанализированных примитивов

Таблица 5 – Поведение по умолчанию

Тип Описание
#REQUIRED Атрибут является обязательным
#IMPLIED Атрибут не является обязательным
A Атрибут не является обязательным, анализатор возвращает значение А, если атрибут не указан
#FIXED A Атрибут не должен быть указан, либо должен быть равен А, в любом случае анализатор возвращает значение А

Примеры выражений :

<!ELEMENTgridbag (row)*>

<!ELEMENT row (cell)*>

<!ATTLIST cell gridwidth CDATA "1">

<!ATTLIST cell gridheight CDATA "1">

<!ATTLIST cell fill (NONE|BOTH|HORIZONTAL|VERTICAL) "NONE">

<!ATTLIST cell anchor (CENTER|NORTH|NORTHEAST|EAST

|SOUTHEAST|SOUTH|SOUTHWEST|WEST|NORTHWEST)

"CENTER">

<!ATTLIST cell ipadx CDATA "0">

<! ATTLISTcellipadyCDATA "0">


Дата: 2019-02-19, просмотров: 386.