
- •1. Жизненный цикл приложения Java. Компиляция. JiTкомпиляция. Исполнение.
- •2. Классы. Абстрактные классы. Интерфейсы. Наследование.
- •3. Классы и интерфейсы стандартной библиотеки. Списки. Сортировка.
- •4. Классы и интерфейсы стандартной библиотеки. Ассоциированные массивы. Словари.
- •5. Классы и интерфейсы стандартной библиотеки. Потоки ввода-вывода. Файловый ввод-вывод.
- •6. Параллельные процессы. Синхронизация.
- •Синхронизация по ресурсам и событиям
- •Синхронизация по ресурсам
- •Синхронизация по событиям
- •7. Параллельные процессы. Управление потоками.
- •Создание и запуск потока выполнения
- •Поля и методы, заданные в классе Thread
- •Важнейшие константы и методы класса Thread:
- •Важнейшие методы объектов типа Thread:
- •8. Параллельные процессы. Управление памятью потока.
- •Хранение переменных в памяти
- •Блокировки
- •9. Jdbc, драйверы строка соединения, класс DriverManager, интерфейс Connection.
- •10. Jdbc, создание sql запросов, интерфейсы Statement, PreparedStatement Класс Statement.
- •Выполнение запроса через объект Statement
- •Закрытие объектов Statement
- •11. Jdbc, обработка полученных результатов, интерфейсы ResultSet, ResultSetMetaData.
- •Строки и курсоры
- •Колонки
- •Типы данных и их преобразование
- •Использование потоков для очень больших значений
- •Значения null в результатах
- •12. Объектно-реляционное отображение. Создание персистентных классов при помощи jpa
- •13. Объектно-реляционное отображение. Подключаемы провайдеры персистенции.
- •14. Кастомизация мэппинга персистентных классов на поля и таблички бд.
- •15. Объектно-реляционное отображение. Отображение реляционных связей many-to-many, one-to-many, one-to-one.
- •16. Объектно-реляционное отображение. Жизненный цикл персистентных объектов (entity lifecycle)
- •17. Объектно-реляционное отображение. Интерфейс EntityManager.
- •18. Объектно-реляционное отображение. Создание запросов на jpql, sql
- •19. Работа с xml в Java. Правильно сформированные (well-formed) и корректные (valid) xml документы
- •Понятие корректно сформированных (well-formed) xml-документов
- •Создание действительных (valid) xml-документов. Определение типа документа (dtd)
- •20. Jaxp, основные группы api.
- •21. Работа с xml документами посредством sax.
- •22. Работа с xml документами посредством dom.
- •23. Сравнение sax и dom подходов к обработке xml документов.
- •24. Jaxb, отображение Java класса, отображаемого на xml.
- •25. Создание jaxb контекста, маршалинг и демаршалинг.
- •26. Сервлеты, создание, жизненный цикл
- •27. Http запросы get, post, put, delete, head
- •28. Интерфейс servlet, класс HttpServlet
- •29. Создание rest сервисов, jax rs
- •30. Связка jaxb и jax rs, переключение типов возвращаемого контента (xml, json)
- •33. Оптимизация jvm
16. Объектно-реляционное отображение. Жизненный цикл персистентных объектов (entity lifecycle)
EntityManager
• Управляет жизненным циклом Entity объектов
> persist() - помещает объект в БД
> remove() - удаляет объект из БД
> merge() - синхронизирует с БД состояние отсоединенного объекта
> refresh() - обновляет из БД состояние объекта
Persist
public Order createNewOrder(Customer customer) {
// Создаем новый объект
Order order = new Order(customer);
// После вызова метода persist() объект меняет свой
// статус на управляемый. Во время очередной
// операции записи в БД обект будет помещен в БД.
entityManager.persist(order);
return order;
}
Find и Remove
public void removeOrder(Long orderId) {
Order order =
entityManager.find(Order.class, orderId);
// Объект будет удален из БД при очередной
// операции записи в БД. Доступ к удаленному
// объекту приводит к непредсказуемым
// результатам.
entityManager.remove(order);
}
Merge
public OrderLine updateOrderLine(OrderLine orderLine) {
// Метод merge возвращает управляемую копию
// переданного отсодиненного объекта. Если состояние
// отсоединного объекта было изменено, то изменения
// будут отражены в возвращаемой копии.
return entityManager.merge(orderLine);
}
Жизненный цикл Entity
17. Объектно-реляционное отображение. Интерфейс EntityManager.
Интерфейс Entity Manager используется для взаимодействия с persistence context.
Entity Manager обладает возможностями:
-
Записывать объекты в хранилище
-
Сохранять как простые, так и композитные (вложенные) объекты
-
Получать объекты из хранилища по имени класса или идентификатору объекта
-
Синхронизируется с модулем поиска
-
Хранит историю изменений
-
Хранит связи между объектами
Естественно, существуют аналогичные модулю Entity Manager разработки, наиболее известной свободно-распространяемой из которых является библиотека Hibernate
Плюсы
-
Модуль EM представляет собой web-сервис, что предаёт ему автономность и возможность использования несколькими клиентами одновременно
-
Более лёгкая настройка при подготовке к работе по сравнению с Hibernate
-
Основное отличие, более высокая скорость работы
Минусы
-
В EM при подключении к базе данных нет возможности управлять форматом сохранения, нельзя напрямую работать с базой данных
-
Hibernate поддерживает больше типов коллекций (Map, Set и т. д.), в EM реализована поддержка только типа List
Следующий пример показывает, как создать менеджер сущностей и как сохранить сущность Book: EntityManagerFactory emf = Persistence.createEntityManagerFactory("chapter02PU"); EntityManager em = emf.createEntityManager(); em.persist(book);
18. Объектно-реляционное отображение. Создание запросов на jpql, sql
Подобно JDBC, технология JPA позволяет нам выполнять запросы к БД с использованием
языков запросов SQL и JPQL (Java Persistence Query Language).
Методы интерфейса EntityManager, предназначенные для создания запросов.
Query createQuery(String jpaQuery) Создает запрос к БД на языке JPQL.
Query createNativeQuery(String sqlQuery) Создает SQL-запрос в диалекте, специфичном для
конкретной СУБД.
Query createNamedQuery(String queryName) Создает именованный запрос.
По своим синтаксическим конструкциям JPQL очень похож на SQL. Однако, если SQL предназначен для работы с реляционной моделью данных, то в JPQL вся работа производится с Java-объектами.
JPQL обладает одним важнейшим свойством — переносимостью. Как известно, имеющиеся СУБД используют различные диалекты SQL, в общем случае несовместимые между собой. Синтаксис JPQL не привязан к диалекту SQL какой-либо СУБД. Все методы возвращают объект класса JPA-провайдера, реализующего интерфейс javax.persistence.Query, который является объектным представлением запроса к БД. Query похож на java.sql.Statement в JDBC и предназначен для контроля выполнения запроса и получения результатов.
Пример:
private Customer findCustomerByPhoneNumber(String phoneNumber) {
Customer customer = null;
String queryStr = "SELECT OBJECT(c) "
+ "FROM Customer AS c, IN(c.phones) p "
+ "WHERE p.phoneNumber = :phoneNumber";
Query query = manager.createQuery(queryStr);
query.setParameter("phoneNumber", phoneNumber);
EntityTransaction t = null;
try {
t = manager.getTransaction();
t.begin();
customer = (Customer) query.getSingleResult();
t.commit();
} catch (Exception e) {
// Откат транзакции и обработка возникшего исключения
...
}
return customer;
}
Результатом выполнения нашего запроса является единственное значение, поэтому для
получения объекта класса Customer мы используем метод getSingleResult. Если
результатом запроса будет набор значений, метод getSingleResult сгенерирует
исключение javax.persistence.NonUniqueResultException. В случае, если не будет
выбрано ни одной строки, метод сгенерирует javax.persistence.NoResultException.
Для получения списка объектов следует вызвать метод getResultList.
SQL запросы преставляются через тот же Query интерфейс, который используется для JPQL запросов. Единствоенное различие заключается в том, что для SQL используется метод Session.createSQLQuery().
Query sqlQuery = sess.createSQLQuery("select * from cats ", Cat);
sqlQuery.setMaxResults(50);
List cats = sqlQuery.list();
Три параметра используемые при вызове createSQLQuery():
-
строка SQL запроса
-
возвращаемый запросом персистентный класс
Именованные SQL запросы могут быть определены в документе маппинга и вызваны в точности так же, как это осуществляется для HQL запросов.
List people = sess.getNamedQuery("mySqlQuery")
.setMaxResults(50)
.list();
<sql-query name="mySqlQuery">
<return alias="person" class="eg.Person"/>
SELECT {person}.NAME AS {person.name},
{person}.AGE AS {person.age},
{person}.SEX AS {person.sex}
FROM PERSON {person} WHERE {person}.NAME LIKE 'Hiber%'
</sql-query>