• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Beginning Java EE 6 勉強会(1) #bje_study
 

Beginning Java EE 6 勉強会(1) #bje_study

on

  • 8,269 views

 

Statistics

Views

Total Views
8,269
Views on SlideShare
6,309
Embed Views
1,960

Actions

Likes
15
Downloads
128
Comments
0

18 Embeds 1,960

http://blog.ik.am 1409
https://ocean.cybozu-dev.com 470
http://ik.am 25
http://www.techgig.com 13
https://cybozulive.com 8
http://webcache.googleusercontent.com 7
https://twimg0-a.akamaihd.net 4
http://115.112.206.131 3
https://twitter.com 3
http://www.linkedin.com 3
http://st.ik.am 3
http://tawisya.ik.am 3
https://ocean.s.cybozu-dev.com 3
https://si0.twimg.com 2
http://categol.ik.am 1
http://a0.twimg.com 1
http://categolj2.ik.am 1
http://grimrose.blogspot.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via SlideShare as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Beginning Java EE 6 勉強会(1) #bje_study Beginning Java EE 6 勉強会(1) #bje_study Presentation Transcript

    • Beginning Java EE 6 勉強会(1) -Java EE 6概要- 担当者:@making Toshiaki Maki 2012/04/18
    • はじめに - Java EE 6勉強会の進め方• 隔週水曜日に各要素技術をそれぞれ扱います – 座学+ハンズオン形式 – 資料は業務外時間に作成し、原則SlideShareにアッ プします• 概要 4/18 @making• JPA 4/25 @kjstylepp• EJB 5/9 @inatus• JSF 5/23 @XXX• JMS 6/6 @XXX• JAX-WS 6/20 @masato_ka• JAX-RS 6/27 講師募集中12/04/18 Beginning JavaEE6 勉強会(1) 2
    • 金魚本が手元にない方は• いますぐぽちりましょう• http://amzn.to/JavaEE612/04/18 Beginning JavaEE6 勉強会(1) 3
    • 目次1. Java EE 6の概要2. Javaと永続化 12/04/18 Beginning JavaEE6 勉強会(1) 4
    • 第1章 Java EE 6の概要12/04/18 Beginning JavaEE6 勉強会(1) 5
    • 本論に入る前に質問• 次のうち正しい組み合わせを全て選びなさい 1. J2SE 1.4 – J2EE 1.4 2. J2SE 1.5 – J2EE 1.5 ggrks 3. Java SE 1.5 – Java EE 5 4. Java SE 5 - Java EE 5 5. Java SE 1.6 – Java EE 6 6. Java SE 6 – Java EE 6 7. Java SE 7 – Java EE 612/04/18 Beginning JavaEE6 勉強会(1) 6
    • Java EE 6の概要• 内部アーキテクチャ• Java EE 6で新しくなった点12/04/18 Beginning JavaEE6 勉強会(1) 7
    • 1.1 Java EE とは• Java Enterprise Edition• Javaで(主に)Webアプリケーションを構築するための 数々の仕様、およびその実装です。 – Servlet、JSP、EJB、JPAとか• Java EEの仕様を満たした機能を提供するアプリケー ションサーバをJava EEアプリケーションサーバと呼ぶ。 – GlassFish(Oracle) – WebLogic Server(Oracle) – WebSphere Application Server(IBM) – JBoss Application Server (Redhat) – Cosminexus (Hitachi) – Interstage (Fujitsu) – WebOTX (NEC) – Geronimo (Apache)• 同じアプリケーションならどのサーバでもが動く(は ず、、)• Tomcatはただのサーブレットコンテナです12/04/18 Beginning JavaEE6 勉強会(1) 8
    • 1.1.1 Java EE 6の歴史 Flexible Ease of Development Java EE 6 Web Services Pruning,Pro Rubustness Enterprise files,EJB Application J2EE 1.4 Java EE 5 Lite,JAX- RS,CDI Web Annotation J2EE 1.2 J2EE 1.3 Services, s,EJB3.0,JPA Manageme ,JAX-WS,JSF Servlet,JSP, EJB CMP, nt,Deploym Web Profile EJB,JMS, JCA ent Project JPE RMI/IIOP Managed BeanMay 1998 Dec 1999 Sep 2001 Nov 2003 May 2006 Dec 200912/04/18 Beginning JavaEE6 勉強会(1) 9
    • Java EE 6の全体像 http://www.slideshare.net/takakiyo/jjuc-ccc-2010-spring より拝借12/04/18 Beginning JavaEE6 勉強会(1) 10
    • ざっくり分類• プレゼンテーション層→JSF• トランザクション層→EJB• データアクセス層→JPA• DI、コンポーネント管理→CDI• メッセージング→JMS• WEBサービス→JAX-WS、JAX-RS12/04/18 Beginning JavaEE6 勉強会(1) 11
    • 1.2 Java EE 6の新しいキーワード• さらなる開発容易性向上 – 5で大きく変わり、EJB、永続エンティティ、Web サービスがアノテーションベースに – 6ではJSFのマネージドBeanがアノテーションベース になり、XMLディスクリプタも不要に – Servlet3.0やCDI(Contexts and Dependency Injection)、Bean Validation…金魚本には載って いません• 古い技術のプルーニング• 新しい仕様の追加12/04/18 Beginning JavaEE6 勉強会(1) 12
    • 1.2.1 軽量化• プルーニング – EJB 2.X CMP エンティティBean (JSR318) • JPAへ – JAX-RPC (JSR101) • JAX-WSへ – JAXR (JSR93) – Java EE アプリケーション・デプロイ (JSR88)• プロフィル – Java EEのサブセット or スーパーセットの提供 – Webプロファイル • Servlet 3.0, JSP 2.2, EJB Lite 3.1, JPA 2.0, JSF 2.2 等12/04/18 Beginning JavaEE6 勉強会(1) 13
    • プロファイル• Java EEのサブセットをプロファイルとして定 義可能 – Java EEコンテナが特定のプロファイルだけ実装し てもよい – WAS8.5ではより軽量なLiberty Profileを提供 Java EE Full Profile Web Profile12/04/18 Beginning JavaEE6 勉強会(1) 14
    • 1.2.2 操作性の向上• JSFやServletの設定が簡単に• アノテーションの導入でXMLファイル(faces- config.xml、web.xml)への設定がかなり省略可import javax.ejb.EJB;import javax.faces.bean.ManagedBean;@ManagedBean faces-config.xmlのpublic class BookController { <managed-bean>タグ内に @EJB 記述していた情報がアノ private BookEJB bookEJB; テーションで表現可能に。 private Book book = new Book(); (CDIを使うと@Namedで private List<Book> bookList; OK) public String doCreateBook() { book = bookEJB.createBook(book); bookList = bookEJB.findBooks(); return "listBooks.xhtml"; }}12/04/18 Beginning JavaEE6 勉強会(1) 15
    • 1.2.3 豊富な機能• JAX-RSでREST対応!• JPA2.0でデータベース操作がより柔軟に• EJB3.1でSingleton Session Bean(アプリで唯一のインスタンス)import javax.persistence.EntityManager;import javax.persistence.PersistenceContext;import javax.persistence.Query;import javax.ws.rs.GET;import javax.ws.rs.Path;import javax.ws.rs.Produces;@Path("books")public class BookResource { @PersistenceContext private EntityManager em; @GET @Produces({"application/xml", "application/json"}) public List<Book> getAllBooks() { Query query = em.createNamedQuery("findAllBooks"); List<Book> books = query.getResultList(); return books; }}12/04/18 Beginning JavaEE6 勉強会(1) 16
    • 1.2.4 移植性の向上• JNDI名が標準化され、どのコンテナでも同じア プリをデプロイできるようになった – これまではベンダ毎(GlassFish、JBoss、WebLogic) が独自に設定していたため、他製品へ移行する際に JNDI名を変更する必要があった• 組み込みコンテナが標準APIで用意され、 JavaSEでEJBの単体テストが簡単に行えるよう になった – EJBContaioner container = EJBContainer.createEJBContainer(p); – Hello hello = (Hello) container.getContext().lookup(“java:global/cl asses/Hello”);• 7章で!12/04/18 Beginning JavaEE6 勉強会(1) 17
    • 第2章 Javaと永続化12/04/18 Beginning JavaEE6 勉強会(1) 18
    • Javaと永続化• データの永続化 – 通常はリレーショナルデータベースに永続化 – リレーショナルデータベースとJavaオブジェクト • 主キー・外部キー・テーブル結合などオブジェクト指向言語 とはまったく異なる表現• Javaオブジェクトの永続化の方法 – シリアライゼーションによる永続化 • java.io.Serializableインタフェース • シンプルな機構であり、クエリ言語など機能が十分でない – リレーショナルデータベースによる永続化 • Java Database Connectivity(JDBC)によるアクセス • オブジェクト・リレーショナル・マッピング(ORM) – Hibernate – TopLink – Java Data Objects(JDO) – ◎Java Persistence API(JPA)12/04/18 Beginning JavaEE6 勉強会(1) 19
    • 2.1 JPA仕様の概要• JavaEE5でJPA1.0が登場• JPAはJDBCの上位の抽象層• javax.persistenceパッケージ• コンポーネント構成 – ORM – エンティティマネージャ – Java Persistence Query Language – トランザクションとロック – コールバックとリスナ 詳しくは3-5章で!12/04/18 Beginning JavaEE6 勉強会(1) 20
    • 2.1.1 仕様の歴史• TopLink – 1990年代初期からsmalltalk用に開発 – Javaでも利用可能 – しばらく標準化されず• JDO – 市場に浸透せず• 初期EJB – EJB1.0(1998) • Entity Container Managed Persistence(CMP)という重量級コンポーネントモデル – EJB1.1 • J2EE1.2の一部にEJB2.1 • CMP強化• Hibernate – 軽量のオブジェクト指向永続性モデル – オープンソースで成功• JPA1.0 – Hibernateの多くの設計原理を導入 – EJB3.0(JSR220)の一部に – JavaEE5に• JPA2.0 – JSR317 – JavaEE6に12/04/18 Beginning JavaEE6 勉強会(1) 21
    • 2.1.2 JPA2.0の新機能• 単純データ型(String,Integerなど)のコレク ションと組み込み可能オブジェクトの個別テー ブルマッピング• Map型対応• 楽観的ロックに加え、悲観的ロックのサポート• Criteria API導入• JPQL拡張(case文など)• キャッシングAPIなど(詳しくは3-5章で!)12/04/18 Beginning JavaEE6 勉強会(1) 22
    • 2.1.3 参照実装• Eclipse Link 2.0 – Oracle社からEclipse Foundation寄贈されたOracle TopLinkを基盤として開発• その他の実装では – Hibernate – Toplink – OpenJPA – DataNucleus• 以後、永続性プロバイダまたはプロバイダと呼 ぶ12/04/18 Beginning JavaEE6 勉強会(1) 23
    • 2.2 エンティティ• オブジェクト エンティティ• オブジェクトはメモリ内にのみ存在する概念• エンティティはメモリ+データベース永続化さ れるオブジェクト• 具象型でも抽象型でもOK – 継承・リレーションシップのサポート• JPQLに問い合わせ• データベースにアクセスしていることを意識し ない12/04/18 Beginning JavaEE6 勉強会(1) 24
    • 2.2.1 オブジェクトリレーショナルマッピング• 永続化プロバイダがエンティティを認識し、 マッピングを解釈できるように次の2つの形式 で記述 – アノテーション:エンティティのコードにアノテー ション(javax.persistenceパッケージ)を記述 – XMLディスクリプタ:マッピングを外部XMLファイル に定義• Configuration by exceptionの考え方 – デフォルトのマッピング規則(クラス名とテーブル 名は同じ、プロパティ名とカラム名は同じ、等)か ら外れる場合のみ設定すれば良い。12/04/18 Beginning JavaEE6 勉強会(1) 25
    • シンプルなBookエンティティ 永続性プロバイダに認識させるため のアノテーション@Entitypublic class Book { @Id 主キーの指定 @GeneratedValue private Long id; @Column(nullable = false) カラムの属性指定 private String title; private Float price; @Column(length = 2000) private String description; private String isbn; private Integer nbOfPage; private Boolean illustrations; // 以下セッター・ゲッター略}12/04/18 Beginning JavaEE6 勉強会(1) 26
    • エンティティとテーブルのマッピング <<エンティティ>> Book Book +ID bigint nullable=false -id: Long TITLE varchar(255) nullable=false -title: String PRICE double nullable=true -price: Float DESCRIPTION varchar(2000) nullable=true -description: String ISBN varchar(255) nullable=true -isbn: String NBOFPAGE integer nullable=true -nbOfPage: Integer ILLUSTRATIONS smallint nullable=true -illustrations: Boolean12/04/18 Beginning JavaEE6 勉強会(1) 27
    • 2.2.2 エンティティのクエリ• エンティティを操作するAPIが用意されている• エンティティマネージャが中心に• CRUD操作やJPQLによる複雑なクエリEntityManagerFactory emf = Persistence .createEntityManagerFactory("chapter02PU");EntityManager em = emf.createEntityManager();em.persist(book);• INSERT文やSELECT文を明示的に記述しなくても SQLが発行される12/04/18 Beginning JavaEE6 勉強会(1) 28
    • エンティティマネージャによる操作 <<インタフェース>> Main EntityManager DB +persist(entity: Object): void +find(entityClass: Class<T>, primaryKey: Object): <T> Book -id: Long -title: String -price: Float -description: String -isbn: String -nbOfPage: Integer -illustrations: Boolean12/04/18 Beginning JavaEE6 勉強会(1) 29
    • JPQL• エンティティに対するクエリ言語• SQLに似ているが少し異なる“SELECT b FROM Book b WHERE b.title = „HOGE‟"• 動的クエリ(実行時に生成)、静的クエリ(コンパイル時 に決定)、ネイティブクエリ(SQL)• 静的クエリは名前付きで設定できる@Entity@NamedQuery(name = "findAllBooks", query = "SELECT b FROM Book b")public class Book {• createNamedQueryでクエリ取得Query query = em.createNamedQuery(”findAllBooks");12/04/18 Beginning JavaEE6 勉強会(1) 30
    • 2.2.3 コールバックとリスナ• エンティティはPOJO – newした段階ではメモリ内に存在するだけで、エン ティティマネージャに認識されない – EntityManager#persistでエンティティを管理対象 にし永続化する – エンティティマネージャがエンティティを管理する 場合は、エンティティに永続IDを設定してデータ ベースと同期する – エンティティマネージャから分離され、管理外に なった場合は普通のJavaオブジェクト – EntityManager#removeを実行するとデータベースか ら削除され、管理対象外になるが、GCが発生するま でメモリ内に残る12/04/18 Beginning JavaEE6 勉強会(1) 31
    • エンティティのライフサイクル new GC メモリ内に存 find 在 JPQL persist merge remove 分離状態 管理状態 削除済み状態 clear detach refresh setter データベース12/04/18 Beginning JavaEE6 勉強会(1) 32
    • コールバックとリスナ• エンティティで特定のライフサイクルイベント が発生したときの処理(コールバック)を定義で きる• エンティティクラスに直接コールバックを記述 できるし、リスナクラスに外出しすることも可 能(@EntityListeners)• 5章で!12/04/18 Beginning JavaEE6 勉強会(1) 33
    • コールバックアノテーション new GC メモリ内に存 在 @PostLoad @PreLoad @PostLoad @PostLoad @PreRemove 分離状態 管理状態 削除済み状態 @PreUpdate @PostUpdate @PreUpdate @PostUpdate @PostLoad データベース12/04/18 Beginning JavaEE6 勉強会(1) 34
    • ハンズオン演習12/04/18 Beginning JavaEE6 勉強会(1) 35
    • ハンズオン演習• NetBeansとDerbyを使用してJPAアプリケーショ ンを作成 – http://ja.netbeans.org/ – 実行されたSQLが分かりやすいようにSQLログが出力 されるように設定されています • 参考 http://bit.ly/log4jdbc• ハンズオンプロジェクト – https://www.dropbox.com/sh/1axggidrrjz3rnb/OiM plS6LJW/beginning-javaee612/04/18 Beginning JavaEE6 勉強会(1) 36
    • プロジェクトを開く12/04/18 Beginning JavaEE6 勉強会(1) 37
    • 練習1) エンティティクラスの作成@Entity@NamedQuery(name = "findAllBooks", query = "SELECT b FROM Book b")public class Book { @Id @GeneratedValue private Long id; @Column(nullable = false) private String title; private Float price; @Column(length = 2000) private String description; private String isbn; private Integer nbOfPage; private Boolean illustrations; // 以下セッター・ゲッター略}12/04/18 Beginning JavaEE6 勉強会(1) 38
    • 練習2) エンティティの生成Book book = new Book();book.setTitle("The Hitchhikers Guide to the Galaxy");book.setPrice(12.5F);book.setDescription("Science fiction comedy series created by DouglasAdams.");book.setIsbn("1-84023-742-2");book.setNbOfPage(354);book.setIllustrations(false);12/04/18 Beginning JavaEE6 勉強会(1) 39
    • 練習3) エンティティの永続化EntityManagerFactory emf =Persistence.createEntityManagerFactory("chapter02PU");EntityManager em = emf.createEntityManager();12/04/18 Beginning JavaEE6 勉強会(1) 40
    • 練習4) エンティティの永続化• persistメソッドで永続化しますEntityTransaction tx = em.getTransaction();tx.begin();em.persist(book);tx.commit();em.close();emf.close();12/04/18 Beginning JavaEE6 勉強会(1) 41
    • mainメソッドを実行する前に• Derbyを起動する(接続情報は src/resources/META-INF/persistence.xml)• 「ウィンドウ」→「サービス」→「データベー ス」→「Java DB」→「データベースを作成」12/04/18 Beginning JavaEE6 勉強会(1) 42
    • 実行• mainクラスで右クリック→「ファイルを実行」• 「java.sql.SQLException: Table/View ‘SEQUENCE’ は、既に Schema ‘APP’ に存 在します。」なエラーログは無視12/04/18 Beginning JavaEE6 勉強会(1) 43
    • 演習• 演習1) 練習で永続化したオブジェクトを更新してくだ さい。• 演習2)演習1)で更新する前にflush()する場合、しない 場合とどう違うでしょうか。• 演習3) 演習1)のエンティティを削除してください。 (削除前にflushしてください• 演習4) エンティティを100個登録してください。SQLは どのタイミング発行されましたか。(persistの後に printlnを入れてみてください)• 演習5) “findAllBooks”のNamedQueryを実行し、結果 をListで取得してください。• 演習6) 管理済みエンティティを主キー(ID=1など)で一 件のみ取得してください。ただし登録後にはflush()し てください。• 演習7) 演習6)でflush後にclear()する場合、しない場 合と比べてどう違うでしょうか。12/04/18 Beginning JavaEE6 勉強会(1) 44