Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Java_sp.doc
Скачиваний:
28
Добавлен:
29.10.2018
Размер:
1.12 Mб
Скачать

Типы данных и их преобразование

Методы getXXX пытаются сконвертировать низкоуровневые данные в типы данных языка Java. Например, метод если метод getXXX - это getString и тип данных в БД - VARCHAR, драйвер JDBC сконвертирует VARCHAR в объект String. Возвращаемым из метода getString значением будет Java-объект String.

Использование потоков для очень больших значений

С помощью ResultSet возможно получать очень большие данные типа LONGVARBINARY или LONGVARCHAR. Методы getBytes и getString возвращают эти данные в виде одного большого куска (вплоть до пределов, которые можно узнать с помощью метода Statement.getMaxFieldSize). Тем не менее, может оказаться удобнее считывать очень большие данные небольшими кусками. Это делается с помощью потоков (java.io.InputStream), которые возвращаются некоторыми методами ResultSet. Обратите внимание на то, что к этим потокам надо обращаться сразу, так как они будут закрыты при следующем вызове getXXX объекта ResultSet. (Такое поведение диктуется низкоуровневой реализацией доступа к большим двоичным объектам)

Значения null в результатах

Для того, чтобы определить, равно ли значение колонки NULL или нет, надо сначала считать значение колонки, а затем использовать метод ResultSet.wasNull для выяснения этого факта. Значение true означает, что считанное значение равно NULL.

Нет никакой необходимости закрывать ResultSet; это делается автоматически родительским объектом Statement, когда последний закрывается, выполняется повторно или используется для извлечения следующего результата в последовательности нескольких результатов.

12. Объектно-реляционное отображение. Создание персистентных классов при помощи jpa

ORM берет на себя “превращение” таблицы в объект.

Технология JPA является абстракцией над JDBC и позволяет быть независимым от SQL. Все классы и интерфейсы JPA расположены в пакете javax.persistence, основными составляющими технологии являются:

  • ORM (механизм объектно-реляционного отображения);

  • Entity manager API — позволяет осуществлять базовые операции CRUD;

  • JPQL и Criteria API — механизмы извлечения данных;

  • Управление транзакциями и блокировками (как с использованием JTA, так и без);

  • Механизмы обратных вызовов и listener-ов.

Hibernate - это механизм отображения в реляционной базе данных объектов java.

Hibernate не только решает задачу связи классов Java с таблицами базы данных (и типов данных Java с типами данных SQL), но также предоставляет средства для автоматической генерации и обновления набора таблиц, построения запросов и обработки полученных данных и может значительно уменьшить время разработки, которое обычно тратится на ручное написание SQL- и JDBC-кода.

Персистентные классы определяются в элементе class:

Часть элемента класс (Служит для определения как загружать и сохранять объекты персистентного класса):

<hibernate-mapping package="ru.topcode.hibertest.domain">

<class name="User" table="user_list">

<id name="id" column="UserId">

<generator class="native"/>

</id>

<property name="name" column="Login"/>

<property name="psw"/>

</class>

</hibernate-mapping>

(1)

name: Полное наименование Java класса персистентного класса или интерфейса.

(2)

table: Наименование таблицы БД.

Пример:

@Entity // Указываем что класс является сущностью

@Table(name = "user_list") // и хранится в таблице user_list

public class User {

  @Id // уникальным ID записи у нас будет свойство “id”

  private long id;

  private String name;

private String psw;

public String GetName(){return name};

public void setName(string name){

this.name=name};

}

Далее создаем файл META-INF/persistence.xml. Основной конфигурационной единицей JPA является Persistence Unit – в нем описывается тип провайдера, который предоставляет “услуги” JPA а также список классов, за которые он “отвечает” – JPA-сущностей. В блоке <properties> описываются параметры доступа к базе данных, её тип, настройки логирования etc.

<?xml version="1.0" ?>

<persistence version="1.0"

xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/persistence

http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">

<persistence-unit name="Наименование Persistence Unit-a" transaction-type="тип транзакции">

<provider>наименование провайдера, например оrg.apache.openjpa.persistence.PersistenceProviderImpl</provider>

<jta-data-source>наименование источника данных</jta-data-source>

<properties>

Тут определяются специфические для провайдера свойства, например

<property name="openjpa.ConnectionDriverName" value="oracle.jdbc.OracleDriver"/>

</properties>

</persistence-unit>

</persistence>

Наименование Persistence Unit-a - это именование экземпляра Unit-a на сервере приложения. По этому имени в дальнейшем нужно будет получать Enterprise Manager-ы. Enterprise Manager - это объект, который выполняет управление всеми процессами JPA для данного Unit-a.

Тип транзакции - Наименование типа транзакции. JPA технология поддерживает работу с транзакциями СУБД на разных уровнях. Для источников данных расположенных на сервере приложений необходимо использовать значение JPA для типа транзакции. В этом случае следить за своевременными выполнениями commit и rollback процедурами будет контейнер (он же сервер приложений). В этом случае, однако усложняется "ручное" влияние на эти процессы.

Наименование провайдера - это наименование класса-реализации JPA. Т.к. в J2EE используется только описание JPA, то конкретная реализация возлагается на плечи сторонних разработчиков. Тут выделяются Toplink, Hibernate, OpenJPA и т.д. Рекомендуется использовать Hibernate, т.к. это наиболее используемая технология. Однако в зависимости от сервера приложений такое предпочтение может меняться. Например, в состав сервера приложений уже входит некоторая реализация JPA.

Наименование источника данных - JNDI имя источника данных (Data Source), объявленного на сервере приложений. Существует возможность объявить набор источников данных на сервере приложений и возложить задачу манипулирования драйверами, пулами соединений и другими сопутствующими объектами на сервер приложений. Это существенно упрощает разработку. В таком случае, нам необходимо только лишь обратиться к заранее подготовленному источнику.

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

А также JPA требует наличия у каждого класса-сущности конструктора по умолчанию:

public User() {}

Управление сущностями (записями) в JPA производится с помощью экземпляра EntityManager-а. Для получения экземпляра EntityManager воспользуемя кодом:

import javax.persistence.EntityManager;

import javax.persistence.EntityManagerFactory;

import javax.persistence.Persistence;

//...

try {

EntityManagerFactory factory = Persistence.createEntityManagerFactory("Name");

EntityManager manager = factory.createEntityManager();

} finally {

if (manager!=null) manager.close();

if (factory!=null) factory.close();

}

где “Name” – имя нашего PersistenceUnit-а

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]