S2DaoでもN:Nできます

Similar documents
早分かりS2Dao

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

JPA & Kuina-Dao入門

S2Dao入門

Seasar.NET入門

Microsoft PowerPoint - Seasar2.5.ppt

全部まとめてHOT deploy

Load-time weaveingで広がるAOPの可能性

スライド 1


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

プレポスト【問題】

2 Java 35 Java Java HTML/CSS/JavaScript Java Java JSP MySQL Java 9:00 17:30 12:00 13: 項目 日数 時間 習得目標スキル Java 2 15 Web Java Java J

: : : TSTank 2

アルゴリズムとデータ構造1

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

intra-mart im-JavaEE Framework

ALG ppt

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

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

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

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

前ページからの続き // テキストボックス02 id 属性で取得 // id 属性で取得する場合は一意に決まるので 何番目かの指定は不要 var textbox02elem = document.getelementbyid("text_box02_id"); if ("001" == statee

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

PowerPoint Presentation

Sequel のすすめ 私が SQL を嫌いな理由 とみたまさひろ RubyHiroba Sequel のすすめ - 私が SQL を嫌いな理由 Powered by Rabbit 2.0.7

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

SpringSecurity

PowerPoint プレゼンテーション

データアダプタ概要

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

PowerPoint Presentation

03_さらなる開発生産性向上へ.pptx

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

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

Javaプログラムの実行手順

橡実践Oracle Objects for OLE

PostgreSQL SQL チューニング入門 ~ Explaining Explain より ~ 2012 年 11 月 30 日 株式会社アシスト 田中健一朗

文字列操作と正規表現

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

Java演習(4) -- 変数と型 --

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

test

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

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

JavaプログラミングⅠ

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

[1]...1 [2]...1 [3] Java Web...3 [4] Java Web...18 [

1 SQL Server SQL Oracle SQL SQL* Plus PL/SQL 2 SQL Server SQL Server SQL Oracle SQL SQL*Plus SQL Server GUI 1-1 osql 1-1 Transact- SQL SELECTFROM 058

intra-mart WebPlatform/AppFramework

T2でつなごう! -つなぐつながるWebフレームワーク「T2」の紹介

今さら人には聞けないAOP入門

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

K227 Java 2


PowerPoint -O80_REP.PDF

IronPython による柔軟なゲーム開発 筑波大学 AmusementCreators

データベースアクセス

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

TestDesign for Web

Microsoft PowerPoint - chap10_OOP.ppt

基本情報STEP UP演習Java対策

TALON Tips < 親子関係のある構成データを TALON で表示する > 株式会社 HOIPOI 第 1.1 版 p. 1

Transcription:

S2Dao でも N:N できます 1

自己紹介 名前 : 木村聡 ( きむらさとし ) Seasarプロジェクトコミッタ : S2Struts S2Mai 舞姫 仕事 ( 株 ) フルネス フレームワーク 自動生成ツール 2

これまで書いたものとか 書籍 : Eclipse で学ぶはじめての Java Seasar 入門 ~ はじめての DI&AOP~ 雑誌 Web 記事 CodeZine DB Magazine WEB+DB Seasar2 徹底攻略 (Vol.31) JavaWorld 開発者にとって 易しく 優しい 軽量コンテナ Seasar2 の実力を探る (2005/05) 3

デモ 4

テーブル EMP EMPNO ENAME DEPTNO DETPと関連 その他 DEPT DEPTNO DNAME その他 5

SQL SELECT EMP.DEPTNO, DNAME, EMPNO, ENAME ~ 略 ~ FROM ~ 略 ~ WHERE ~ 略 ~ ORDER BY EMPNO 6

マッピング S2Dao フラットな List 7

マッピング S2Dao 拡張版 階層あり 8

使い方 パラメータ化された List のプロパティーを持たせる 例えば List<Dept> List<Emp> Dao の select メソッドに @S2DaoExt をつける dicon ファイル赤文字を追記 <components> <include path="kimu_dao.dicon"/> <component class="jp.dodododo.dao.ext.s2dao.interceptor.testdao"> <aspect>s2daoextinterceptor</aspect> <aspect>dao.interceptor</aspect> </component> </components> 9

Select の結果をそのままマッピング テーブル構造は関係ない ResultSet Object SQL の実行結果に素直 検索結果を見たまま素直に Object にする セレクト項目 ORDER BY Objectの構造 10

まとめ ( その 1) Generics を使った型情報など Class ファイルから取れる情報が増えた どう使うかが今後の課題 フレームワーク ライブラリ提供者 11

kimu-dao を作った動機 S2Dao のような機能を保守中のシステムでも使いたい Connection 渡すだけで使いたい ついでにいろいろな機能を付けた 1:N や N:N も扱いたい 12

つまり S2Dao のコマではないです 13

使い方 14

Dao のインスタンス コンストラクタにコネクションを渡す Dao dao = new DaoImpl(connection); コンストラクタにデータソースを渡す Dao dao = new DaoImpl(dataSource); データソースをセットする DaoImpl dao = new DaoImpl(); dao.setdatasource(datasource); 15

CRUD insert dao.insert(entity); update dao.update(entity); delete dao.delete(entity); 16

バッチ insert Collection<ENTITY> dao.insert(entities); update dao.update(entities); delete dao.delete(entities); 17

select 1 件 複数件数が返ってきたら例外 Emp emp = dao.selectone(sql, Emp.class); sql ファイル (S2Dao と同じ ) のパス or S2Dao が sql ファイルに書いていたファイルの中身 (SQL を動的に組み立てられる ) "select * from emp /*BEGIN*/.../*END*/" 18

select 複数件 List<Emp> emp = dao.select(sql, Emp.class); 19

select 1 件 (Map) Map<String, Object> m = dao.selectonemap(sql); 20

select 複数件 (Map) List<Map<String, Object>> l = dao.selectmap(sql); 21

条件渡し 名前付の値 import static jp.dodododo.dao.util.daoutil.*;... Emp emp = dao.selectone(sql,args("id",10), Emp.class); Emp emp = dao.selectone(sql, args("id", query.getid(), "name",query.getname()), Emp.class); int String 22

まとめ ( その 2) 可変長引数を使うと Java っぽくない API が出来る 新しい API の可能性 23

一件づつまわす dao.select(sql, Emp.class, new FooCallback()) public class FooCallback implements IterationCallback<Emp> { public void iterate(emp e) { // ここに処理を書く } public List<Emp> getresult() { return null; } } 24

このカラムだけ import static jp.dodododo.dao.columns.columnsutil.*;... dao.update(entity,pc("col1","col2")); Persistent Columns 25

このカラムを除く import static jp.dodododo.dao.columns.columnsutil.*;... dao.update(entity,npc("col1","col2")); No Persistent Columns 26

ロック 楽観的ロック import static jp.dodododo.dao.columns.columnsutil.*;... dao.update(entity, OPTIMISTIC_LOCKING); dao.update(entity,pc("col1","col2"), OPTIMISTIC_LOCKING); dao.update(entity,npc("col1","col2"), OPTIMISTIC_LOCKING); 27

select 数字 BigDecimal num = dao.selectonenumber(sql); int i = dao.selectonenumber(sql).intvalue(); 28

独自機能 29

可変のオーダーバイ SELECT * FROM EMP /*ORDER BY @SqlUtil@orderBy(orderBy)*/ ORDER BY EMPNO /*END*/ List<OrderByArg> orderby = new ArrayList<OrderByArg>(); orderby.add(new OrderByArg("ENAME", SortType.ASC)); orderby.add(new OrderByArg("EMPNO", SortType.DESC)); dao.select(sql, args("orderby", orderby), Emp.class); 30

BEGIN SELECT * FROM EMP /*BEGIN*/ where /*IF false*/ /*IF true*/ EMPNO = 1 /*END*/ /*END*/ /*END*/ 一つの IF が true でも where 句が空なら BEGIN~END は除く S2Dao の場合エラーになる SELECT * FROM EMP where 31

ID 生成 public class Entity { @Id(@IdDefSet(type = Sequence.class,name = "seqname")) public void setid(int id) { this.id = id; } } 32

public class Entity { ID 生成 @Id({ @IdDefSet(type = Sequence.class,name = "seqname"), @IdDefSet(db = HSQL.class, type = Sequence.class,name = "seqname", ), @IdDefSet(db = Oracle.class, type = RandomUUID.class) }) public void setid(int id) { this.id = id; } } 33

DB 毎に指定可能 ID 生成 生成ロジック sequence Identity Derby:IDENTITY_VAL_LOCAL() UUID 独自ロジックを作成可能 IdGeneratorをimplしたenumを作成 @IdDefSetのtypeで指定 34

更新 セレクトでの DB とオブジェ クトのどちらを尊重するか 更新は DB セレクトは Java できるだけ型変換する PreparedStatement の setxxx ResultSet の getxxx を使い分ける 35

SqlUtil をデフォルトパッケージに 置いた SELECT * FROM EMP /*ORDER BY @SqlUtil@orderBy(orderBy)*/ ORDER BY EMPNO /*END*/ 割り切った 36

方言 S2Dao と同じ +α public class Bean { @Dialects( dialect = { HSQL.class, Oracle.class }, value = { "CURRENT_TIMESTAMP", "SYSDATE" }) public String sysdate; @Dialects( dialect = { HSQL.class, Oracle.class }, value = { "INFORMATION_SCHEMA.SYSTEM_TABLES WHERE table_name = 'SYSTEM_TABLES'", "DUAL" }) public String dual; } dao.selectmap("select /*$bean.sysdate*/sysdate from /*$bean.dual*/dual ", args("bean", bean)); select CURRENT_TIMESTAMP from INFORMATION_SCHEMA.SYSTEM_TABLES WHERE table_name = 'SYSTEM_TABLES' select SYSDATE from DUAL 37

LimitOffset List<Map<String, Object>> l = dao.selectmap( sql, args(limitoffset.keyword,new LimitOffset(10, 0))); List<Map<String, Object>> l = dao.selectmap( sql, args(limitoffset.keyword,new Paging(10, 0))); limit, offset 38 limit, pagenumber

public フィールド対応 も してあります 39

S2Dao 拡張 @S2DaoExtアノテーション付けるだけ アノテーションが無ければS2Dao 全部の機能は使えない select だけ public interface TestDao { @S2DaoExt @Arguments("deptno") List<DeptHasEmpList> selectbykimdao(int deptno); } 40

使い方 大きく 2 つ 直接使う S2Dao を拡張して使う 41

今後 S2Dao にフィードバックしたい 機能追加はあまり考えていない 特殊な DB でも拡張可能だし SQL 書けばよいので 近いうちに Ver1.0.0 をリリース S2JDBC のように Java 上で SQL を組み立てるような仕組みは提供は予定していない SQL エディタを使えば 補完できる SQL の即時実行もできる Eclipse プラグインの紹介 DBViewer Plugin http://sourceforge.jp/projects/dbviewer/ 42

プロダクト情報 名前 kimu-dao URL http://code.google.com/p/kimu-dao/ 43

まとめ S2Dao では不可能な機能を提供 S2Dao の仕組み 知見が利用できる 例えば dolteng を使った自動生成 Entity Dao Sql Java5 以降導入された機能 の可能性 44

終わり ご清聴ありがとうございました 45