Your SlideShare is downloading. ×
0

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Java Persistence API入門

5,384

Published on

JPAはO/RマッピングのAPIで、Java EEの標準仕様にも含まれています。アプリケーションのデータアクセス層開発を簡単にするだけでなく、Eclipse(OEPE 12c)やWebLogic Server 12cと組み合わせることで、より効率の良い開発を行う ことができます。JPAの基本から簡単な開発手順を解説します。 …

JPAはO/RマッピングのAPIで、Java EEの標準仕様にも含まれています。アプリケーションのデータアクセス層開発を簡単にするだけでなく、Eclipse(OEPE 12c)やWebLogic Server 12cと組み合わせることで、より効率の良い開発を行う ことができます。JPAの基本から簡単な開発手順を解説します。

日本オラクル株式会社 Fusion Middleware事業統括本部 ソリューション本部
松林 晶

Published in: Technology
0 Comments
8 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
5,384
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
102
Comments
0
Likes
8
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. WebLogic Server 勉強会JPA 2.0入門2013年 3月21日日本オラクル株式会社Fusion Middleware事業統括本部 松林晶1 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 2. Program Agenda  JPAとは  JPA Demo  JPA2.1 新機能(予定)2 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 3. JPAとは 概要  Java Persistence APIの略  Java EE環境に限らず、Java SEでも利用可能  O/Rマッピングの仕様です – データベースのテーブルのレコードをJavaのオブジェクトに相互変換 – Javaのオブジェクトにアクセスし、データベース操作可能 参照 Java App 挿入 更新 Object データベース 削除 マッピング(自動で相互変換)3 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 4. JPAとは JPAの歴史  誕生の背景 EntityBeanの – EJBの難解さ、O/Rマッピングフレームワーク 難解さ  JPA1.0(2006年) – EJB3.0の仕様の一部 O/Rマッピング – 従来のEntityBeanに代わるものとして策定 フレームワーク  JPA2.0(2009年) の台頭 – EJBから独立(Java EE 6)  JPA2.1(2013年予定) – Java EE 7 予定4 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 5. JPAとは JDBCプログラミング public static void main(String[] args) { public static void main(String[] args) { Connection con = null; EntityManager em = Persistence.createEntityManagerFactory("db").createEntityManager(); PreparedStatement stm = null; Employee emp = em.find(Employee.class, 100L); try { System.out.println(emp); Class.forName(“oracle.jdbc.OracleDriver”); em.close(); con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "HR", "hr"); } stm = con.prepareStatement("SELECT * FROM Employees e WHERE e.EMPLOYEE_ID = ?"); stm.setInt(1, 100); ResultSet rSet = stm.executeQuery(); if (rSet.next()) { Employee emp = new Employee(); emp.setEmployeeId(rSet.getLong("EMPLOYEE_ID")); emp.setLastName(rSet.getString("LAST_NAME")); emp.setFirstName(rSet.getString("FIRST_NAME")); emp.setEmail(rSet.getString("EMAIL")); emp.setPhoneNumber(rSet.getString("PHONE_NUMBER")); emp.setHireDate(rSet.getDate("HIRE_DATE")); emp.setJobId(rSet.getString("JOB_ID")); emp.setSalary(BigDecimal.valueOf(rSet.getLong("SALARY"))); emp.setCommissionPct(BigDecimal.valueOf(rSet.getLong("COMMISSION_PCT"))); emp.setDepartmentId(BigDecimal.valueOf(rSet.getLong("DEPARTMENT_ID"))); System.out.println(emp); コード量大幅削減 } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { try { if (stm != null) stm.close(); if (con != null) con.close(); } catch (SQLException e) { e.printStackTrace(); } }5 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 6. JPAとは JPAの構成要素 Persistence Context Persistent Unit EntityManager (persistence.xml) データ操作及び管理の Entity 為のAPIを提供する Entity Entity データベース 決定 Entity 生成 Entity EntityManagerFactory Persistence Unitの設定に基づ き、Entity Managerのインスタ ンスを生成6 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 7. JPAとは エンティティとは  テーブルに対応したマッピング対象のクラス(=エンティティ) – ただのPOJO(Plain Old Java Object)で作成 – @Entityアノテーション ⇒ エンティティクラスであることを示す – @Idアノテーション ⇒ 主キーを示す @Entity public class Customer { エンティティ データベース @Id Customerクラス CUSTOMER表 private Long id; private String address1; ID ADDRESS1 AGE NAME TELEPHONE private long age; private String name; private String telephone; //セッタ・ゲッタ }7 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 8. JPAとは エンティティのライフサイクル8 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 9. JPAとは エンティティのライフサイクル(コード例)  ライフサイクルのコード例 – エンティティのインスタンスを生成(new)しただけではデータベースに は何も反映されない EntityManagerFactory emf = Persistence.createEntityManagerFactory(”DB"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); Customer customer = new Customer(); //Entityの生成 tx.begin(); em.persist(customer); //管理状態のEntity tx.commit(); //デタッチ状態になるEntity //JavaのHeapにはcustomerは存在するが、JPAの管理状態から外れデタッチ状態 //この状態でcustomerに対する操作を行った場合は、merge()で同期 em.close(); emf.close();9 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 10. JPAとは 2種類のエンティティマネージャ  コンテナ管理のエンティティマネージャ(Java EE環境) – アノテーション、DIによりEntityManagerをインスタンスを注入 – コンテナがトランザクションを管理する @PersistenceContext(unitname = “DB”) private EntityManager entityManager;  アプリケーション管理のエンティティマネージャ(Java SE/EE環境) – Factoryメソッドを使用して、EntityManagerを取得 – アプリケーション側でトランザクションを管理のためのコーディング必要 EntityManagerFactory emf = Persistence.createEntityManagerFactory(“DB"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); em.persist(customer); tx.commit(); em.close(); emf.close();10 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 11. JPAとは エンティティマネージャ①  データ操作及び管理の為のAPIを提供する。 – ライフサイクル管理のためのAPI persist() エンティティクラスを永続化管理対象にする (insert対象にする) remove() エンティティクラスを削除する(delete対象にする) refresh() データを同期する。データベースのデータでエンティティを上書き merge() 分離したエンティティをマージする。(管理対象にする) – 検索のためのAPI find() 主キーによるエンティティの検索 getReference() 主キーによるエンティティの検索11 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 12. JPAとは エンティティマネージャ②  データ操作及び管理の為のAPIを提供する。 – Query関連のAPI  createQuery() ,createNamedQuery() ,createNativeQuery() – Persistenceコンテキストの管理API flush() データを明示的にDBと同期する clear() エンティティ全てを管理対象から外す getTransaction() トランザクションの参照を取得 close() アプリケーション管理のエンティティマネージャを終了する12 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 13. JPAとは JPQL  Java Persistence Query Languageの略 – SQLに似たJPA用のクエリー言語 – SELECT / UPDATE / DELETEなどに対応 – WHERE句、ソート(ORDER BY)、集約(GROUP BY)等も可能 SELECT c FROM Customer c WHERE c.lastName = ‘Yamada’ ORDER BY c.id13 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 14. JPAとは JPQL  JPAのクエリは4種類 1. 動的クエリ  アプリケーション実行時にクエリを定義 2. 名前付きクエリ  動的クエリと異なり、静的で変更できないクエリ 3. ネイティブクエリ  データベース固有の機能を使用するためのクエリ(SQLをそのまま使 用可能)14 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 15. JPAとは JPQL  JPAのクエリは4種類 4. Criteria API JPA2.0  JPQLに相当するクエリをAPIベースで記述し型の安全性を確保 キャスト時の型 Criteria API による表記 チェック JPQL による表記 CriteriaBuilder builder = em.getCriteriaBuilder(); SELECT c FROM Customer c CriteriaQuery<Customer> query = builder.createQuery(Customer.class); WHERE c.name = ‘Oracle’ Root<Customer> c = query.from(Customer.class); query.select(c).where(builder.equal(c.get("name"), "Oracle"));15 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 16. JPA Demo16 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 17. JPA Demo Oracle Enterprise Pack for Eclipse 12c + WebLogic Server 12c  Oracle Enterprise Pack for Eclipse 12cを使用した簡単JPA開発17 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 18. JPA2.1 新機能(予定) JSR-338 Java Persistence 2.1 Proposed Final Draft18 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 19. JPA2.1 新機能(予定) Java EE 6 から Java EE 7へ そして Java EE 8へ… 2009 2013 ? Java EE 6 Java EE 7 Java EE 8 進 化19 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 20. JPA2.1 新機能(予定) 概要  JPAもJava EE 6 から Java EE 7へ JPA2.0 JSR 338 JPA2.1 Java EE 6 Java EE 7 JPQL/CriteriaAPIの強化 ストアドプロシージャサポート バルク更新 ON句サポート 他…20 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 21. JPA2.1 新機能(予定) ストアドプロシージャのサポート①  そもそもストアドプロシージャって… – データベースに対する一連の処理をまとめた一つのプログラム(データ ベースに保存) – クライアントから引数を渡して処理を実行、処理結果を返すことができる A実行命令! PROCEDURE A( i_param IN NUMBER, WebLogic 引数 o_param OUT NUMBER) Server 戻り値 アプリケーション 処理結果等 データベース サーバ21 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 22. JPA2.1 新機能(予定) ストアドプロシージャのサポート②  定義済み関数 + ユーザ定義関数の呼び出し可能 – 実装例 ストアドプロシージャのインスタストアドプロシージャ呼び出し側(セッションBean等) ンスを作成する。// ①エンティティマネージャからストアドプロシージャを作成する 実行前に、パラメータのセットを しておくこStoredProcedreQuery query = プロシージャの戻り値は単数もしEntityManager.createNamedStoredProcedureQuery(“topGiftsStoredProcedure”); くはObjectの配列で返す// ②引数の設定query.registerStoredProcedureParameter(1, String.class, ParameterMode.INOUT); パラメータの登録query.setParameter(1, “top10”); 全てのパラメータは登録されなくquery.registerStoredProcedureParameter(2, Integer.class, ParameterMode.IN); てはならないquery.setParameter(2, 100); 第1パラメータは、String型で双方// ③ストアドプロシージャの実行 向query.execute();// ④アウトプットパラメータの1を取得 OUTパラメータ(戻り値)の取得String response = query.getOutputParameterValue(1);22 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 23. JPA2.1 新機能(予定) ストアドプロシージャのサポート③ 【参考情報】Javadoc  JCPのWebサイトにてJavadoc公開 javax.persistence Interface EntityManager javax.persistence Interface StoredProcedureQuery23 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 24. JPA2.1 新機能(予定) バルク更新 / バルク削除のサポート  CriteriaAPIでバルク(一括)更新のサポート – CriteriaBuilderにcreateCriteriaUpdate()メソッド追加 – javax.persistence.criteria.CriteriaUpdateインターフェースの追加  実装例 一緒 CriteriaUpdate<Customer> q = cb.createCriteriaUpdate(Customer.class); Root<Customer> c = q.from(Customer.class); q.set(c.get(Customer_.status), "outstanding") .where(cb.lt(c.get(Customer_.balance), 10000)); UPDATE Customer c SET c.status = outstanding WHERE c.balance < 10000  CriteriaAPIでバルク削除のサポート – CriteriaBuilderにcreateCriteriaDeleteメソッド追加 – javax.persistence.criteria.CriteriaDeleteインターフェースの追加24 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 25. JPA2.1 新機能(予定) JPQLの機能強化  ON句のサポート – ON句はJOINの結合条件を記述する SELECT s.name, COUNT(p) FROM Suppliers s LEFT JOIN s.products p ON p.status = inStock GROUP BY s.name – 連動して、Criteria APIにon() getOn() メソッドの追加25 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 26. 26 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 27. 27 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.

×