kuina -dao 入門kuina.seasar.org/ja/sc2007spring_aa1_kuina.pdftitle microsoft powerpoint -...
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メーリングリスト
– JPAメーリングリスト
• サンプル(テストコード)
– 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.
ありがとうございましたありがとうございました
ありがとうございました