JPA & Kuina-Dao入門

Similar documents
S2DaoでもN:Nできます

Dolteng Scaffoldに対する機能追加とマスタ-ディテールScaffoldの紹介

早分かりS2Dao

Microsoft PowerPoint - Seasar2.5.ppt

Seasar.NET入門


S2Dao入門

第 2 章 問合せの基本操作 この章では データベースから情報を検索する際に使用する SELECT コマンド および SELECT コマンドと 同時に使用する句について説明します 1. 問合せとは 2. 基本的な問合せ 3. 列の別名 4. 重複行を一意にする 5. 検索行の絞込み 6. 文字パター

第 5 章 結合 結合のパフォーマンスに影響を与える結合の種類と 表の結合順序について内部動作を交えて 説明します 1. 結合処理のチューニング概要 2. 結合の種類 3. 結合順序 4. 結合処理のチューニングポイント 5. 結合関連のヒント

スライド 1

1 ex01.sql ex01.sql ; user_id from (select user_id ;) user_id * select select (3+4)*7, SIN(PI()/2) ; (1) select < > from < > ; :, * user_id user_name

基本情報STEP UP演習Java対策

PowerPoint Presentation

データベースアクセス

n n n ( ) n Oracle 16 PostgreSQL 3 MySQL

intra-mart Accel Platform — IM-Repository拡張プログラミングガイド   初版  

1.SqlCtl クラスリファレンス SqlCtl クラスのリファレンスを以下に示します メソッドの実行中にエラーが発生した場合は標準エラー出力にメッセージを出力します (1)Connect() メソッド データベースへ connect 要求を行います boolean Connect(String

PowerPoint プレゼンテーション

Oracle Application Expressの機能の最大活用-インタラクティブ・レポート

TopLink È... 3 TopLink...5 TopLink åø... 6 TopLink å Workbench O/R ~... 8 Workbench À ~... 8 Foundation Library å... 8 TopL

PowerPoint プレゼンテーション

Oracle SQL Developer Data Modeler

intra-mart im-JavaEE Framework

プレポスト【問題】

クエリの作成が楽になるUDF

実践的なサンプルアプリをその場でコーディングします!

How to Use the PowerPoint Template

今さら聞けない!? Oracle入門 ~前編~

KeyWeb Creator 概要 What s KeyWeb Creator? 動的なホームページを作成するためのツール!! 従来の Web ページ DB を利用した Web ページ <HTML> <HEAD> <TITLE>show_book</TITLE> </HEAD> <BODY> <DI

ゆみる は こうげきりょく が 2 あがった!

はじめに コースの概要と目的 Oracle をより効率的に使用するための SQL のチューニング方法について説明します また 索引の有無 SQL の 記述方法がパフォーマンスにどのように影響するのかを実習を通して理解します 受講対象者 アプリケーション開発者 / データベース管理者の方 前提条件 S

Microsoft Word - Lab6.doc

(Microsoft PowerPoint - ClickFramework.ppt [\214\335\212\267\203\202\201[\203h])

メール全文検索アプリケーション Sylph-Searcher のご紹介 SRA OSS, Inc. 日本支社技術部チーフエンジニア Sylpheed 開発者 山本博之 Copyright 2007 SRA OSS, Inc. Japan All right

Brekeke PBX - Version 2.1 ARSプラグイン開発ガイド

第 1 章 条件分岐 この章では 条件に応じて処理を分岐する方法について説明します 1. CASE 式で複雑な条件分岐を実現 2. 関数を使用した条件分岐 3. MERGE 文による条件に応じた DML の実行

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

Microsoft PowerPoint - 第5章補足-DB2組み込みSQL.ppt

rcp-add-01:アーキテクチャ設計書

// JDBC // CallableStatement cs = null; try { cs = conn.preparecall("{call DUMMY_PROC(?,?)}"); cs.setstring(1, "This is a test"); cs.registeroutparame

Webシステム授業資料

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版   None

WebOTXマニュアル

内容 Visual Studio サーバーエクスプローラで学ぶ SQL とデータベース操作... 1 サーバーエクスプローラ... 4 データ接続... 4 データベース操作のサブメニューコンテキスト... 5 データベースのプロパティ... 6 SQL Server... 6 Microsoft

MySQL Connector/J における SQL インジェクションの脆弱性

JUnit 概要 2015/4/16 版今泉俊幸 2015 bbreak Systems 1

Java知識テスト問題

Microsoft認定資格問題集(70-483_demo)

解答上の注意 1 解答は 解答 紙の問題番号に対応した解答欄にマークしなさい 2 選択肢は 問ごとに 意されています 問 1の選択肢は 問 2で使 しません 3 選択肢は量が多いため 探しやすさの観点よりグループ分けされています グループ分けに合わせて解答欄が区切られていますが 横 1 列で問題 1

橡実践Oracle Objects for OLE

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版  

プログラミング基礎I(再)

2

文字列操作と正規表現

SQL 基礎 (6) JOIN 句 - データの結合 作成日 : 2016/02/22 作成者 : 西村 更新履歴 更新日 更新概要 作業者 2016/02/22 新規作成 西村 はじめに この資料では 下記のような JOIN によるテーブル ( データ ) の結合について簡単に説明します INNE

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

OC4J-TWP-EJB3-MIGRATION-1013

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

データアダプタ概要

SpringSecurity

10th Developer Camp - B5

Microsoft Word - Android_SQLite講座_画面800×1280

Exam : J Title : Querying Microsoft SQL Server 2012 Version : DEMO 1 / 10

Transcription:

2007 Autumn JPA & Kuina-Dao 入門 2007.11.11 The Seasar Project 中村年宏 (taedium) 1

自己紹介 中村年宏 ブログ http://d.hatena.ne.jp/taedium/ hatena ne メールアドレス toshihiro.nakamura@gmail.com コミッタとして関わっているプロダクト S2Container S2Dao S2Hibernate Kuina-Dao など 執筆活動 記事 :EJB3.00 入門講座 http://itpro.nikkeibp.co.jp/article/column/20060615/241006/?st=develop 書籍 :JPA 入門 ( 絶賛執筆中 ) 来年初頭発売? 2

アジェンダ JPA とは? JPA の効率的な学習方法 Kuina-Dao とは? Q&A 3

アジェンダ JPA とは? JPA の効率的な学習方法 Kuina-Dao とは? 4

JPA とは? Java Persistence API Java の永続化と O/R マッピングの標準 API 要するにデータベースアクセスの API JavaEE 環境でも JavaSE 環境でも使用できる ただし JavaSE5 以上が必須 EJB3.0 とは別もの JPA はあくまで仕様 5

代表的な JPA 実装プロダクト Hibernate Red Hat 社が提供のOSS いわずと知れたO/Rマッピングフレームワークの代名詞 TopLink Essentials The GlassFish community が提供の OSS Oracle 社の TopLinkがベースになっている Apache OpenJPA The Apache Software Foundationが提供のOSS BEA 社の Kodo がベースになっている 6

JPAは JDBC とどう違う? O/R マッピングの自動化 SQL の方言の吸収 ページングの SQL など キャッシュ機能 7

JPAは JDBC とどう違う? 部署テーブルを使って比較してみるブルを使って比較してみる PK DEPT( 部署 ) ID DEPT_NO DEPT_NAME LOC VERSION_NO ( 部署番号 ) ( 部署名 ) ( 所在地 ) ( バージョン番号 ) 1 10 ACCOUNTING NEW YORK 0 2 20 RESERCH DALLAS 0 3 30 SALES CHICAGO 0 4 40 OPERATIONS BOSTON 0 8

通常の JavaBeans JDBC の場合 public class Dept { private Long id; private Integer deptno; private String deptname; private String loc; private Integer versionno; public Long getid(){...} public void setid(long id){...}... } O/R マッピング Java クラスのちがい エンティティクラス JPA の場合 @Entity public class Dept { @Id @GeneratedValue private Long id; @Column(name = "DEPT_NO") private Integer deptno; @Column(name = "DEPT_NAME") private String deptname; private String loc; @Version @Column(name = "VERSION_NO") private Integer versionno; public Long getid(){...} public void setid(long id){...} アノテーションを... 指定する } 9

JDBC の場合 O/R マッピング主キーで取得するケース public Dept getdept(long id) throws SQLException { String sql = "select ID, DEPT_NO, DEPT_NAME, LOC, VERSION_NO from DEPT where ID =?"; Connection con = datasource.getconnection(); PreparedStatement ps = con.preparestatement(sql); ps.setlong(1, id); ResultSet rs = ps.executequery(); if (rs.next()) { Dept dept = new Dept(); } dept.setid(rs.getlong(1)); g( dept.setdeptno(rs.getint(2)); dept.setdeptname(rs.getstring(3)); dept.setloc(rs.getstring(4)); dept.setversionno(rs.getint(5)); return dept; コード上でマッピングを行う リソースの開放処理は省略しています return null; } 10

O/R マッピング主キーで取得するケース JPA の場合 public Dept getdept(long g id) { return entitymanager.find(dept.class, id); } すでにアノテーションでマッピングが行われているためコードが簡潔で済む 11

O/R マッピング新規追加するケース JDBC の場合 public void insert(dept dept) throws SQLException { String sql = "insert into DEPT (ID, DEPT_NO, DEPT_NAME, LOC, VERSION_NO) " + " values (?,?,?,?,?)"; Connection con = datasource.getconnection(); PreparedStatement ps = con.preparestatement(sql); ps.setlong(1, dept.getid()); ps.setint(2, dept.getdeptno()); ps.setstring(3, dept.getdeptname()); ps.setstring(4, dept.getloc()); ps.setint(5, dept.getversionno()); ps.executeupdate(); } コード上でマッピングを行う リソースの開放処理は省略しています 12

O/R マッピング新規追加するケース JPA の場合 public void insert(dept dept) { entitymanager.persist(dept); i t(d t) } すでにアノテーションでマッピングが行われているためコードが簡潔で済む 13

ページング RDBMS ごとに SQL を別のものにする必要がある JDBC で Oracle を使う場合 select * from ( select temp_.*, rownum rownum_ from ( select T.dept_id, T.dept_no, T.dept_name, T.loc, T.version FROM DEPT T order by T.dept_name ) temp_ where rownum <=? ) where rownum_ >? JDBC で H2 を使う場合 select T.dept_id, T.dept_no, T.dept_name, T.loc, T.version FROM DEPT T order by T.dept_name limit? offset? 14

ページング どの RDBMS であっても同じ呼び出し方で OK JPA の場合 public List<Dept> getdeptlist(int offset, int limit) { return entitymanager.createquery("select ect d from Dept d order by d.deptname") e.setfirstresult(offset).setmaxresults(limit).getresultlist(); } 15

キャッシュ機能 JDBC の場合 キャッシュの機能はない JPA の場合 entitymanager.find(dept.class, 1L); entitymanager.find(dept.class, 1L); entitymanager.find(dept.class, 1L); 実際のデータベースアクセスは最初の一回だけ 16

JDBCと JPA の関係 JPAはアプリケーションにとって JDBC よりも使いやすい API JPAプロバイダ (HibernateやOpenJPA) は内部的にJDBCを使って RDBMSにアクセスする アプリ JPA JPA JDBC JDBC RDBMS プロバイダ ドライバ 17

アジェンダ JPA とは? JPA の効率的な学習方法 Kuina-Dao とは? 18

学習のポイント 多くの機能に惑わされない よく使うのは一握り 最初に代表的なアノテーションを覚えてしまうのがいい 実際に動かしてみる 環境を準備するのに時間がかかると嫌になってしまう 便利な開発環境を利用するのがいい 19

最初はこれだけ覚えれば大丈夫! JPA のアノテーション @Entity @Table @Colum @Id @GeneratedValue @Entity @Table(name= DEPT ) public class Department { @Id @GeneratedValue private Long id; @Column(name = "DEPT_NO") private Integer deptno; @Column(name = "DEPT_NAME") private String deptname; private String loc; @Version @Column(name = "VERSION_NO") private Integer versionno; } 20

次はこれだけ覚えれば大丈夫!! JPA のアノテーション @OneToMany @ManyToOne @Entity @Entity public class Dept { public class Emp { @Id @Id @GeneratedValue @GeneratedValue private Long id; private Long id; @OneToMany(mappedBy = "dept") @ManyToOne(fetch = FetchType.LAZY) private Set<Emp> emps = new HashSet<Emp>(); } private Dept dept; } @ManyToManyや@OneToOneというアノテーションもあるが ちゃんと理解できるまでは使わないほうが安全 必ず LAZY を指定 21

META-INF の直下に必須 次のことを設定できる 永続プロバイダ データソース トランザクションのタイプ 接続先のRDBMSの種類 存在は確認しておきたい JPAの設定ファイル persitence.xml 22

JPA を試すのにお奨めの開発環境 Hibernate エンティティクラスからテーブルを自動生成できる Seasar2 テストツール (S2UnitまたはS2JUnit4) が便利 トランザクションやデータソースなどHibernateとの連携をサポート エンティティクラスの自動検出ができる Dolteng( どぅるてん ) Seasar2 + Hibernateに必要なファイル群を自動生成できる エンティティクラスを自動生成できる H2のサンプルデータをもつ 23

デモ デモ 1 開発環境の作成 (Dolteng 0.23.0 を使用します ) デモ 2 テーブルからエンティティクラスを作って動かす デモ 3 エンティティクラスからテーブルを作って動かす デモ 4 関連を作成する 24

JPA を使いこなすためのポイント 複合主キーは使わない 主キーはサロゲートキー 1 つとする エンティティクラスとテーブルは 1:1 とする ちゃんと理解するまでは継承や組み込みオブジェクトは使わない すべてを JPA で解決しようとしない 必要ならば SQL も使用する エンティティにロジックをもたせない 真のオブジェクト指向とかを求めない FetchType.LAZY と Fetch Join を効果的に利用する 必要なデータにだけアクセスする 25

アジェンダ JPA とは? JPA の効率的な学習方法 Kuina-Dao とは? 26

Kuina-Dao とは? JPA 上で利用可能な Daoフレームワーク http://kuina.seasar.org/ja/ Dao インタフェースさえ定義すれば実装がいらない 複数の JPA 実装に対応 Hibernate TopLink Essentials OpenJPA メソッドの引数名を実行時に利用する JPAの使いづらいところを解決! 動的なクエリの自動生成 SQLのDTOへのマッピング 27

Dao インタフェースのみで動作 エンティティクラスDept に対するDao public interface DeptDao { /** 全件取得 */ public List<Dept> findall(); /** IDで取得 */ public Dept find(long id); /** 追加 */ public void persist(dept dept); /** 削除 */ public void remove(dept dept); } 28

メソッドの引数名を実行時に利用 Diigu を利用 Java クラスまたはインタフェースのメソッドが持つ引数の名前を実行時に利用可能にするためのプロダクト public interface DeptDao { } public List<Dept> finddeptbydeptname(string deptname); DiiguによりKuina-DaoはdeptNameをwhere 句に含めるべきと判断できる そして 下記の JPAコード相当の処理を実行する public List<Dept> finddeptbydeptname(string deptname) { } return entitymanager.createquery("select d from Dept d where d.deptname = :deptname").setparameter("deptname", deptname).getresultlist(); 29

動的なクエリの自動生成 エンティティのプロパティを条件とする検索ティを条件とする検索 (QueryByExample) Daoを利用するコード検索条件をセットしてDao Dept example = new Dept(); のメソッドに渡すだけ example.setdeptno(10); tn List<Dept> list = dao.findbyexample(example); SELECT dept FROM Dept AS dept WHERE (dept.deptno deptno = :deptno) 自動生成されるクエリ Daoを利用するコード Dept example = new Dept(); example.setdeptno(10); example.setdeptname("hoge"); List<Dept> list = dao.findbyexample(example); SELECT dept FROM Dept AS dept WHERE ((dept.deptno = :deptno) AND (dept.deptname d tn = :deptname)) 30

SQLの DTO へのマッピング SQL による検索 (QueryBySql) hoge.foo.deptdao public List<DeptDto> findbydeptname(string deptname); SQLファイルをDaoと同じパッケージに Dao 名 _ メソッド名.sql の形式で用意 SQLコメントを利用してメソッドの引数をバインドできる hoge.foo.deptdao_findbydeptname.sql select id, dept_name from dept where dept_name = /*deptname*/ SALES テスト用の文字列 Daoを利用するコード List<DeptDto> list = dao.findbydeptname("accounting"); 31

Q&A 32

おわり ありがとうございました 33