1 / 49

Java Lecture # 8 Database Usage in Java : Object-Relational Mapping

Java Lecture # 8 Database Usage in Java : Object-Relational Mapping. Saint Petersburg, 2012. JDBC Overview. Load driver or obtain datasource Establish connection using a JDBC URL Create statement Execute statement Optionally, process results in result set Close database resources

misaacs
Download Presentation

Java Lecture # 8 Database Usage in Java : Object-Relational Mapping

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Java Lecture #8Database Usage in Java:Object-Relational Mapping Saint Petersburg, 2012

  2. JDBC Overview Load driver or obtain datasource Establish connection using a JDBC URL Create statement Execute statement Optionally, process results in result set Close database resources Optionally, commit/rollback transaction

  3. Boiler code

  4. Agenda Что такое ORM и зачем он нужен? Как использовать ORM в Java? Java Persistence API Hibernate

  5. N-Tier Architecture

  6. Problem Согласно ООП, объекты программы = объекты реального мира. class Human { private String name; private List<String> phoneList; private List<String> addressList; } Такие объекты должны быть преобразованы в форму, в которой они могут быть сохранены в БД

  7. Why to use Object-Relational Mapping (ORM) ? Java objects  database tables JDBC – потенциальный источник ошибок и слишком сложен Возможности современного ORM: • Прозрачное хранение объектов (JavaBeans) • Транзитивное хранение • Проверка изменения данных (dirty checking) • Inheritance mapping • Lazy fetching • Outer join fetching • Runtime SQL generation

  8. Why to use Object-Relational Mapping (ORM) ? Part II Естественная модель объектов Более компактный код, поэтому: • Быстрее пишется • Проще читается и поддерживается Код может быть протестирован вне контейнеров Классы могут быть повторно использованы в non-persistent context Оптимальные запросы к БД (smart fetching strategies) Возможности кеширования Бóльшаягибкость при изменении структуры данных/объектов

  9. ORM Persistence Subsystem Object Layer Storage Layer Physical Storage System

  10. ORM in Java Использование дополнительных библиотек и шаблонов проектирования Например, для Java: • ActiveJDBC • Enterprise Java Beans • Hibernate • EclipseLink JPA • …

  11. Active Record ActiveJDBC–реализация шаблона проектирования Active Record Human human = new Human(); human.setName("John"); human.getAddressList().add("St.Petersburg"); human.getPhoneList().add("+79998887777"); human.save(); Human.findByName("John"); INSERT INTOhumans(name, address, phone) VALUES('John', 'St.Petersburg', '+79998887777'); SELECT * FROM humans WHERE name = 'John';

  12. Data Access Object (DAO) Объект, предоставляющий абстрактный интерфейс к какому-либо типу базы данных или механизму хранения interfaceMyDao { List<String> getAllNames(); } can be used in a large percentage of applications - anywhere data storage is required. hide all details of data storage from the rest of the application. act as an intermediary between the application and the database. They move data back and forth between objects and database records.

  13. What is JPA? Java Persistence API A specification for generic ORM • Not an implementation • Vendor-neutral Based on Annotations • Metadata Developed out of EJB 3 Specification (since 2006) • Replacement for train wreck EJB 2 persistence • Stand alone specification (does not require JEE container) JPQL • SELECT * FROM Human humanWHERE human.name = 'John';

  14. JPA

  15. JPA Criteria API Удобно при создании сложных запросов Основные классы: • javax.persistence.criteria.CriteriaBuilder • javax.persistence.criteria.CriteriaQuery • javax.persistence.criteria.Expression • javax.persistence.criteria.Predicate • javax.persistence.criteria.Path Пример: List cats = sess.createCriteria(Cat.class).add( Restrictions.like("name", "Fritz%") ).add( Restrictions.or( Restrictions.eq( "age", new Integer(0) ), Restrictions.isNull("age") ) ) .list();

  16. Hibernate

  17. What is Hibernate? Very popular open source Java ORM tool Originally developed by Gavin King Now maintained by Redhat (JBoss Group) Implements JPA specification Predates JPA • Has its own custom API for persisting mapped objects

  18. Overview JPA Benefits • Standard • Vendor-neutral • Works with EJB 3 Hibernate Benefits • More mature (fully developed) • Works with Java 1.4 and older Best practice • Use JPA when you can • Use Hibernate API when you need it

  19. Hibernate: Architecture SessionFactory – Singleton, создает объекты Session Session – взаимодействие между приложением и Hibernate TransactionFactory – создает транзакции Transaction – обертка для транзакций (JTA, JDBC)

  20. Using

  21. Hibernate: Mapping Hibernate legacy • XML configuration files • Each file mapped a class and it’s persistent fields JPA and Hibernate 3.2 and above • Annotations (javax.persistence package) • Class-level: marks a class as persistent • Method/File level: configure field and relationship persistence Hibernate still supports XML configuration

  22. JPA Annotations @Entity @Id @GeneratedValue @Column @JoinColumn @OneToOne @OneToMany @ManyToOne @ManyToMany

  23. JPA Annotation Rules  Any persistent class must be annotated with @Entity (or inherit from a class that does) All persistent classes must have a field annotated by @Id signifying the primary key All instance fields in a persistent class are assumed to be mapped to columns with the same name as the field • @Transient will remove a field from mapping Relationships are not automatically mapped • Relationships are modeled as aggregate members • Require an @OneToOne, @OneToMany, @ManyToOne, or @ManyToMany

  24. JPA Defaults Class annotation @Table defines specific table mappings • Name Field annotation @Column defines specific column mappings • Name • Nullability • Size • Uniqueness

  25. Hibernate: Entity Основа Hibernate - Entity Обязательно в каждой Entity должен быть id Entity – JavaBean: • Конструктор по умолчанию • Геттеры/сеттеры для всех полей Маппинг может осуществляться автоматически или вручную к колонке Аннотировать можно поля или геттеры

  26. @OneToOne

  27. @OneToMany

  28. @ManyToOne

  29. @ManyToMany

  30. Features Lazy Loading Cascading Fetch Polymorphic

  31. Lazy loading Performance optimization Related items are not retrieved until they are first accessed • Field level access Limited to work only within the Session or EntityManager that loaded the parent object • Causes a big problem in web applications

  32. Fetch Fetch mode • Lazy • Eager • disable lazy loading Mode can be configured on each relationship Consider performance and use when configuring fetch

  33. Cascade Tells Hibernate whether to follow the path of the relationship on • Insert • Update • Delete • All Hibernate adds options • Delete All Orphans

  34. Inheritance JPA and Hibernate support mapping Class inheritance to relational tables Three approaches provided: • Table per class hierarchy • Table per sub class • Table per concrete class

  35. Core classes Hibernate • Configuration -> SessionFactory -> Session • Session is gateway to persistence functions JPA • Persistence -> EntityManagerFactory -> EntityManager • EntityManager is gateway to persistence functions

  36. Entity Manager persist(Obect o) • Saves or updates the specified object tree remove(Object o) • Deletes the specified object find(Class type, Serializable id) • Retrieves the item of the specified type by id merge(Object o) • Attaches a detached instance to the manager (required for update on item retrieved from a different manager) getTransaction() • Provides a transaction object to perform commit and rollback functions

  37. Hibernate: Configuration Used to define application persistence properties • Database connection information • Dialect (database-specific language) • Logging • Schema creation parameters Default location is in CLASSPATH JPA • META-INF/persistence.xml Hibernate • hibernate.cfg.xml

  38. Hibernate: Configuration

  39. Hibernate: Пример

  40. Querying JPAQL/HQL Named Queries Criteria By Example Native SQL

  41. JPAQL & HQL Query languages that are similar to SQL but are more object-centric Supports • Selection of object instances from persistent types • Selection of properties (rather than columns) • Polymorphic selection • Automatic joining for nested properties Should be very comfortable for those familiar with SQL JPAQL is a subset of HQL • Hibernate implementation will support both

  42. Example JPAQL “from Item i where i.name = ‘foobar’” “from Item i where i.bidder.name = ‘Mike’” // Implicit join “from Car c where c.coupe = true” “from Item i where i.bids is not empty” “from Item i where size(i.bids) > 3” // Implicit join “from Item i order by i.name asc, i.entryDateasc” “from Item i join i.bids b where b.amount > 100” // will return rows with an array “select distinct(i) from Item i join i.bids b where b.amount > 100” // returns Items “select i.name, i.description from Item i where entryDate > ?”

  43. Features JPAQL String functions • upper, lower, length, substring, concat, trim Aggregation functions • count, min, max, sum, avg • Can require “group by” clause • Also supports “having” on “group by” Subselects

  44. Query parameters JPAQL Work just like JDBC Parameters • ? Will act as a placeholder for an indexed parameter • :name will designate a parameter with the name of “name” Examples • select i from Item where name like ? • select i from Item where name like :name

  45. How To JPAQL Must be created from the EntityManager or Session • EntityManger.createQuery(String jpaql) • Session.createQuery(String hql) Query objects can be configured • Maximum number of results • Parameters set Query objects can then be used to list out the results of the query • list() returns a java.util.List

  46. Named queries JPAQL Predefined queries that can be executed by name • Standard QL used for query Defined using @NamedQuery • Typically above the persistent class the query is for • Defined with name and query values Running the query • EntityManager.createNamedQuery(name) • Session.getNamedQuery(name)

  47. Criteria and Example Queries Hibernate only feature Full API for programmatically defining the query structure using objects Created by Session Criteria maps all logical restrictions to a query as objects and methods Example query uses an example object as the basis to find other objects • Based on Criteria API

  48. Native SQL Queries Both JPA and Hibernate support running raw SQL • Session.createSQLQuery(sql) • EntityManager.createNativeQuery(sql) Supports specifying the entity type to convert the results to

  49. References George Reese. Java Database Best Practices John O'Donahue. Java Database Programming Bible Christian Bauer, Gavin King. Hibernate in Action Christian Bauer, Gavin King. Java Persistence with Hibernate JPA in JavaEE6 Tutorial: http://docs.oracle.com/javaee/6/tutorial/doc/bnbpy.html Using the Criteria API to Create Queries: http://docs.oracle.com/javaee/6/tutorial/doc/gjitv.html http://hibernate.org/docs

More Related