Spec-Zone .ru
спецификации, руководства, описания, API
След: JDBC (ТМ) Доступ к базе данных
Урок: Основы JDBC
Используя Специализированные Отображения Типа
Домашняя страница > JDBC (ТМ) Доступ к базе данных > Основы JDBC

Используя Специализированные Отображения Типа

Отметьте: MySQL и DB Java в настоящий момент не поддерживают определяемые пользователем типы, структурированные типы, или DISTINCT Тип данных SQL. Следовательно, никакой учебный пример JDBC не доступен, чтобы демонстрировать функции, описанные в этом разделе.

С деловым гудением владелец Перерыва на кофе регулярно добавляет новые хранилища и производит изменения в базе данных. Владелец решил использовать пользовательское отображение для структурированного типа ADDRESS. Это позволяет владельцу делать изменения в Java class, который отображается ADDRESS ввести. У Java class будет поле для каждого атрибута ADDRESS. Имя class и имена его полей могут быть любым допустимым идентификатором Java.

Следующие темы затрагиваются:

Реализация SQLData

Первая вещь, требуемая для пользовательского отображения, состоит в том, чтобы создать class, который реализует интерфейс SQLData.

Определение SQL структурированного типа ADDRESS похож на это:


  CREATE TYPE ADDRESS
  (
    NUM INTEGER,
    STREET VARCHAR(40),
    CITY VARCHAR(40),
    STATE CHAR(2),
    ZIP CHAR(5)
  );

class, который реализует SQLData интерфейс для пользовательского отображения ADDRESS тип мог бы быть похожим на это:

public class Address implements SQLData {
    public int num;
    public String street;
    public String city;
    public String state;
    public String zip;
    private String sql_type;
    
    public String getSQLTypeName() {
        return sql_type;
    }

    public void readSQL(SQLInput stream, String type)
        throws SQLException {
        sql_type = type;
        num = stream.readInt();
        street = stream.readString();
        city = stream.readString();
        state = stream.readString();
        zip = stream.readString();
    }

    public void writeSQL(SQLOutput stream)
        throws SQLException {
        stream.writeInt(num);
        stream.writeString(street);
        stream.writeString(city);
        stream.writeString(state);
        stream.writeString(zip);
    }
}

Используя Карту Типа Соединения

После записи class, который реализует интерфейс SQLData, единственная другая вещь, которую необходимо сделать, чтобы установить пользовательское отображение, состоит в том, чтобы сделать запись в карте типа. Для примера это означает вводить полностью определенное имя SQL для ADDRESS введите и Class объект для class Address. Карта типа, экземпляр java.util.Map взаимодействуйте через интерфейс, связывается с каждым новым соединением, когда оно создается, таким образом, Вы используете что один. Принятие этого con активное соединение, следующий фрагмент кода добавляет запись для UDT ADDRESS к карте типа, связанной с con.

java.util.Map map = con.getTypeMap();
map.put("SchemaName.ADDRESS", Class.forName("Address"));
con.setTypeMap(map);

Всякий раз, когда Вы вызываете getObject метод, чтобы получить экземпляр ADDRESS введите, драйвер будет проверять карту типа, связанную с соединением, и видеть, что у этого есть запись для ADDRESS. Драйвер отметит Class объект для Address class, создайте экземпляр этого, и сделайте много других вещей в фоновом режиме, чтобы отобразиться ADDRESS к Address. Вы не должны сделать чего-то большего чем генерировать class для отображения и затем заставить запись в типе отобразиться, чтобы позволить драйверу знать, что есть пользовательское отображение. Драйвер сделает все остальные.

Ситуация подобна для того, чтобы сохранить структурированный тип, у которого есть пользовательское отображение. Когда Вы вызываете метод setObject, драйвер проверит, чтобы видеть, является ли значение, которое будет установлено, экземпляром class, который реализует интерфейс SQLData. Если это будет (подразумевать, что есть пользовательское отображение), то драйвер будет использовать пользовательское отображение, чтобы преобразовать значение в его дубликат SQL прежде, чем возвратить это базе данных. Снова, драйвер делает пользовательское отображение негласно; все, что Вы должны сделать, предоставить метод setObject с параметром, у которого есть пользовательское отображение. Вы будете видеть пример этого позже в этом разделе.

Смотрите на различие между работой со стандартным отображением, a Struct объект, и пользовательское отображение, class в языке программирования Java. Следующий фрагмент кода показывает стандарт, отображающийся на a Struct объект, который является отображением использования драйвера, когда нет никакой записи в карте типа соединения.

ResultSet rs = stmt.executeQuery(
    "SELECT LOCATION " +
    "WHERE STORE_NO = 100003");
rs.next();
Struct address = (Struct)rs.getObject("LOCATION");

Переменная address содержит следующие значения атрибута: 4344, "First_Street", "Verona", "CA", "94545".

Следующий фрагмент кода показывает то, что происходит, когда есть запись для структурированного типа ADDRESS в карте типа соединения. Помните что столбец LOCATION значения хранилищ типа ADDRESS.

ResultSet rs = stmt.executeQuery(
    "SELECT LOCATION " +
    "WHERE STORE_NO = 100003");
rs.next();
Address store_3 = (Address)rs.getObject("LOCATION");

Переменная store_3 теперь экземпляр class Address, с каждым значением атрибута, являющимся текущей стоимостью одного из полей Address. Отметьте, что следует не забыть преобразовывать объект, полученный getObject метод к Address объект прежде, чем присвоить это store_3. Отметьте также это store_3 должен быть Address объект.

Сравните работу с Struct возразите против работы с экземпляром Address class. Предположите хранилище, перемещенное в лучшее расположение в соседнем городе, и поэтому следует обновить базу данных. С пользовательским отображением, сброс поля store_3, как в следующем фрагменте кода:

ResultSet rs = stmt.executeQuery(
    "SELECT LOCATION " +
    "WHERE STORE_NO = 100003");
rs.next();
Address store_3 = (Address)rs.getObject("LOCATION");
store_3.num = 1800;
store_3.street = "Artsy_Alley";
store_3.city = "Arden";
store_3.state = "CA";
store_3.zip = "94546";
PreparedStatement pstmt = con.prepareStatement(
    "UPDATE STORES " +
    "SET LOCATION = ? " +
    "WHERE STORE_NO = 100003");
pstmt.setObject(1, store_3);
pstmt.executeUpdate();

Значения в столбце LOCATION экземпляры ADDRESS ввести. Драйвер проверяет, что тип соединения отображается, и видит, что есть соединение записи ADDRESS с class Address и следовательно использует пользовательское отображение, обозначенное в Address. Когда код вызывает метод setObject с переменной store_3 как второй параметр, драйвер проверяет и видит это store_3 представляет экземпляр class Address, который реализует интерфейс SQLData для структурированного типа ADDRESS, и снова автоматически использует пользовательское отображение.

Без пользовательского отображения для ADDRESS, обновление больше походило бы на это:

PreparedStatement pstmt = con.prepareStatement(
    "UPDATE STORES " +
    "SET LOCATION.NUM = 1800, " +
    "LOCATION.STREET = 'Artsy_Alley', " + 
    "LOCATION.CITY = 'Arden', " +
    "LOCATION.STATE = 'CA', " +
    "LOCATION.ZIP = '94546' " +
    "WHERE STORE_NO = 100003");
pstmt.executeUpdate;

Используя Вашу Собственную Карту Типа

До этой точки Вы использовали только карту типа, связанную с соединением для пользовательского отображения. Обычно, это - единственная карта типа, которую будет использовать большинство программистов. Однако, также возможно создать карту типа и передать это к определенным методам так, чтобы драйвер использовал ту карту типа вместо того, связанного с соединением. Это позволяет два различных отображения для того же самого определяемого пользователем типа (UDT). Фактически, возможно иметь многократные пользовательские отображения для того же самого UDT, столь же долго, как каждое отображение устанавливается с class, реализовывая SQLData взаимодействуйте через интерфейс и запись в карте типа. Если Вы не передадите карту типа к методу, который может принять один, то драйвер будет значением по умолчанию использовать карту типа, связанную с соединением.

Есть очень немного ситуаций, которые призывают к использованию карты типа кроме того, связанного с соединением. Могло быть необходимо предоставить метод карту типа, если бы, например, несколько программистов, работающих над приложением JDBC, объединенным, их компоненты и использовали то же самое соединение. Если бы два или больше программиста создали свои собственные отображения для того же самого SQL UDT, каждый должен был бы предоставить его или её собственную карту типа, таким образом переопределяя карту типа соединения.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Используя Структурированные Объекты
Следующая страница: Используя Объекты Канала передачи данных