kuina -dao 入門kuina.seasar.org/ja/sc2007spring_aa1_kuina.pdftitle microsoft powerpoint -...

60
Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved. 1 Seasar Conference Seasar Conference Seasar Conference Seasar Conference Seasar Conference Seasar Conference Seasar Conference Seasar Conference 2007 Spring 2007 Spring 2007 Spring 2007 Spring 2007 Spring 2007 Spring 2007 Spring 2007 Spring Seasar Conference Seasar Conference Seasar Conference Seasar Conference Seasar Conference Seasar Conference Seasar Conference Seasar Conference 2007 2007 2007 2007 2007 2007 2007 2007 Spring Spring Spring Spring Spring Spring Spring Spring Kuina Kuina - - Dao Dao 入門 入門 入門 入門 入門 入門 入門 入門 2007.05.27 中村年宏

Upload: lehuong

Post on 02-Apr-2018

212 views

Category:

Documents


0 download

TRANSCRIPT

Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.1

Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring

Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 2007 2007 2007 2007 2007 2007 2007 SpringSpringSpringSpringSpringSpringSpringSpring

KuinaKuina--DaoDao入門入門入門入門入門入門入門入門

2007.05.27

中村年宏

2Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

自己紹介自己紹介

• 名前:中村年宏– ブログ:http://d.hatena.ne.jp/taedium/

• コミッタとして参加しているプロジェクト– S2Container

– Kuina-Dao

– S2Hibernate

– S2TopLink (sandboxプロジェクト)

– S2OpenJPA (sandboxプロジェクト)

– S2Cayenne (sandboxプロジェクト)

3Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

アジェンダアジェンダ

• Kuina-DaoとJPA

• Kuina-DaoとS2Dao

• Kuina-Daoの使いどころ

• Kuina-Daoの使いどころ アドバンスド

• ロードマップ

4Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

KuinaKuina--DaoDaoととととととととJPAJPA

KuinaKuina--DaoDaoととJPAJPA

5Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

JPAJPAとはとは

• Javaの標準O/Rマッピング仕様– Java Persistence API– Java SE環境で利用可能

• 代表的なJPA実装プロダクト– Hibernate– TopLink Essentials

• 特徴– Java SE 5.0が必須– アノテーションによるマッピング– 永続コンテキスト– 標準

• ツールのサポートを受けやすい• 情報量が豊富• 導入の障壁が低い

6Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

KuinaKuina--DaoDaoとはとは

• Java Persistence API(JPA)を使いやすくするためのDAOフ

レームワーク– 「くいなだお」

– http://kuina.seasar.org/ja/index.html

– 現在のバージョンは1.0

• JPAの実装であるHibernateやTopLink Essentialsと組み合わ

せて使う– 今後はOpenJPAやCayenneとの連携もサポート予定

– Kuina-Coreは現在構想中

• メリット– コードの削減

7Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

コード例コード例

public class EmpDao {

@PersistenceContext

private EntityManager em;

public Emp findByEmpNo(Integer empNo) {return (Emp)em.createQuery(“SELECT e FROM Emp e WHERE e.empNo >= :empNo”

ORDER BY empNo).setParameter(" empNo ", empNo).getSingleResult();

}}

public interface EmpDao {@Orderby(“empNo”)Emp findByEmpNo(Integer empNo_GE);

}

Kuina-Daoを利用する場合

Kuina-Daoを利用しない場合(JPAを直接利用する場合)

8Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

コード例コード例

public class EmpDao {

@PersistenceContext

private EntityManager em;

public List<Emp> findByEmpNo(Integer empNo) {return (Emp)em.createQuery(“SELECT e FROM Emp e WHERE e.empNo >= :empNo”

ORDER BY empNo).setParameter(" empNo ", empNo).getResultList();

}}

public interface EmpDao {@Orderby(“empNo”)List<Emp> findByEmpNo(Integer empNo_GE);

}

Kuina-Daoを利用する場合

Kuina-Daoを利用しない場合(JPAを直接利用する場合)

9Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

KuinaKuina--DaoDaoの特徴の特徴

1. 必要最小限のJavaコード

– インターフェースだけが必要で実装クラスは不要

• 抽象クラスを用意すれば独自ロジックを書ける

– メソッド名やパラメータ名の命名規約を利用

– 必要に応じてアノテーションを使用可

2. 問い合わせを簡略化– JPQLの自動生成

• 動的な問い合わせに対応

– SQLの動的な問い合わせに対応

3. パラメータ名をKuina-Daoで利用するためにDiiguを使用– DiiguはAnt、Maven、Eclipse pluginで利用可能

10Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

KuinaKuina--DaoDaoの位置づけの位置づけ

S2Hibernate-JPA

Kuina-Dao

S2TopLink-JPA

S2OpenJPA(開発中)

S2Caynenn-JPA

(開発中)Kuina-Core(構想中)

HibernateTopLink

EssentialsOpneJPA Cayenne

(Seasarプロジェクト外のプロダクト)

11Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

KuinaKuina--DaoDaoの仕組みの仕組み –– 簡略版簡略版

JPA実装

Kuina-Dao

DBアプリ

インターフェース

JDBC

エンティティの取得・更新

DTOの取得

インターセプト

12Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

KuinaKuina--DaoDaoの仕組みの仕組み –– 詳細版詳細版

JPA実装

Kuina-Dao

DBアプリ

インターフェース抽象クラス

JDBC

エンティティの取得・更新

DTOの取得

インターセプト

.sql

永続コンテキスト

13Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

デモデモ

• Kuina-Daoを使った問い合わせ

– 引数を条件とする検索

– エンティティのプロパティを条件とする検索

– DTOのプロパティを条件とする検索

– JPQLによる検索

– SQLによる検索

– Criteriaによる検索

14Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

デモデモ -- エンティティクラスの構成エンティティクラスの構成

• エンティティクラスの構成

Emp Dept

id : IntegerempNo : IntegerempName : StringhireDate : Datesal : BigDecimaldept : Deptmgr : EmpversionNo : Integer

id : IntegerdeptNo : IntegerdeptName :Stringloc : Stringemps : SetversionNo : Integer

従業員エンティティ 部署エンティティ

1*

0..1

15Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

デモデモ -- 引数を条件とする検索引数を条件とする検索

@Orderby("id")public List<Emp> findBySal(BigDecimal sal_GE);

@Orderby("id")public List<Emp> findBySalDeptName(BigDecimal sal_GE, String dept$deptName);

@Orderby("id")public List<Emp> findByEmpNoArray(Integer[] empNo_IN);

1.引数名は検索対象のプロパティ名 + 検索条件を表すサフィックスとする。

2.関連先のエンティティのプロパティを検索条件に含めることもできる。

3.INを使った検索条件。

SELECT emp FROM Emp AS emp WHERE (emp.sal >= :sal_GE) ORDER BY emp.id

SELECT emp FROM Emp AS emp INNER JOIN emp.dept AS dept WHERE ((emp.sal >= :sal_GE) AND (dept.deptName = :dept$deptName)) ORDER BY emp.id

SELECT emp FROM Emp AS emp WHERE emp.empNo IN (:empNo_IN0, :empNo_IN1, :empNo_IN2, :empNo_IN3, :empNo_IN4) ORDER BY emp.id

実行されるJPQL

実行されるJPQL

実行されるJPQL

16Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

デモデモ -- エンティティのプロパティを条件とする検索エンティティのプロパティを条件とする検索

@Orderby("id")public List<Emp> findByExample(Emp emp);

引数には検索条件を設定したエンティティを受ける。

Emp emp = new Emp();emp.setEmpNo(empNo);emp.setEmpName(empName);emp.setHiredate(hiredate);emp.setSal(sal);

Emp mgr = new Emp();mgr.setEmpName(mgrName);emp.setMgr(mgr);

Dept dept = new Dept();dept.setDeptName(deptName);emp.setDept(dept);

empDao.findByExample(Emp emp);

SELECT emp FROM Emp AS emp INNER JOIN emp.dept AS dept WHERE ((emp.empName= :empName) AND (emp.sal = :sal) AND (dept.deptName = :dept$deptName)) ORDER BY emp.id

使用例

実行されるJPQL

17Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

EmpConditionDto dto = new EmpConditionDto();dto.setEmpName_STARTS(empName);dto.setSal_GE(sal);dto.setDept$deptName_CONTAINS(deptName);

empDao.findByDto(EmpConditionDto dto);

デモデモ -- DTODTOのプロパティを条件とする検索のプロパティを条件とする検索

@Orderby("id")public List<Emp> findByDto(EmpConditionDto dto);

引数には検索条件を設定したDTOを受ける。

public class EmpConditionDto { private String empName_STARTS;private BigDecimal sal_GE;private String dept$deptName_CONTAINS;// getter, setter

}

DTOを定義。

プロパティ名はエンティティのプロパティ名 + 検索条件

を表すサフィックスとする。

SELECT emp FROM Emp AS emp INNER JOIN emp.dept AS dept WHERE ((dept.deptName LIKE :dept$deptName_CONTAINS) AND (emp.empName LIKE :empName_STARTS) AND (emp.sal >= :sal_GE)) ORDER BY emp.id

使用例

実行されるJPQL

18Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

デモデモ -- JPQLJPQLによる検索による検索

public List<Emp> findByEmpName(String empName);

<named-query name="EmpDao.findByEmpName"><query>

SELECT e FROM Emp e INNER JOIN e.mgr m WHERE e.empName = :empNameORm.empName = :empName

ORDER BY e.id</query></named-query>

EmpOrm.xmlに名

前つきクエリを定義しておく

名前つきクエリを呼び出す。

19Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

デモデモ -- SQLSQLによる検索による検索

public List<SalSumDto> getSalSum();

外部ファイルに定義したSQLをDTOにマッピングする。

SELECT d.DEPT_NAME deptName, SUM(e.SAL) sal

FROM Dept d INNER JOIN Emp e ON d.ID = e.DEPT_ID

GROUP BYd.DEPT_NAME

ORDER BYd.ID

EmpDao_getSal

Sum.sqlにSQLを

定義しておく

public class SalSumDto {private String deptName;private BigDecimal sal;

}DTOを定義。

20Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

デモデモ -- CriteriaCriteriaによる検索による検索

import static org.seasar.kuina.dao.criteria.CriteriaOperations.*;

public abstract class Emp2DaoImpl implements Emp2Dao {

@PersistenceContextprivate EntityManager em;

public List<Emp> findBySal(BigDecimal from, BigDecimal to) {return select().from(Emp.class,"e").where(between("e.sal",from,to)).orderby("e.id").getResultList(em);

}}

public List<Emp> findBySal(BigDecimal from, BigDecimal to);

外部ファイルに定義したSQLをDTOにマッピングする。

Javaクラスでクエ

リを組み立てる

SELECT e FROM Emp AS e WHERE (e.sal BETWEEN 1000 AND 2000) ORDER BY e.id

実行されるJPQL

21Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

KuinaKuina--DaoDaoととJPA JPA –– まとめまとめ

3

2

1

△○DTOの取得

×○動的な問い合わせ

△○静的な問い合わせ

JPA実装を直接利用Kuina-Dao + JPA実装

JPA実装実装実装実装をををを直接利用直接利用直接利用直接利用するよりもするよりもするよりもするよりもKuina-Daoとととと組組組組みみみみ合合合合わせてわせてわせてわせて使用使用使用使用したしたしたした方方方方がががが便利便利便利便利!!!!でも、そもそもJPAって実際に有用なの?

22Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

KuinaKuina--DaoDaoととととととととS2DaoS2Dao

KuinaKuina--DaoDaoととS2DaoS2Dao

23Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

KuinaKuina--DaoDaoの仕組みの仕組み

JPA実装

Kuina-Dao

DBアプリ

インターフェース抽象クラス

JDBC

エンティティの取得・更新

DTOの取得

永続コンテキスト

.sql

インターセプト

24Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

S2S2DaoDaoの仕組みの仕組み

S2-Dao DBアプリ

インターフェース抽象クラス

JDBC

DTOの取得・更新

インターセプト

.sql

25Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

KuinaKuina--DaoDaoととS2DaoS2Daoの関係の関係

• ともにDaoフレームワーク– Kuina-DaoはJPAベース

• 問い合わせはJPQLもしくはSQL

• マッピングはJPAの標準仕様

• 問い合わせの実行やマッピングはJPA実装が行う

– S2DaoはJDBCベース• 問い合わせはSQL

• マッピングはS2Daoの独自仕様

• 問い合わせの実行もマッピングもS2Daoが行う

• アーキテクチャ上、S2Daoに対応するのはKuina-Dao単体ではなく、Kuina-Dao + JPA実装

• Kuina-DaoはS2Daoの後継ではない

26Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

((KuinaKuina--Dao + Dao + JPAJPA実装実装) VS. S2Dao) VS. S2Dao

• プロジェクトへ適用する場合に、どちらがより適しているかの観点で比較

27Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較比較 1 1 –– 人気(人気(ダウンロード数ダウンロード数))

0

100

200

300

400

500

600

700

800

900

1000

2006/12

2007/1

2007/2

2007/3

2007/4

2007/5

Kuina-Dao

S2Dao

ここでのダウンロード数とは配布zipファイ

ルに対するアクセス数です。

Maven2やDoltengに

よる利用数は含めていません。

5月13日時点のデータ

28Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較結果比較結果 1 1 –– 人気(人気(ダウンロード数ダウンロード数))

6

8

2

○○○○××××人気人気人気人気

((((ダウンロードダウンロードダウンロードダウンロード数数数数))))

1

7

5

4

3

S2DaoKuina-Dao + JPA実装

29Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較比較 22 –– 学習コスト学習コスト

• S2Daoの学習コストは低い– SQLの知識

– SQLコメント

– メソッドの命名規則

– アノテーション

• Kuina-DAO自体の学習コストは並だが…

– JPAの知識

• 永続コンテキストとエンティティのライフサイクル

– SQLの知識

– SQLコメント

– アノテーション

– メソッドの命名規則

– パラメーターの命名規約

30Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較結果比較結果 22 –– 学習コスト学習コスト

6

8

○○○○××××学習学習学習学習コストコストコストコスト2

○×人気(ダウンロード数)1

7

5

4

3

S2DaoKuina-Dao + JPA実装

31Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較比較 33 –– SQLSQLの利用の利用

• SQLは既存の資産– 実際のSQL

– SQLの知識

– SQLを中心とした開発に対する経験

• S2Daoの場合– SQLをフル活用できる

• SQLを外部ファイルに記述しDTOにマッピングするだけ

• Kuina-Daoの場合– SQLをサポートするが、主役はJPAでのデータアクセス

– 一部の複雑なアクセスはJPAを経由しないでSQLで行うのがよい

• S2Daoと同様外部ファイルに記述したSQLをDTOにマッピングできる

32Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較結果比較結果 33 –– SQLSQLの利用の利用

6

8

○×学習コスト2

○×人気(ダウンロード数)1

7

5

4

3 ○○○○△△△△SQLのののの利用利用利用利用

S2DaoKuina-Dao + JPA実装

33Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較比較 4 4 –– チューニングチューニング

• JPAを使う/使わないでチューニングの対象は異なる

• S2Daoの場合– SQL

• JPAの場合– マッピング

– フェッチ

– 永続コンテキスト

34Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較結果比較結果 4 4 –– チューニングチューニング

6

8

○×学習コスト2

○×人気(ダウンロード数)1

7

5

4

3

○○○○△△△△チューニングチューニングチューニングチューニング

○△SQLの利用

S2DaoKuina-Dao + JPA実装

35Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較比較 55 –– レガシーなレガシーなERERモデルとの相性モデルとの相性

• ここでの「レガシーなERモデル」の定義

– 複合主キーを利用している

– トリガーを多用している

• S2Daoの場合– すべてSQLで解決できるので相性は良い

• JPAの場合– JPAでは複合主キーを使う/使わないでマッピングが異なるので注意

• @EmbeddedId、@JoinColumns

• クラス数が増える、コードが増える

– トリガーでDBが更新されると、DBとJPAの永続コンテキストがずれる

• EntityManager#refresh()

36Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較結果比較結果 55 –– レガシーなレガシーなERERモデルとの相性モデルとの相性

6

8

○×学習コスト2

○×人気(ダウンロード数)1

7

5

4

3

○○○○△△△△レガシーレガシーレガシーレガシーななななERモモモモ

デルデルデルデルとのとのとのとの相性相性相性相性

○△チューニング

○△SQLの利用

S2DaoKuina-Dao + JPA実装

37Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較比較 6 6 –– マッピングマッピング

• S2Daoの場合– 独自のアノテーションと規約でマッピング

• フラットなDTOにマッピングされる

– リレーションシップのマッピング• Many to One

• 双方向関連や遅延ローディングの機能はない

• JPAの場合– 標準のアノテーションでマッピング

• 階層化されたデータ構造にマッピングされる

– リレーションシップのマッピング• Many to One

• One to Many

• One to One

• Many to Many

• 双方向関連や遅延ローディングをサポート

38Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較結果比較結果 6 6 –– マッピングマッピング

△△△△○○○○マッピングマッピングマッピングマッピング6

8

○×学習コスト2

○×人気(ダウンロード数)1

7

5

4

3

○△レガシーなERモデルとの相性

○△チューニング

○△SQLの利用

S2DaoKuina-Dao + JPA実装

39Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較比較 7 7 –– 永続コンテキスト永続コンテキスト

• S2Daoの場合

– 永続コンテキストに相当するキャッシュはもたない

– 常にDBに問い合わせることでシンプルさを保つ

• JPAの場合– JPA実装が永続コンテキストを管理する

– 問い合わせはキャッシュされるので、同じトランザクション内で何度も同じエンティティにアクセス(更新、問い合わせ)する場合に効果を発揮する

40Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較結果比較結果 7 7 –– 永続コンテキスト永続コンテキスト

△○マッピング6

8

○×学習コスト2

○×人気(ダウンロード数)1

7

5

4

3

○△レガシーなERモデルとの相性

××××○○○○永続永続永続永続コンテキストコンテキストコンテキストコンテキスト

○△チューニング

○△SQLの利用

S2DaoKuina-Dao + JPA実装

41Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較比較 88 –– ツールのサポートツールのサポート

• S2Daoの場合– Seasarプロジェクトが提供

• Dolteng

• DBFlute

• S2Dao-CodeGen

• Kuina-Daoの場合– Seasarプロジェクトが提供

• Dolteng

– (JPAの部分に関しては)IDEが提供

• Eclipse

– Dali JPA Tools

• NetBeans

• JDeveloper

42Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較結果比較結果 88 –– ツールのサポートツールのサポート

△○マッピング6

××××○○○○ツールツールツールツールののののサポートサポートサポートサポート8

○×学習コスト2

○×人気(ダウンロード数)1

7

5

4

3

○△レガシーなERモデルとの相性

×○永続コンテキスト

○△チューニング

○△SQLの利用

S2DaoKuina-Dao + JPA実装

43Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

KuinaKuina--DaoDaoととS2Dao S2Dao –– まとめまとめ((11))

△○マッピング6

×○ツールのサポート8

○×学習コスト2

○×人気(ダウンロード数)1

7

5

4

3

○△レガシーなERモデルとの相性

×○永続コンテキスト

○△チューニング

○△SQLの利用

S2DaoKuina-Dao + JPA実装

5対 3 でS2Daoの勝ち?

44Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

KuinaKuina--DaoDaoととS2Dao S2Dao –– まとめまとめ((22))

△○○○○マッピングマッピングマッピングマッピング6

×○○○○ツールツールツールツールののののサポートサポートサポートサポート8

○×学習コスト2

○×人気(ダウンロード数)1

7

5

4

3

○△レガシーなERモデルとの相性

×○○○○永続永続永続永続コンテキストコンテキストコンテキストコンテキスト

○△チューニング

○△SQLの利用

S2DaoKuina-Dao + JPA実装

45Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

KuinaKuina--DaoDaoのののの使使使使いどころいどころいどころいどころのののの使使使使いどころいどころいどころいどころ

KuinaKuina--DaoDaoの使いどころの使いどころ

46Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

22タイプのアプリケーションタイプのアプリケーション

• 世の中のアプリケーションは2種類に分けられる

– データの入出力が中心のアプリケーション

– データの評価・加工が中心のアプリケーション

• 入出力が中心のアプリケーションとは?– 画面からの入力したデータをほとんどそのままバックエンドシステム(DB、

メインフレーム)にわたす

– バックエンドシステム(DB、メインフレーム)から受け取ったデータをほと

んどそのまま画面に出力する

• 評価・加工が中心のアプリケーションとは?– データベースに問い合わせながらあるデータを評価し、その評価に基づいて加工を行うアプリケーション

47Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

入出力中心のアプリケーションの場合入出力中心のアプリケーションの場合

• 業務ロジックがほとんどない

– バリデーションやデータの型変換などはある

• キャッシュの仕組みは不要

– 入力時は、更新メソッドを呼べばよい

– 出力時は、画面に合わせて必要なデータを取得すればよい

• 2種類のマッピングがあればOK

– テーブルとオブジェクトのマッピング

– 任意の結果セットとオブジェクトのマッピング

DBS2Daoプレゼンテーション

DTOを

やり取りするトランザクション境界

ロジック

48Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

ロジックロジック

評価・加工が中心のアプリケーションの場合評価・加工が中心のアプリケーションの場合

• 同一テーブルの同一レコードがトランザクション内で複数のロジックにまたがって何度もアクセスされる

– 必要毎のDBアクセスは避けたい→永続永続永続永続コンテキストコンテキストコンテキストコンテキストでのキャッシュ

• 同一テーブルの同一レコードがトランザクション内でさまざまに変更される

– 変更毎のDBアクセスは避けたい→コミット時の永続永続永続永続コンテキストコンテキストコンテキストコンテキストのフラッシュ

• データにグループ化や階層構造が必要

– リレーションシップリレーションシップリレーションシップリレーションシップののののマッピングマッピングマッピングマッピング

JPA実装Kuina-Dao DB

永続コンテキスト

プレゼンテーション

ロジック

エンティティにアクセスエンティティを管理

トランザクション境界

ロジック

49Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

評価・加工が中心のアプリケーションの例評価・加工が中心のアプリケーションの例

• シミュレーション系アプリ(例えば生産管理のスケジューリング)– 一度のトランザクションで何度も変更されるエンティティ

• 所要量

• タスク

• スケジュール

• 在庫

– 一度のトランザクションで何度もアクセスされるエンティティ

• スケジュール

• タスク

• リソース

• 能力

• 部品

• 部品構成

• 在庫

50Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

• JPAが効果的なアプリケーションにはKuina-Daoも効果的– Kuina-DaoはJPAを使いやすくするフレームワーク

• JPAの使いどころ– 永続コンテキスト

• DBアクセスを減らすための仕組み(キャッシュ・コミット時のフラッシュ)が備わっている

– アプリケーションをシンプルに保てる

– 管理すべきSQLを減らせる

– リレーションシップのマッピング• データのまとまりや階層構造(1対多・多対1)をロジックで扱える

– ツール(IDEやIDEのプラグインなど)のサポート

• エンティティの自動生成

• エンティティの編集補完

• 設定ファイルの自動生成

KuinaKuina--DaoDaoの使いどころの使いどころ –– まとめまとめ

評価・加工が中心ならば評価・加工が中心ならばKuinaKuina--DaoDaoでで入出力中心ならば入出力中心ならばS2DaoS2Daoで決まり?で決まり?

51Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

KuinaKuina--DaoDaoのののの使使使使いどころいどころいどころいどころのののの使使使使いどころいどころいどころいどころ

アドバンスドアドバンスドアドバンスドアドバンスドアドバンスドアドバンスドアドバンスドアドバンスド

KuinaKuina--DaoDaoの使いどころの使いどころ アドバンスドアドバンスド

52Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

S2DaoS2Daoで入出力中心のアプリケーションで入出力中心のアプリケーション

• DTOの管理が煩雑– 画面が増えると対応してDTOとDAOが増える

DBS2Dao

プレゼンテーション

DTOを

やり取りする

トランザクション境界

ロジック

プレゼンテーションプレゼンテーションプレゼンテーションプレゼンテーションプレゼンテーションプレゼンテーションプレゼンテーション

53Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

KuinaKuina--DaoDaoで入出力中心のアプリケーションで入出力中心のアプリケーション

• エンティティをそのまま表示すればOK– 画面が増えてもDTOを管理する必要がない。でも…

ロジック

プレゼンテーションプレゼンテーションプレゼンテーションプレゼンテーションプレゼンテーションプレゼンテーションプレゼンテーションプレゼンテーション

JPA実装Kuina-Dao DB

永続コンテキスト

エンティティを管理

トランザクション境界

エンティティを表示

54Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

遅延ローディングにどう対応するか遅延ローディングにどう対応するか

a. あらかじめアクセスしておく

b. フェッチタイプをEagerに設定しておく

c. Transaction View

d. Entity Manager per Request

e. DTOに変換

55Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

遅延ローディングにどう対応するか遅延ローディングにどう対応するか ‐‐ ベストプラクティスベストプラクティス

• フェッチタイプはすべてLazyに設定しておく– @ManyToOne(fetch = FetchType.LAZY)

• 必要なものだけFetch Joinで取得する

– Kuina-Daoでは簡単にFetch Joinするための仕組みを提供• @Distinct

@FetchJoin(joinSpec = JoinSpec.LEFT_OUTER_JOIN, value = “emps”)List<Dept> findByLoc(String loc);

– もちろんJPQLを書いてもOK• SELECT DISTINCT dept FROM Dept AS dept LEFT OUTER JOIN FETCH

dept.emps WHERE (dept.loc = :loc)

56Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

KuinaKuina--DaoDaoの使いどころの使いどころ アドバンスドアドバンスド –– まとめまとめ

エンティティを直接参照する形は今後Teedaがサポート

ロジック

プレゼンテーションプレゼンテーションプレゼンテーションプレゼンテーションプレゼンテーションプレゼンテーションプレゼンテーションTeedaの

Pageクラス

JPA実装Kuina-Dao DB

永続コンテキスト

エンティティを管理

トランザクション境界

エンティティを表示

@FetchJoinで必要なエンティティだけを取得

57Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

ロードマップロードマップロードマップロードマップロードマップロードマップロードマップロードマップ

ロードマップロードマップ

58Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

KuinaKuina--DaoDao関連プロダクトのロードマップ関連プロダクトのロードマップ

• 現在– 2007年5月 S2TopLink-JPA 1.0-r3 リリース

– 2007年5月 S2Hibernate-JPA 1.0 リリース

– 2007年5月 Kuina-Dao 1.0 リリース

• 予定– 2007年9月 S2TopLink-JPA 1.0 リリース予定

– 2007年x月 S2OpenJPA 1.0 リリース予定

– 2007年x月 S2Cayenne-JPA 1.0 リリース予定

皆皆皆皆さんのさんのさんのさんの要望要望要望要望をををを受受受受けけけけ付付付付けていますけていますけていますけています!!!!

59Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

KuinaKuina--DaoDaoの関連情報の関連情報

• ドキュメント

– http://kuina.seasar.org/ja/

• 書籍

– Java Expert #01

• http://www.amazon.co.jp/Java-Expert-01-編集部/dp/4774130702/

• メーリングリスト

– Seasar userメーリングリスト

[email protected]

– JPAメーリングリスト

[email protected]

• サンプル(テストコード)

– SVNリポジトリ

• https://www.seasar.org/svn/kuina/trunk/kuina-dao-it

• ツール

– Dolteng(どぅるてん)

• http://www.seasar.org/wiki/index.php?Dolteng

60Seasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar ConferenceSeasar Conference

2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring2007 Spring Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

ありがとうございましたありがとうございました

ありがとうございました