S2Dao入門

Similar documents
早分かりS2Dao

S2DaoでもN:Nできます

Seasar.NET入門

JPA & Kuina-Dao入門

Microsoft PowerPoint - sc2007spring_Aa1_Kuina.ppt

intra-mart im-JavaEE Framework

PowerPoint Presentation

Microsoft PowerPoint - Seasar2.5.ppt

(Microsoft PowerPoint - Java\221\3462\225\224\211\357\224\255\225\\\216\221\227\ ppt)

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


プレポスト【問題】

tkk0408nari

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

TopLink å SampleClient.java... 5 Ò readallsample() querysample() cachesample() Ç..

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

文字列操作と正規表現

V8.1新規機能紹介記事

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

Javaセキュアコーディングセミナー東京 第3回 入出力(File, Stream)と例外時の動作 演習解説

intra-mart WebPlatform/AppFramework

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

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

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

ORACLE FUSION MIDDLEWARE Tech Topic Meeting

スライド 1

Microsoft Word - Lab6.doc

intra-mart WebPlatform/AppFramework

FileMaker ODBC and JDBC Guide

Thesis Template

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

Microsoft PowerPoint ppt

FileMaker 16 ODBC と JDBC ガイド

BC4J...4 BC4J Association JSP BC4J JSP OC4J

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

PowerPoint Presentation

0315_F1_8iJDBC-SQLJ.PDF

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

PowerPoint プレゼンテーション

FileMaker 15 ODBC と JDBC ガイド

JAVA とテンプレート

S2Pradoの紹介

PowerPoint プレゼンテーション

ValueHolder... 9 Customer.java Oracle TopLink 10g(10.1.3) È Volume3 2

新・明解Java入門

WebOTXマニュアル

GEC-Java

Oracle Lite Tutorial

B2-Servlet-0112.PDF

FileMaker ODBC と JDBC ガイド

基本情報STEP UP演習Java対策

スライド 1

Oracle9iAS Containers for J2EEチュートリアル

Microsoft Word - ACCESSINGO...

mySQLの利用

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

PowerPoint プレゼンテーション

生産性アップの秘訣はこれだ! スクリプト系&Java系フレームワーク

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

052-XML04/fiÁ1-part3-’ÓŠ¹

Webシステム授業資料

FileMaker ODBC and JDBC Guide

第14回若年者ものづくり競技大会「業務用ITソフトウェア・ソリューションズ」職種 模擬競技課題

目的 泡立ち法を例に Comparableインターフェイスの実装 抽象クラスの利用 型パラメタの利用 比較 入替 の回数を計測

第 2 章 PL/SQL の基本記述 この章では PL/SQL プログラムの基本的な記述方法について説明します 1. 宣言部 2. 実行部 3. 例外処理部

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

(Microsoft PowerPoint - \223\306\217KJAVA\221\346\202R\224\ ppt)

データベースアクセス

データアダプタ概要

Javaアプリケーション開発ガイド入門編

Microsoft PowerPoint - グリッド協議会GT4演習資料_2007_配布用

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

Microsoft Word - tutorial3-dbreverse.docx

Prog1_10th

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

領域サイズの見積方法

Flex2とS2Flex2とAIR紹介

テーブルの確認 sqlite>.tables.tables コマンドでデータベース内のテーブル一覧を表示する テーブルスキーマの表示 sqlite>.schema mytable.schema コマンドで指定のテーブルのスキーマを表示できる テーブル出力の整形.explain コマンドを使うと テー

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

Prog2_9th

10/ / /30 3. ( ) 11/ 6 4. UNIX + C socket 11/13 5. ( ) C 11/20 6. http, CGI Perl 11/27 7. ( ) Perl 12/ 4 8. Windows Winsock 12/11 9. JAV

Microsoft Word - 430_15_Developing_Stored_Procedure.doc

Q&A集

サンプル Java プログラム

Prog1_15th

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

Java (9) 1 Lesson Java System.out.println() 1 Java API 1 Java Java 1

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

Oracle9i JDeveloperによるWebサービスの構築

_02-4.ppt

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

DB12.1 Beta HandsOn Seminar

PowerPoint Presentation

やさしいJavaプログラミング -Great Ideas for Java Programming サンプルPDF

スライド 0

Java知識テスト問題

Microsoft PowerPoint - JavaFesta.ppt

PowerPoint プレゼンテーション

ALG ppt

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

Transcription:

2007 Spring S2Dao 入門 大中浩行 (a.k.a. せとあずさ ) 2007 Spring Copyright 2004-2007 The Seasar Foundation and the others. All rights reserved. 1

自己紹介 大中浩行 (a.k.a. せとあずさ ) azusa@fieldnotes.jp http://www.fieldnotes.jp/d/ S2Dao/S2Container/S2Dao- CodeGen/mistralコミッタ ( 株 ) エルテックス SI 事業部 2

agenda DBアプリケーションの問題点 O/Rマッピング S2Daoとは S2Daoの特徴 関連ツール 3

DB アプリケーションの問題点 単調なコードの割りに実装量が多い 技術者がアプリケーション (Java) とDB(SQL) の両方に精通する必要があり 品質を保つのが難しい 大抵のアプリケーションではEJBは役不足 とはいえ素のJDBCでは力不足 4

O/R マッピング (Java) オブジェクトとデータベースのテーブルの結び付けを簡単にしようとする風潮 Hibernate / ibatis / Torque /Commons DBUtils( これはO/Rマッピングではないですが ) / JDO(Java Data Object)/ TopLink / JPA(Java Presistance API) 世界的にはHibernateがデファクト? 5

S2Dao えすつーだお http://s2dao.seasar.org/ja/ S2Dao Daoパターンを使用したO/Rマッパー AOPとアノテーションによってXMLレスなO/Rマッピングを実現.NET(S2Dao.NET), PHP(S2Dao.PHP5) にも移植されています 豊富なサポートツール 6

Daoはインターフェースを書くだけで実装可能 設定はアノテーションで記述 エンティティはJavaBean 単純なSQLは自動生成 複雑なSQLは自分で書く 2-Way SQL S2Dao で実行する SQL が SQL*Plus などで実行可能 特徴 7

Dao(Before) public class EmployeeDao { public List<Employee> getallemployees() { Connection con = null; Statement stmt = null; try { List<Employee> list = new ArrayList<Employee>(); Class.forName("org.hsqldb.jdbcDriver"); con = DriverManager.getConnection( "jdbc:hsqldb:hsql://localhost:9001", "sa", ""); stmt = con.createstatement(); ResultSet rset = stmt.executequery("select * from Employee"); while (rset.next()) { Employee emp = new Employee(); emp.setempno(rset.getint("empno")); emp.setename(rset.getstring("ename")); emp.setjob(rset.getstring("job")); emp.setmgr(rset.getint("mgr")); emp.sethiredate(rset.getdate("hiredate")); emp.setsal(rset.getbigdecimal("sal")); emp.setcomm(rset.getbigdecimal("comm")); emp.setdeptno(rset.getint("dedptno")); emp.settimestamp(rset.gettimestamp("timestamp")); list.add(emp); return list; catch (RuntimeException e) { throw e; catch (Exception e) { throw new RuntimeException(e); finally { if (stmt!= null) { try { stmt.close(); catch (Exception ignore) { if (con!= null) { try { con.close(); catch (Exception ignore) { 8

すみません ちょっと小さすぎました public class EmployeeDao { public List<Employee> getallemployees() { Connection con = null; Statement stmt = null; try { List<Employee> list = new ArrayList<Employee>(); Class.forName("org.hsqldb.jdbcDriver"); con = DriverManager.getConnection( "jdbc:hsqldb:hsql://localhost:9001", "sa", ""); stmt = con.createstatement(); ResultSet rset = stmt.executequery("select * from Employee"); while (rset.next()) { Employee emp = new Employee(); emp.setempno(rset.getint("empno")); emp.setename(rset.getstring("ename")); emp.setjob(rset.getstring("job")); emp.setmgr(rset.getint("mgr")); emp.sethiredate(rset.getdate("hiredate")); emp.setsal(rset.getbigdecimal("sal")); emp.setcomm(rset.getbigdecimal("comm")); emp.setdeptno(rset.getint("dedptno")); emp.settimestamp(rset.gettimestamp("timestamp")); list.add(emp); return list; catch (RuntimeException e) { throw e; catch (Exception e) { throw new RuntimeException(e); finally { if (stmt!= null) { try { stmt.close(); catch (Exception ignore) { if (con!= null) { try { con.close(); catch (Exception ignore) { 9

Dao(After After) @S2Dao(bean=Employee.class) public interface EmployeeDao{ public List<Employee> getallemployees(); 10

それでは S2Dao を使用するコードを見てみましょう 実装 11

DB Employee テーブル カラム名 EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO TIMESTAMP 型 numeric(4) varchar(10) varchar(9) numeric(7,2) Date numeric(7,2) numeric(7,2) numeric(2) timestamp PK 12

@S2Dao(bean=Employee.class) public interface EmployeeDao{ public List<Employee> getallemployees(); @Arguments("empno") public Employee getemployee(int empno); public void insert(employee emp); public void delete(employee emp); public void update(employee emp); Dao 13

エンティティ (JavaBean) @Bean(table = "EMPLOYEE") public class Employee implements Serializable { public void sethiredate(date hiredate) { ( 略 ) this.hiredate = hiredate; public Integer getempno() { public BigDecimal getsal() { return empno; return sal; public void setempno(integer empno) { public void setsal(bigdecimal sal) { this.empno = empno; this.sal = sal; public String getename() { public BigDecimal getcomm() { return ename; return comm; public void setename(string ename) { public void setcomm(bigdecimal comm) { this.ename = ename; this.comm = comm; public Integer getdeptno() { public String getjob() { return deptno; return job; public void setdeptno(integer deptno) { public void setjob(string job) { this.deptno = deptno; this.job = job; public Timestamp gettimestamp() { public Integer getmgr() { return timestamp; return mgr; public void settimestamp(timestamp tstamp) { public void setmgr(integer mgr) { this.timestamp = tstamp; this.mgr = mgr; public String tostring() { return org.apache.commons.lang.builder.tostringbuilder public Date gethiredate() {.reflectiontostring(this); return hiredate; 14

定数アノテーション JDK1.4 だとこうなります public interface EmployeeDao{ public static final Class BEAN = Employee.class; public List getallemployees(); public static final String getemployee_args="empno"; public Employee getemployee(int empno); public void insert(employee emp); public void delete(employee emp); public void update(employee emp); 15

命名規則 挿入するメソッドは名前が insert,create,add で始める 更新するメソッドは update,modify,store で始める 削除するメソッドはdelete,updateremoveで始める それ以外は検索 Dao 16

dicon <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <include path="dao.dicon"/> <component class="jp.fieldnotes.conf.dao.employeedao" > <aspect>dao.interceptor</aspect> </component> </components> 17

実行コード public static void main(string[] args) { S2Container container = S2ContainerFactory.create("app.dicon"); try { container.init(); EmployeeDao dao = (EmployeeDao) container.getcomponent(employeedao.class); System.out.println("daoを実行 "); List<Employee> result = dao.getallemployees(); for (Employee employee : result) { System.out.println(employee); finally { container.destroy(); 18

実行! dao を実行 DEBUG 2007-05-16 23:34:42,625 [main] 物理的なコネクションを取得しました DEBUG 2007-05-16 23:34:42,625 [main] 論理的なコネクションを取得しました DEBUG 2007-05-16 23:34:42,718 [main] 論理的なコネクションを閉じました DEBUG 2007-05-16 23:34:42,718 [main] 論理的なコネクションを取得しました DEBUG 2007-05-16 23:34:42,734 [main] 物理的なコネクションを取得しました DEBUG 2007-05-16 23:34:42,734 [main] 論理的なコネクションを取得しました DEBUG 2007-05-16 23:34:42,734 [main] 論理的なコネクションを閉じました DEBUG 2007-05-16 23:34:42,906 [main] 論理的なコネクションを閉じました DEBUG 2007-05-16 23:34:42,968 [main] SELECT EMPLOYEE.empno, EMPLOYEE.ename, EMPLOYEE.job, EMPLOYEE.mgr, EMPLOYEE.hiredate, EMPLOYEE.sal, EMPLOYEE.comm, EMPLOYEE.deptno, EMPLOYEE.timestamp FROM EMPLOYEE DEBUG 2007-05-16 23:34:42,968 [main] 論理的なコネクションを取得しました DEBUG 2007-05-16 23:34:43,000 [main] 論理的なコネクションを閉じました jp.fieldnotes.conf.entity.employee@f47396[empno=7369,ename=smith,job=clerk,mgr=7902,hiredate=1980-12-17 00:00:00.0,sal=800.00,comm=<null>,deptno=20,timestamp=2000-01-01 00:00:00.0] jp.fieldnotes.conf.entity.employee@b8f8eb[empno=7499,ename=allen,job=salesman,mgr=7698,hiredate=1981-02-20 00:00:00.0,sal=1600.00,comm=300.00,deptno=30,timestamp=2000-01-01 00:00:00.0] jp.fieldnotes.conf.entity.employee@1de17f4[empno=7521,ename=ward,job=salesman,mgr=7698,hiredate=1981-02-22 00:00:00.0,sal=1250.00,comm=500.00,deptno=30,timestamp=2000-01-01 00:00:00.0] jp.fieldnotes.conf.entity.employee@1f6ba0f[empno=7566,ename=jones,job=manager,mgr=7839,hiredate=1981-04-02 00:00:00.0,sal=2975.00,comm=<null>,deptno=20,timestamp=2000-01-01 00:00:00.0] jp.fieldnotes.conf.entity.employee@1313906[empno=7654,ename=martin,job=salesman,mgr=7698,hiredate=1981-09-28 00:00:00.0,sal=1250.00,comm=1400.00,deptno=30,timestamp=2000-01-01 00:00:00.0] DEBUG 2007-05-16 23:34:43,031 [main] 物理的なコネクションを閉じました DEBUG 2007-05-16 23:34:43,031 [main] 物理的なコネクションを閉じました 19

秘密兵器 :AOP: インターフェースしか用意してないのに処理が行われるのはどうして? <<interface>> EmployeeDao +insert() +update() +delete() ユーザが作成したインターフェース S2AOP で自動生成した実装クラス EmployeeDao$$EnhancedByS2AOP$$12d263f +insert() +update() +delete() 実行! 20

@S2Dao(bean=Employee.class) public interface EmployeeDao{ public List getallemployees(); 2Way-SQL(1) @Arguments("empno") public Employee getemployee(int empno); public void insert(employee emp); public void delete(employee emp); public void update(employee emp); 21

対話型ツールからそのまま実行可能 SELECT * FROM EMPLOYEE WHERE empno = /*empno*/7369 2Way-SQL( SQL(2) ファイル名は Dao のクラス名 _ メソッド名.sql この場合 EmployeeDao_getEmployee.sql Eclipseの場合はソースファイルと同じ場所に置く Maven2の場合はsrc/main/resources 22

2Way-SQL(3) S2Daoから実行するときはSQLコメントの記述を元にPreparedStatementを生成して実行 SELECT * FROM Employee WHERE empno = /*empno*/7788 /* の後ろにスペースは入れない SELECT * FROM Employee WHERE empno =? というPreparedStatementが生成されます 23

動的 SQL 職種および部署を指定して検索する @Arguments( { "job", "deptno" ) public List<Employee> getemployeebyjobanddeptno(string job, Integer deptno); 24

SELECT * FROM EMPLOYEE /*BEGIN*/WHERE /*IF job!= null*/ JOB = /*job*/'clerk' /*END*/ /*IF deptno!= null*/ AND DEPTNO =/*deptno*/20 /*END*/ /*END*/ 動的 SQL とSQL コメント 25

実行コード System.out.println("daoを実行 "); // 第 1 引数 job 第 2 引数 deptno List<Employee> result = dao.getemployeebyjobanddeptno(null, 20); for (Employee employee : result) { System.out.println(employee); 26

実行! dao を実行 DEBUG 2007-05-16 23:35:41,765 [main] 物理的なコネクションを取得しました DEBUG 2007-05-16 23:35:41,765 [main] 論理的なコネクションを取得しました DEBUG 2007-05-16 23:35:41,859 [main] 論理的なコネクションを閉じました DEBUG 2007-05-16 23:35:41,859 [main] 論理的なコネクションを取得しました DEBUG 2007-05-16 23:35:41,875 [main] 物理的なコネクションを取得しました DEBUG 2007-05-16 23:35:41,875 [main] 論理的なコネクションを取得しました DEBUG 2007-05-16 23:35:41,875 [main] 論理的なコネクションを閉じました DEBUG 2007-05-16 23:35:42,031 [main] 論理的なコネクションを閉じました DEBUG 2007-05-16 23:35:42,093 [main] SELECT * FROM EMPLOYEE WHERE DEPTNO =20 DEBUG 2007-05-16 23:35:42,093 [main] 論理的なコネクションを取得しました DEBUG 2007-05-16 23:35:42,125 [main] 論理的なコネクションを閉じました jp.fieldnotes.conf.entity.employee@b8f8eb[empno=7369,ename=smith,job=clerk,mgr=7902,hiredate=19 80-12-17 00:00:00.0,sal=800.00,comm=<null>,deptno=20,timestamp=2000-01-01 00:00:00.0] jp.fieldnotes.conf.entity.employee@1f6ba0f[empno=7566,ename=jones,job=manager,mgr=7839,hiredate =1981-04-02 00:00:00.0,sal=2975.00,comm=<null>,deptno=20,timestamp=2000-01-01 00:00:00.0] DEBUG 2007-05-16 23:35:42,156 [main] 物理的なコネクションを閉じました DEBUG 2007-05-16 23:35:42,156 [main] 物理的なコネクションを閉じました 27

テスト テストの重要性は言わずもがな でもDBが絡むテストはテストが難しい テストデータの準備が 環境を担当者ごとに用意するのは 結果の検証が そんなあなたにS2Unit(S2DaoTestCase) 28

S2Unit(S2DaoTestCase) Excel でテストデータ / 期待値を準備してテストできる テスト終了後にテーブルをロールバックするため DB を共有している環境でもテスト可能! public void testgetemployeetx() throws Exception { readxlsallreplacedb("employeedaotest.xls"); Employee result = dao.getemployee(7369); assertbeanequals("7369", readxls("employeedaotest_result.xls"), result); 29

単純なリレーションくらい自動生成してほしいよ N:1 マッピングは自動生成可能です こんなときは トランザクション制御は? Seasar2 のトランザクションの自動制御機能を使って Dao を呼び出すコンポーネントにトランザクションをかけます ID を自動生成しているんですけど Bean の PK に対応するプロパティにアノテーションをつけます (ID アノテーション ) 排他処理 タイムスタンプおよびバージョン番号を使用する楽観的排他をサポートしています 30

S2Dao プラグイン 豊富なサポートツール Dao のメソッドに対応した SQL ファイルを開く 作成する DBFlute Dao/Emtity をスキーマから自動生成 詳しくは 17:00 からのセッションで S2Dao-CodeGen テーブル定義書から Dao/Dto を自動生成 スキーマからの生成もできます そのうち コミッタ募集中! Dolteng Eclipseプロジェクトを作成するEclipseプラグイン Entity/Daoをスキーマから自動生成 31

まとめ :S2Dao: とは XMLレス 実装不要なO/Rマッパー Daoはインターフェースのみ 単純なSQLは自動生成 複雑なSQLは自動手動生成 もっと詳しく https://www.seasar.org/svn/s2container/trunk/se asar2-tutorial/doc/s2dao.ppt 32

質問は Seasar-User メーリングリストまで ご意見 ご質問は https://ml.seasar.org/mailman/listinfo/seasaruser 開発に関する議論は seasar-s2dao-dev メーリングリストまで https://ml.seasar.org/mailman/listinfo/seasars2dao-dev 33

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