<?xml version="1.0" encoding="UTF-8"?> <document> <properties> <title>S2JDBC - ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«</title> </properties> <body> <section name="目次"> <ul> <li> <p> <a href="#セットアップ">セットアップ</a> <ul> <li> <p> <a href="#エンティティã®ç”Ÿæˆ">エンティティã®ç”Ÿæˆ</a> </p> </li> <li> <p> <a href="#エンティティã®ä¿®æ£">エンティティã®ä¿®æ£</a> </p> </li> </ul> </p> </li> <li> <p> <a href="#エンティティ">エンティティ</a> </p> </li> <li> <p> <a href="#複数件検索">複数件検索</a> </p> </li> <li> <p> <a href="#1件検索">1件検索</a> </p> </li> <li> <p> <a href="#イテレーション">イテレーション</a> </p> </li> <li> <p> <a href="#行数å–å¾—">行数å–å¾—</a> </p> </li> <li> <p> <a href="#çµåˆ">çµåˆ</a> </p> </li> <li> <p> <a href="#whereå¥ã®ç°¡æ˜“指定">whereå¥ã®ç°¡æ˜“指定</a> </p> </li> <li> <p> <a href="#ã‚½ãƒ¼ãƒˆé †">ã‚½ãƒ¼ãƒˆé †</a> </p> </li> <li> <p> <a href="#ページング">ページング</a> </p> </li> <li> <p> <a href="#挿入">挿入</a> </p> </li> <li> <p> <a href="#æ›´æ–°">æ›´æ–°</a> </p> </li> <li> <p> <a href="#削除">削除</a> </p> </li> <li> <p> <a href="#SQLã«ã‚ˆã‚‹è¤‡æ•°ä»¶æ¤œç´¢">SQLã«ã‚ˆã‚‹è¤‡æ•°ä»¶æ¤œç´¢</a> </p> </li> <li> <p> <a href="#SQLã«ã‚ˆã‚‹ãƒžãƒƒãƒ—ã§è¿”ã™è¤‡æ•°ä»¶æ¤œç´¢"> SQLã«ã‚ˆã‚‹ãƒžãƒƒãƒ—ã§è¿”ã™è¤‡æ•°ä»¶æ¤œç´¢ </a> </p> </li> <li> <p> <a href="#SQLã«ã‚ˆã‚‹1件検索">SQLã«ã‚ˆã‚‹1件検索</a> </p> </li> <li> <p> <a href="#SQLファイル">SQLファイル</a> </p> </li> <li> <p> <a href="#多態">多態</a> </p> </li> </ul> </section> <section name="セットアップ"> <p> S2JDBC-Tutorial-xxx.zipを解å‡ã—ã€ãã®ä¸ã«ã‚ã‚‹s2jdbc-tutorialã‚’ Eclipseã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¦ãã ã•ã„。 </p> <p> ã“ã®æ™‚点ã§ã¯ã€ã‚³ãƒ³ãƒ‘イルエラーãŒç™ºç”Ÿã—ã¾ã™ãŒå•é¡Œã‚ã‚Šã¾ã›ã‚“。 下ã§èª¬æ˜Žã™ã‚‹ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ã®ç”Ÿæˆã¨ä¿®æ£ã‚’è¡Œã†ã“ã¨ã§ã‚³ãƒ³ãƒ‘イルエラーãŒè§£æ¶ˆã•ã‚Œã¾ã™ã€‚ </p> <p> ã“ã®ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¯ã€HSQLDBを組ã¿è¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ã§ä½¿ç”¨ã—ã¦ã„ã‚‹ã®ã§ã€ èµ·å‹•ãªã©ç‰¹ã«å¿…è¦ã‚ã‚Šã¾ã›ã‚“。 データã®è¿½åŠ や変更をã—ãŸã„å ´åˆã¯ã€src/test/resources/data/test.script ã‚’é©å½“ã«å¤‰æ›´ã—ã¦ãã ã•ã„。 </p> <subsection name="エンティティã®ç”Ÿæˆ"> <p> エンティティã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã¯ã€<a href="s2jdbc_gen/index.html">S2JDBC-Gen</a>を使ã£ã¦ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ä¸Šã®ãƒ†ãƒ¼ãƒ–ル定義ã‹ã‚‰è‡ªå‹•ç”Ÿæˆã—ã¾ã™ã€‚ S2JDBC-Genã®å®Ÿè¡Œã«å¿…è¦ãªjarファイルã¨Antã®ãƒ“ルドファイル(s2jdbc-gen-build.xml)ã¯ã“ã®ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã«å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ </p> <p> プãƒã‚¸ã‚§ã‚¯ãƒˆç›´ä¸‹ã«ã‚ã‚‹s2jdbc-gen-build.xmlã«å®šç¾©ã•ã‚ŒãŸgen-entityターゲットを実行ã—ã¦ãã ã•ã„。 実行方法やãã®éš›ã®æ³¨æ„点ã«ã¤ã„ã¦ã¯ã€<a href="s2jdbc_gen/setup.html#Antタスクã®å®Ÿè¡Œ">Antタスクã®å®Ÿè¡Œ</a>ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 </p> <p> 実行後ã¯ã€F5を押ã™ãªã©ã—ã¦ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã‚’リフレッシュã—ã¦ãã ã•ã„。 src/main/java/examples/entityã®ä¸‹ã«ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ãŒç”Ÿæˆã•ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’確èªã§ãã¾ã™ã€‚ </p> <p> エンティティ以外ã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã‚‚生æˆã•ã‚Œã¾ã™ãŒã€ã“ã®ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã§ã¯ç‰¹ã«è¨€åŠã—ã¾ã›ã‚“。 詳細ã¯S2JDBC-Genã®ãƒ‰ã‚ュメントをå‚ç…§ã—ã¦ãã ã•ã„。 自動生æˆã•ã‚ŒãŸã‚³ãƒ¼ãƒ‰ã¯ã€æ¬¡ã®ã‚¢ãƒŽãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ãŒä»˜ä¸Žã•ã‚Œã¦ã„ã‚‹ã‹ã©ã†ã‹ã§è¦‹åˆ†ã‘られã¾ã™ã€‚ </p> <source><![CDATA[ @Generated(value = {"S2JDBC-Gen 2.4.35", "org.seasar.extension.jdbc.gen.internal.model.EntityModelFactoryImpl"}, date = "2009/04/02 14:21:20") ]]></source> <p> @Generated ã¯è‡ªå‹•ç”Ÿæˆã•ã‚ŒãŸã“ã¨ã‚’示ã™ã‚¢ãƒŽãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ã§ã™ã€‚ </p> </subsection> <subsection name="エンティティã®ä¿®æ£"> <p> エンティティクラスを生æˆã—ã¦ã‚‚ã¾ã コンパイルã¯æˆåŠŸã—ã¾ã›ã‚“。 次ã®ä¿®æ£ã‚’è¡Œã£ã¦ãã ã•ã„。 </p> <p> src/main/java/examples/entity/Employee.javaã‚’é–‹ãã€jobTypeプãƒãƒ‘ティã®åž‹ã‚’Integerã‹ã‚‰JobTypeã«å¤‰æ›´ã—ã¾ã™ã€‚ JobTypeã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã¯src/main/java/examples/entity/JobType.javaã«ã‚らã‹ã˜ã‚用æ„ã•ã‚Œã¦ã„ã¾ã™ã€‚ </p> <source><![CDATA[ public JobType jobType; ]]></source> <p> ã“ã®ä¿®æ£ã‚’è¡Œã†ã“ã¨ã§ã‚³ãƒ³ãƒ‘イルãŒæˆåŠŸã—ã¾ã™ã€‚ 以上ã§ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—ã¯å®Œäº†ã§ã™ã€‚ </p> </subsection> </section> <section name="エンティティ"> <p> テーブルã®ãƒ‡ãƒ¼ã‚¿ã¨Javaã®ã‚ªãƒ–ジェクトã®ãƒžãƒƒãƒ”ングã¯ã€ エンティティã«å¯¾ã—ã¦ã‚¢ãƒŽãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ã§æŒ‡å®šã—ã¾ã™ã€‚ エンティティã¨ã„ã†ã®ã¯ã€ãƒ†ãƒ¼ãƒ–ルã®1è¡Œã«å¯¾å¿œã™ã‚‹Javaã®ã‚ªãƒ–ジェクトã 㨠ç†è§£ã—ã¦ã„ã‚Œã°è‰¯ã„ã§ã—ょã†ã€‚ </p> <p> ãã‚Œã§ã¯ã€Employeeエンティティを見ã¦ã¿ã¾ã—ょã†ã€‚ src/main/java/examples/entity/Employee.javaã‚’é–‹ã„ã¦ãã ã•ã„。 </p> <source><![CDATA[ package examples.entity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.ManyToOne; import javax.persistence.OneToOne; import javax.persistence.Version; /** * Employeeエンティティクラス * * @author S2JDBC-Gen */ @Entity public class Employee { /** idプãƒãƒ‘ティ */ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(nullable = false, unique = true) public Integer id; /** nameプãƒãƒ‘ティ */ @Column(length = 255, nullable = false, unique = false) public String name; /** jobTypeプãƒãƒ‘ティ */ @Column(nullable = false, unique = false) public Integer jobType; /** salaryプãƒãƒ‘ティ */ @Column(nullable = true, unique = false) public Integer salary; /** departmentIdプãƒãƒ‘ティ */ @Column(nullable = true, unique = false) public Integer departmentId; /** addressIdプãƒãƒ‘ティ */ @Column(nullable = true, unique = true) public Integer addressId; /** versionプãƒãƒ‘ティ */ @Version @Column(nullable = false, unique = false) public Integer version; /** address関連プãƒãƒ‘ティ */ @OneToOne public Address address; /** department関連プãƒãƒ‘ティ */ @ManyToOne public Department department; } ]]></source> <p> エンティティã§ã‚ã‚‹ã“ã¨ã‚’示ã™ã«ã¯ã€@EntityãŒå¿…è¦ã§ã™ã€‚ 詳ã—ãã¯ã€ <a href="s2jdbc_entity.html#エンティティ定義">エンティティ定義</a> ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 </p> <p> è˜åˆ¥åã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã«ã¯ã€@Idã‚’ã¤ã‘ã¾ã™ã€‚ è˜åˆ¥åã‚’Seasar2ã«è‡ªå‹•ç”Ÿæˆã•ã›ã‚‹å ´åˆã¯ã€@GeneratedValueã‚’ã¤ã‘ã¾ã™ã€‚ 詳ã—ãã¯ã€ <a href="s2jdbc_entity.html#è˜åˆ¥å定義">è˜åˆ¥å定義</a> ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 </p> <p> Seasar2ã§ã¯ã€publicフィールドを使ã£ã¦ã‚·ãƒ³ãƒ—ルã«ãƒ—ãƒãƒ‘ティを定義ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ 詳ã—ãã¯ã€ <a href="s2jdbc_abstract.html#シンプルãªãƒ—ãƒãƒ‘ティ">シンプルãªãƒ—ãƒãƒ‘ティ</a> ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 </p> <p> カラムåã¨ãƒ—ãƒãƒ‘ティåãŒåŒã˜ãªã‚‰ã€ã‚«ãƒ©ãƒ 用ã®ã‚¢ãƒŽãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ã¯ç‰¹ã«å¿…è¦ã‚ã‚Šã¾ã›ã‚“。 ã¾ãŸã€AAA_BBBã®ã‚ˆã†ãªã‚«ãƒ©ãƒ å用ã®'_'記法を〠aaaBbbã®ã‚ˆã†ãªãƒ—ãƒãƒ‘ティå用ã®ã‚ャメル記法ã¸å¤‰æ›ã™ã‚‹ã“ã¨ã‚‚ Seasar2ã«ã‚ˆã£ã¦è‡ªå‹•çš„ã«è¡Œã‚れるã®ã§ã€ アノテーションを指定ã™ã‚‹å¿…è¦ã¯ã‚ã‚Šã¾ã›ã‚“。 詳ã—ãã¯ã€ <a href="s2jdbc_entity.html#カラム定義">カラム定義</a> ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 </p> <p> JobTypeã¯æ¬¡ã®ã‚ˆã†ãªåˆ—挙型ã§ã™ã€‚ 実際ã®ã‚½ãƒ¼ã‚¹ã§ã¯ã‚‚ã†å°‘ã—複雑ã§ã™ãŒã€ ã‚ã‹ã‚Šã‚„ã™ãã™ã‚‹ãŸã‚ã«ä»Šå›žã¯ç°¡ç•¥åŒ–ã—ã¦ã„ã¾ã™ã€‚ </p> <source><![CDATA[ package examples.entity; public enum JobType { CLERK, SALESMAN, MANAGER, ANALYST, PRESIDENT; } ]]></source> <p> job_typeカラムを文å—列ã§å®šç¾©ã—ã¦ãŠã‘ã°ã€ カラムã«ã¯ã€'CLERK'ã®ã‚ˆã†ã«æ–‡å—列ã¨ã—ã¦æ ¼ç´ã•ã‚Œã€ エンティティã§ã¯ã€åˆ—挙型ã«è‡ªå‹•çš„ã«ãƒžãƒƒãƒ”ングã•ã‚Œã¾ã™ã€‚ </p> <p>Employeeã¨Departmentã«ã¯ã€å¤šå¯¾ä¸€ã®é–¢é€£ãŒã‚ã‚Šã€æ¬¡ã®ã‚ˆã†ã«å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ã€‚</p> <source><![CDATA[ @ManyToOne public Department department; ]]></source> <p> 逆ã®ç«‹å ´ã‹ã‚‰è¦‹ã‚‹ã¨ã€Departmentã¨Employeeã¯ä¸€å¯¾å¤šã®é–¢é€£ãŒã‚り〠次ã®ã‚ˆã†ã«å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ã€‚ </p>    <source><![CDATA[ @OneToMany(mappedBy = "department") public List<Employee> employeeList; ]]></source> <p> mappedBy属性ã«ã‚ˆã£ã¦é–¢é€£ã®æ‰€æœ‰è€…å´ã®ãƒ—ãƒãƒ‘ティを指定ã—ã¾ã™ã€‚ 関連ã®æ‰€æœ‰è€…å´ã¨ã¯ã€å¤–部ã‚ーをæŒã£ã¦ã„ã‚‹ã»ã†ã‚’æ„味ã—ã¾ã™ã€‚ 今回ã®ã‚±ãƒ¼ã‚¹ã¯ã€department_idã¨ã„ã†å¤–部ã‚ー(プãƒãƒ‘ティåã¯departmentId)ã‚’Employee㌠æŒã£ã¦ã„ã‚‹ã®ã§EmployeeãŒé–¢é€£ã®æ‰€æœ‰è€…ã«ãªã‚Šã¾ã™ã€‚ mappedBy属性ã«ã‚ˆã£ã¦ã€åŒæ–¹ã®é–¢é€£ãŒãƒªãƒ³ã‚¯ã•ã‚Œã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚ </p> <p>Employeeã¨Addressã«ã¯ã€ä¸€å¯¾ä¸€ã®é–¢é€£ãŒã‚ã‚Šã€æ¬¡ã®ã‚ˆã†ã«å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ã€‚</p> <source><![CDATA[ @OneToOne public Address address; ]]></source> <p>逆ã®ç«‹å ´ã‹ã‚‰è¦‹ã¦ã‚‚ã€Addressã¨Employeeã¯ä¸€å¯¾ä¸€ã®é–¢é€£ãŒã‚り〠次ã®ã‚ˆã†ã«å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ã€‚</p>    <source><![CDATA[ @OneToOne(mappedBy = "address") public Employee employee; ]]></source> <p> mappedBy属性ã«ã‚ˆã£ã¦é–¢é€£ã®æ‰€æœ‰è€…å´ã®ãƒ—ãƒãƒ‘ティを指定ã—ã¾ã™ã€‚ 関連ã®æ‰€æœ‰è€…å´ã¨ã¯ã€å¤–部ã‚ーをæŒã£ã¦ã„ã‚‹ã»ã†ã‚’æ„味ã—ã¾ã™ã€‚ 今回ã®ã‚±ãƒ¼ã‚¹ã¯ã€address_idã¨ã„ã†å¤–部ã‚ー(プãƒãƒ‘ティåã¯addressId)ã‚’Employee㌠æŒã£ã¦ã„ã‚‹ã®ã§EmployeeãŒé–¢é€£ã®æ‰€æœ‰è€…ã«ãªã‚Šã¾ã™ã€‚ mappedBy属性ã«ã‚ˆã£ã¦ã€åŒæ–¹ã®é–¢é€£ãŒãƒªãƒ³ã‚¯ã•ã‚Œã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚ </p> <p> 詳ã—ãã¯ã€ <a href="s2jdbc_entity.html#関連定義">関連定義</a> ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 </p> <p> 楽観的排他制御をã™ã‚‹ã«ã¯ã€int, long, Integer, Longã®åž‹ã‚’æŒã¤ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã« @Versionã‚’ã¤ã‘ã¾ã™ã€‚ 詳ã—ãã¯ã€ <a href="s2jdbc_entity.html#ãƒãƒ¼ã‚¸ãƒ§ãƒ³å®šç¾©">ãƒãƒ¼ã‚¸ãƒ§ãƒ³å®šç¾©</a> ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 </p> <p>ã“ã‚Œã§ã€ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ã®åŸºæœ¬çš„ãªèª¬æ˜Žã¯çµ‚ã‚ã‚Šã¾ã—ãŸã€‚ ãã‚Œã§ã¯ã€æ—©é€Ÿå‹•ã‹ã—ã¦ã¿ã¾ã—ょã†ã€‚</p> </section> <section name="複数件検索"> <p>Seasar2ã®æ©Ÿèƒ½ã‚’ã„ã‚ã„ã‚試ã—ã¦ã¿ã‚‹ã«ã¯ã€ S2TestCaseを継承ã—ãŸã‚¯ãƒ©ã‚¹ã‚’使ã†ã¨ä¾¿åˆ©ã§ã™ã€‚</p> <p> src/test/java/examples/GetResultListTest.java を見ã¦ã¿ã¾ã—ょã†ã€‚ </p> <source><![CDATA[ package examples.entity; import java.util.List; import org.seasar.extension.jdbc.JdbcManager; import org.seasar.extension.unit.S2TestCase; public class GetResultListTest extends S2TestCase { private JdbcManager jdbcManager; protected void setUp() throws Exception { include("app.dicon"); } public void testGetResultList() throws Exception { ... } } ]]></source> <p> setUp()ã§app.diconã‚’èªã¿è¾¼ã¿ã€JdbcManagerã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã‚’定義ã—ã¦ãŠã‘ã°ã€ testXxx()ã®ä¸ã§ã€JdbcManagerを使ã†ã“ã¨ãŒã§ãã¾ã™ã€‚ ã“ã®JdbcManagerを使ã£ã¦ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¾ã™ã€‚ </p> <p> 複数件検索を行ã†ã«ã¯ã€from()ã®å¼•æ•°ã«æ¤œç´¢ã—ãŸã„エンティティã®ã‚¯ãƒ©ã‚¹ã‚’指定ã—〠getResultList()を呼ã³å‡ºã—ã¾ã™ã€‚ ã“ã®ãƒ†ã‚¹ãƒˆã‚±ãƒ¼ã‚¹ã‚’実行ã™ã‚‹ã«ã¯ã€ã‚½ãƒ¼ã‚¹ã‚’å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€ Run As -> JUnit Testã‚’é¸ã³ã¾ã™ã€‚ </p> <source><![CDATA[ List<Employee> results = jdbcManager.from(Employee.class).getResultList(); for (Employee e : results) { System.out.println(e.name); } ]]></source> <p> 詳ã—ãã¯ã€ <a href="s2jdbc_manager_auto.html#複数件検索">複数件検索</a> ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 </p> </section> <section name="1件検索"> <p> 1件検索を行ã†ã«ã¯ã€from()ã®å¼•æ•°ã«æ¤œç´¢ã—ãŸã„エンティティã®ã‚¯ãƒ©ã‚¹ã‚’指定ã—〠getSingleResult()を呼ã³å‡ºã—ã¾ã™ã€‚ </p> <p> src/test/java/examples/GetSingleResultTest.java を見ã¦ã¿ã¾ã—ょã†ã€‚ </p> <source><![CDATA[ Employee result = jdbcManager .from(Employee.class) .where("id = ?", 1) .getSingleResult(); System.out.println(result.name); ]]></source> <p> where()ã§æ¡ä»¶ã‚’指定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ SQLã§ã§ãã‚‹ã“ã¨ã¯ã™ã¹ã¦æŒ‡å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ SQLã¨ã®é•ã„ã¯ã€ã‚«ãƒ©ãƒ åã®ã‹ã‚ã‚Šã«ãƒ—ãƒãƒ‘ティåを指定ã™ã‚‹ã“ã¨ã§ã™ã€‚ </p> <p>where()ã®2番目以é™ã®å¼•æ•°ã¯ã€å¯å¤‰é•·å¼•æ•°ã«ãªã£ã¦ã„ã¾ã™ã€‚ 例ãˆã°ã€æ¬¡ã®ã‚ˆã†ã«è¤‡æ•°æŒ‡å®šã§ãã¾ã™ã€‚</p> <source><![CDATA[ where("id = ? or name = ?", 1, "SCOTT") ]]></source> <p> 詳ã—ãã¯ã€ <a href="s2jdbc_manager_auto.html#1件検索">1件検索</a> 㨠<a href="s2jdbc_manager_auto.html#検索æ¡ä»¶">検索æ¡ä»¶</a> ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 </p> </section> <section name="イテレーション"> <p> <code>getResultList()</code> を使ã†ã¨ã€æ¤œç´¢çµæžœã‚’å…¨ã¦å«ã‚€ãƒªã‚¹ãƒˆãŒè¿”ã•ã‚Œã¾ã™ã€‚ ã“ã®ãŸã‚ã€æ¤œç´¢çµæžœãŒè†¨å¤§ãªå ´åˆã¯å¤§é‡ã®ãƒ¡ãƒ¢ãƒªã‚’消費ã—ã¦ã—ã¾ã„ã¾ã™ï¼Ž </p> <p>ã“ã®ã‚ˆã†ãªå ´åˆã¯ã€ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£1件ã”ã¨ã«ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã•ã‚Œã‚‹ã‚¤ãƒ†ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’使ã†ã¨åŠ¹æžœçš„ã§ã™ã€‚</p> <p> src/test/java/examples/IterateTest.java を見ã¦ã¿ã¾ã—ょã†ã€‚ </p> <source><![CDATA[ public void testIterate() throws Exception { long sum = jdbcManager.from(Employee.class).iterate( new IterationCallback<Employee, Long>() { private long sum; public Long iterate(Employee emp, IterationContext context) { sum += emp.salary; return sum; } }); System.out.println(sum); } ]]></source> <p> ã“ã®ä¾‹ã§ã¯ã€å…¨å¾“æ¥å“¡ã®çµ¦ä¸Žã®åˆè¨ˆã‚’求ã‚ã¦ã„ã¾ã™ã€‚ エンティティ1件ã”ã¨ã«åŒ¿åクラス㮠<code>iterate()</code> メソッドãŒã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã•ã‚Œã€ ãã®ä¸ã§çµ¦ä¸Žã®ç´¯è¨ˆã‚’求ã‚ã¦ãã®æ™‚点ã®ç´¯è¨ˆã‚’戻り値ã¨ã—ã¦ã„ã¾ã™ã€‚ イテレーションã®æœ€å¾Œã®æˆ»ã‚Šå€¤ãŒå…¨ä½“ã®æˆ»ã‚Šå€¤ã¨ãªã‚Šã¾ã™ã€‚ </p> <p>イテレーションを途ä¸ã§æ‰“ã¡åˆ‡ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚</p> <source><![CDATA[ public void testIterateExit() throws Exception { Employee emp = jdbcManager.from(Employee.class).iterate( new IterationCallback<Employee, Employee>() { private long sum; public Employee iterate(Employee emp, IterationContext context) { sum += emp.salary; if (sum > 10000) { context.setExit(true); } return emp; } }); System.out.println(emp.name); } ]]></source> <p> ã“ã®ä¾‹ã§ã¯ã€å¾“æ¥å“¡ã®çµ¦ä¸Žã®åˆè¨ˆãŒ10000を越ãˆã‚‹ã¨ <code>IterationContext</code> ã® <code>setExit()</code> を呼ã³å‡ºã—ã™ã“ã¨ã§ã€ イテレーションを終了ã—ã¾ã™ã€‚ イテレーションã®æœ€å¾Œã®æˆ»ã‚Šå€¤ãŒå…¨ä½“ã®æˆ»ã‚Šå€¤ã¨ãªã‚Šã¾ã™ã€‚ </p> <p> 詳ã—ãã¯ã€ <a href="s2jdbc_manager_auto.html#イテレーションã«ã‚ˆã‚‹æ¤œç´¢"> イテレーションã«ã‚ˆã‚‹æ¤œç´¢ </a> ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 </p> </section> <section name="行数å–å¾—"> <p> 検索çµæžœã®è¡Œæ•°ã‚’ <code>select count(*)</code> ã§å–å¾—ã™ã‚‹ã«ã¯ã€from()ã®å¼•æ•°ã«æ¤œç´¢ã—ãŸã„エンティティã®ã‚¯ãƒ©ã‚¹ã‚’指定ã—〠getCount()を呼ã³å‡ºã—ã¾ã™ã€‚ </p> <p> src/test/java/examples/GetCountTest.java を見ã¦ã¿ã¾ã—ょã†ã€‚ </p> <source><![CDATA[ public void testGetCount() throws Exception { long count = jdbcManager.from(Employee.class).getCount(); System.out.println(count); } ]]></source> <p> 詳ã—ãã¯ã€ <a href="s2jdbc_manager_auto.html#検索çµæžœã®è¡Œæ•°å–å¾—"> 検索çµæžœã®è¡Œæ•°å–å¾— </a> ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 </p> </section> <section name="çµåˆ"> <p> ä»–ã®ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ã¨çµåˆã™ã‚‹ã«ã¯ã€ innerJoin()ã¾ãŸã¯leftOuterJoin()ã®å¼•æ•°ã« <b>関連ã®ãƒ—ãƒãƒ‘ティå</b> を指定ã—ã¾ã™ã€‚ エンティティåã§ã¯ãªã„ã®ã§æ³¨æ„ã—ã¦ãã ã•ã„。 </p> <p>src/test/java/examples/JoinTest.java を見ã¦ã¿ã¾ã—ょã†ã€‚</p> <source><![CDATA[ List<Employee> results = jdbcManager .from(Employee.class) .leftOuterJoin("department") .leftOuterJoin("address") .getResultList(); for (Employee e : results) { System.out.println(e.name + ", " + e.department.name + ", " + e.address.name); } ]]></source> <p> çµåˆã—ãŸé–¢é€£ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ã®ãƒ—ãƒãƒ‘ティã¯ã€çµåˆå.プãƒãƒ‘ティå(例ãˆã°address.name)ã§æŒ‡å®šã—ã¾ã™ã€‚ ãƒã‚¹ãƒˆã—ãŸæŒ‡å®š(aaa.bbb.ccc)ã‚‚å¯èƒ½ã§ã™ã€‚ ãƒã‚¹ãƒˆã—ãŸæŒ‡å®šã‚’ã™ã‚‹å ´åˆã¯ã€å¿…ãšinnerJoin()/leftOuterJoin()ã§æŒ‡å®šã—ã¦ãŠãå¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ 例ãˆã°ã€aaa.bbb.cccã®ãƒ—ãƒãƒ‘ティを指定ã™ã‚‹ã«ã¯ã€leftOuterJoin("aaa.bbb")を指定ã—ã¾ã™ã€‚ </p> <p> 詳ã—ãã¯ã€ <a href="s2jdbc_manager_auto.html#çµåˆ">çµåˆ</a> ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 </p> </section> <section name="whereå¥ã®ç°¡æ˜“指定"> <p> whereå¥ã‚’æ–‡å—列ã§çµ„ã¿ç«‹ã¦ã‚‹å ´åˆã€ æ¡ä»¶ãŒæŒ‡å®šã•ã‚Œãªã‹ã£ãŸã‚‰whereå¥ã‹ã‚‰ã¯ãšã—ãŸã‚Šã€ 最åˆã®æ¡ä»¶ã«ã¯andã‚’ã¤ã‘ãªã„ã‘ã©2番åã®æ¡ä»¶ã‹ã‚‰ã¯andã‚’ã¤ã‘ãŸã‚Šãªã©ã€ ã„ã‚ã„ã‚ãªã“ã¨ã‚’考慮ã—ãªãŒã‚‰æ–‡å—列を組ã¿ç«‹ã¦ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ </p> <p>ã“れらã®é¢å€’ãªå‡¦ç†ã‚’簡易ã«è¡Œãˆã‚‹ã‚ˆã†ã«ã—ãŸã®ãŒSimpleWhereã§ã™ã€‚</p> <p> src/test/java/examples/SimpleWhereTest.java を見ã¦ã¿ã¾ã—ょã†ã€‚ </p> <source><![CDATA[ List<Employee> results = jdbcManager .from(Employee.class) .leftOuterJoin("address") .where( new SimpleWhere().starts("name", "A").ends( "address.name", "1")) .getResultList(); for (Employee e : results) { System.out.println(e.name + ", " + e.address.name); } ]]></source> <p> starts()ã®æœ€åˆã®å¼•æ•°ã¯ãƒ—ãƒãƒ‘ティåã§ã€like '?%'ã«å¤‰æ›ã•ã‚Œã¾ã™ã€‚ ends()ã®æœ€åˆã®å¼•æ•°ã¯ãƒ—ãƒãƒ‘ティåã§ã€like '%?'ã«å¤‰æ›ã•ã‚Œã¾ã™ã€‚ ãã‚Œãžã‚Œã®æ¡ä»¶ã¯ã€andã§çµåˆã•ã‚Œã¾ã™ã€‚ 上記ã®ã‚µãƒ³ãƒ—ルã§ã¯ã€"A"ã‚„"1"ã®ã‚ˆã†ã«ç›´æŽ¥ãƒªãƒ†ãƒ©ãƒ«ã‚’渡ã—ã¦ã„ã¾ã™ãŒã€ 変数を渡ã—ãŸå ´åˆã€å¤‰æ•°ãŒnullã®å ´åˆã¯ã€æ¡ä»¶ã«å«ã¾ã‚Œãªããªã‚Šã¾ã™ã€‚ </p> <p> 詳ã—ãã¯ã€ <a href="s2jdbc_manager_auto.html#検索æ¡ä»¶">検索æ¡ä»¶</a> ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 </p> </section> <section name="ã‚½ãƒ¼ãƒˆé †"> <p> orderBy()ã§ã‚½ãƒ¼ãƒˆé †ã‚’指定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ SQLã§ã§ãã‚‹ã“ã¨ã¯ã™ã¹ã¦æŒ‡å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ SQLã¨ã®é•ã„ã¯ã€ã‚«ãƒ©ãƒ åã®ã‹ã‚ã‚Šã«ãƒ—ãƒãƒ‘ティåを指定ã™ã‚‹ã“ã¨ã§ã™ã€‚ </p> <p> src/test/java/examples/OrderByTest.java を見ã¦ã¿ã¾ã—ょã†ã€‚ </p> <source><![CDATA[ List<Employee> results = jdbcManager .from(Employee.class) .orderBy("name desc") .getResultList(); for (Employee e : results) { System.out.println(e.name); } ]]></source> <p> 詳ã—ãã¯ã€ <a href="s2jdbc_manager_auto.html#ã‚½ãƒ¼ãƒˆé †">ã‚½ãƒ¼ãƒˆé †</a> ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 </p> </section> <section name="ページング"> <p> ページングを指定ã™ã‚‹å ´åˆã¯ã€ limit(), offset()を使ã„ã¾ã™ã€‚ limit()ã«ã¯ã€å–å¾—ã™ã‚‹è¡Œæ•°ã‚’指定ã—ã¾ã™ã€‚ offset()ã«ã¯ã€æœ€åˆã«å–å¾—ã™ã‚‹è¡Œã®ä½ç½®ã‚’指定ã—ã¾ã™ã€‚ 最åˆã®è¡Œã®ä½ç½®ã¯0ã«ãªã‚Šã¾ã™ã€‚ ページングを指定ã™ã‚‹ã«ã¯ã€å¿…ãš <a href="s2jdbc_manager_auto.html#ã‚½ãƒ¼ãƒˆé †">ã‚½ãƒ¼ãƒˆé †</a> ã®æŒ‡å®šã‚‚å¿…è¦ã§ã™ã€‚ </p> <p> src/test/java/examples/PagingTest.java を見ã¦ã¿ã¾ã—ょã†ã€‚ </p> <source><![CDATA[ List<Employee> results = jdbcManager .from(Employee.class) .orderBy("id") .limit(5) .offset(4) .getResultList(); for (Employee e : results) { System.out.println(e.id); } ]]></source> <p> 詳ã—ãã¯ã€ <a href="s2jdbc_manager_auto.html#ページング">ページング</a> ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 </p> </section> <section name="挿入"> <p>エンティティを挿入ã™ã‚‹ã«ã¯ã€ insert()ã¨execute()を組ã¿åˆã‚ã›ã¾ã™ã€‚</p> <p> src/test/java/examples/InsertTest.java を見ã¦ã¿ã¾ã—ょã†ã€‚ </p> <source><![CDATA[ public void testInsertTx() throws Exception { Employee emp = new Employee(); emp.name = "test"; emp.jobType = JobType.ANALYST; emp.salary = 300; jdbcManager.insert(emp).execute(); System.out.println(emp.id); } ]]></source> <p> テストメソッドãŒTxã§çµ‚ã‚ã£ã¦ã„ã‚‹ã¨ã€ãƒ†ã‚¹ãƒˆæ™‚実行å‰ã«ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ãŒé–‹å§‹ã•ã‚Œã€ テスト終了後ã«è‡ªå‹•çš„ã«ãƒãƒ¼ãƒ«ãƒãƒƒã‚¯ã•ã‚Œã¾ã™ã€‚ ãã®ãŸã‚ã€ä½•åº¦ã§ã‚‚åŒã˜ãƒ†ã‚¹ãƒˆã‚’ç¹°ã‚Šè¿”ã™ã“ã¨ãŒã§ãã¾ã™ã€‚ </p> <p>è˜åˆ¥åã¯@GeneratedValueãŒæŒ‡å®šã•ã‚Œã¦ã„ã‚‹ã®ã§è‡ªå‹•çš„ã«è¨å®šã•ã‚Œã¾ã™ã€‚</p> <p> 詳ã—ãã¯ã€ <a href="s2jdbc_manager_auto.html#挿入">挿入</a> ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 </p> </section> <section name="æ›´æ–°"> <p>エンティティを更新ã™ã‚‹ã«ã¯ã€ update()ã¨execute()を組ã¿åˆã‚ã›ã¾ã™ã€‚</p> <p> src/test/java/examples/UpdateTest.java を見ã¦ã¿ã¾ã—ょã†ã€‚ </p> <source><![CDATA[ Employee emp = jdbcManager .from(Employee.class) .where("id = ?", 1) .getSingleResult(); emp.name = "hoge"; System.out.println(emp.version); jdbcManager.update(emp).execute(); System.out.println(emp.version); ]]></source> <p> versionプãƒãƒ‘ティã«ã¯ã€@VersionãŒæŒ‡å®šã•ã‚Œã¦ã„ã‚‹ã®ã§ã€ Seasar2ã«ã‚ˆã‚‹æ¥½è¦³çš„排他制御ãŒè¡Œãªã‚ã‚Œã¦ã€ æ›´æ–°ã«æˆåŠŸã™ã‚‹ã¨versionã®å€¤ãŒã‚¤ãƒ³ã‚¯ãƒªãƒ¡ãƒ³ãƒˆã•ã‚Œã¾ã™ã€‚ </p> <p> 詳ã—ãã¯ã€ <a href="s2jdbc_manager_auto.html#æ›´æ–°">æ›´æ–°</a> ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 </p> </section> <section name="削除"> <p>エンティティを削除ã™ã‚‹ã«ã¯ã€ delete()ã¨execute()を組ã¿åˆã‚ã›ã¾ã™ã€‚</p> <p> src/test/java/examples/DeleteTest.java を見ã¦ã¿ã¾ã—ょã†ã€‚ </p> <source><![CDATA[ Employee emp = jdbcManager .from(Employee.class) .where("id = ?", 1) .getSingleResult(); jdbcManager.delete(emp).execute(); emp = jdbcManager .from(Employee.class) .where("id = ?", 1) .getSingleResult(); System.out.println(emp); ]]></source> <p> 詳ã—ãã¯ã€ <a href="s2jdbc_manager_auto.html#削除">削除</a> ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 </p> </section> <section name="SQLã«ã‚ˆã‚‹è¤‡æ•°ä»¶æ¤œç´¢"> <p> SQLã®è‡ªå‹•ç”Ÿæˆã¯ä¾¿åˆ©ãªæ©Ÿèƒ½ã§ã™ãŒã€ SQLを自分ã§æ›¸ããŸã„ã“ã¨ã‚‚ã‚ã‚‹ã§ã—ょã†ã€‚ SQLを使ã£ã¦è¤‡æ•°ä»¶æ¤œç´¢ã™ã‚‹ã«ã¯ã€ selectBySql()ã¨getResultList()を組ã¿åˆã‚ã›ã¾ã™ã€‚ </p> <p> src/test/java/examples/SqlGetResultListTest.java を見ã¦ã¿ã¾ã—ょã†ã€‚ </p> <source><![CDATA[ private static final String SELECT_EMPLOYEE_DTO = "select e.*, d.name as department_name" + " from employee e left outer join department d" + " on e.department_id = d.id" + " where d.id = ?"; ... List<EmployeeDto> results = jdbcManager .selectBySql(EmployeeDto.class, SELECT_EMPLOYEE_DTO, 1) .getResultList(); for (EmployeeDto e : results) { System.out.println(e.name + " " + e.departmentName); } ]]></source> <p> selectBySql()ã®æœ€åˆã®å¼•æ•°ã¯ã€çµæžœã‚’å—ã‘å–ã‚‹JavaBeansã§ã™ã€‚ çµæžœã‚»ãƒƒãƒˆã®ã‚«ãƒ©ãƒ åã¨JavaBeansã®ãƒ—ãƒãƒ‘ティåã‚’ ã‚ã‚ã›ã¦ãŠã‘ã°è‡ªå‹•çš„ã«ãƒžãƒƒãƒ”ングã•ã‚Œã¾ã™ã€‚ AAA_BBBã®ã‚ˆã†ãª'_'記法ã¨aaaBbbã®ã‚ˆã†ãªã‚ャメル記法㮠マッピングも自動的ã«è¡Œãªã‚ã‚Œã¾ã™ã€‚ </p> <p> selectBySql()ã®3番目以é™ã®å¼•æ•°ã¯ã€å¯å¤‰é•·å¼•æ•°ã«ãªã£ã¦ã„ã¾ã™ã€‚ 例ãˆã°ã€æ¬¡ã®ã‚ˆã†ã«è¤‡æ•°æŒ‡å®šã§ãã¾ã™ã€‚ </p> <source><![CDATA[ selectBySql(EmployeeDto.class, "... id = ? or name = ?", 1, "SCOTT") ]]></source> <p> 詳ã—ãã¯ã€ <a href="s2jdbc_manager_sql.html#複数件検索">SQLã«ã‚ˆã‚‹è¤‡æ•°ä»¶æ¤œç´¢</a> ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 </p> </section> <section name="SQLã«ã‚ˆã‚‹ãƒžãƒƒãƒ—ã§è¿”ã™è¤‡æ•°ä»¶æ¤œç´¢"> <p> SQLを使ã£ã¦çµæžœã‚’マップã§è¿”ã™ã«ã¯ã€ selectBySql()ã®æœ€åˆã®å¼•æ•°ã‚’BeanMap.classã«ã—ã¾ã™ã€‚ BeanMapã¯Map<String, Object>ãªã‚¯ãƒ©ã‚¹ã§ã€ å˜åœ¨ã—ãªã„ã‚ーã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã¨ 例外ãŒç™ºç”Ÿã—ã¾ã™ã€‚ ã‚ーã®å€¤ã¯ã€AAA_BBBã®ã‚ˆã†ãª'_'記法ã®å€¤ã‚’ã‚’aaaBbbã®ã‚ˆã†ãªã‚ャメル記法㫠変æ›ã—ãŸã‚‚ã®ã§ã™ã€‚ </p> <p> src/test/java/examples/SqlMapTest.java を見ã¦ã¿ã¾ã—ょã†ã€‚ </p> <source><![CDATA[ private static final String LABEL_VALUE = "select name as label, id as value from employee"; ... List<BeanMap> results = jdbcManager.selectBySql(BeanMap.class, LABEL_VALUE).getResultList(); for (BeanMap m : results) { System.out.println(m); } ]]></source> <p> 詳ã—ãã¯ã€ <a href="s2jdbc_manager_sql.html#複数件検索">SQLã«ã‚ˆã‚‹è¤‡æ•°ä»¶æ¤œç´¢</a> ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 </p> </section> <section name="SQLã«ã‚ˆã‚‹1件検索"> <p> SQLを使ã£ã¦1件検索ã™ã‚‹ã«ã¯ã€ selectBySql()ã¨getSingleResult()を組ã¿åˆã‚ã›ã¾ã™ã€‚ </p> <p> src/test/java/examples/SqlGetSingleResultTest.java を見ã¦ã¿ã¾ã—ょã†ã€‚ </p> <source><![CDATA[ private static final String SELECT_COUNT = "select count(*) from employee"; ... Integer result = jdbcManager .selectBySql(Integer.class, SELECT_COUNT) .getSingleResult(); System.out.println(result); ]]></source> <p> selectリストãŒ1ã¤ã ã‘ã®å ´åˆã¯ã€ selectBySql()ã®æœ€åˆã®å¼•æ•°ã«ã€ JavaBeansã§ã¯ãªãã€Integer.classã‚„String.class ãªã©ã®ã‚«ãƒ©ãƒ ã®åž‹ã«å¿œã˜ãŸã‚¯ãƒ©ã‚¹ã‚’指定ã—ã¾ã™ã€‚ </p> <p> 詳ã—ãã¯ã€ <a href="s2jdbc_manager_sql.html#1件検索">SQLã«ã‚ˆã‚‹1件検索</a> ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 </p> </section> <section name="SQLファイル"> <p> 複雑ã§é•·ã„SQLæ–‡ã¯ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã«ç›´æŽ¥è¨˜è¿°ã™ã‚‹ã‚ˆã‚Šã‚‚〠ファイルã«æ›¸ã„ãŸã»ã†ãŒãƒ¡ãƒ³ãƒ†ãƒŠãƒ³ã‚¹ãŒã—ã‚„ã™ããªã‚Šã¾ã™ã€‚ </p> <p> SQLファイルã¯ã€ã‚¯ãƒ©ã‚¹ãƒ‘ス上ã«ã‚ã‚‹ãªã‚‰ã©ã“ã«ãŠã„ã¦ã‚‚ã‹ã¾ã„ã¾ã›ã‚“ãŒã€ ルートパッケージ.sql.テーブルå ã®ãƒ‘ッケージã«å¯¾å¿œã—ãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªé…下ã«ç½®ãã“ã¨ã‚’推奨ã—ã¾ã™ã€‚ 例ãˆã°ã€ employeeテーブルã«é–¢ã™ã‚‹SQLファイルã¯ã€ examples/sql/employeeディレクトリã«ãŠãã¨è‰¯ã„ã§ã—ょã†ã€‚ </p> <p>何ã®ãƒ‘ラメータもãªã„å˜ç´”ãªSQLファイルã¯æ¬¡ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚</p> <source><![CDATA[ select * from employee where salary >= 1000 and salary <= 2000 ]]></source> <p> 1000ã®éƒ¨åˆ†ã‚’salaryMin ã¨ã„ã†ãƒ‘ラメータã§ç½®ãæ›ãˆã‚‹ã«ã¯ã€ 次ã®ã‚ˆã†ã«ç½®ãæ›ãˆãŸã„リテラルã®å·¦ã«SQLコメントã§ãƒ‘ラメータåを埋ã‚è¾¼ã¿ã¾ã™ã€‚ リテラルを文å—列ã¨ã—ã¦ç›´æŽ¥ç½®ãæ›ãˆã‚‹ã®ã§ã¯ãªã〠PreparedStatmentを使ã£ãŸãƒã‚¤ãƒ³ãƒ‰å¤‰æ•°ã«ç½®ãæ›ãˆã‚‹ã®ã§ã€ SQLインジェクション対ç–ã‚‚å•é¡Œã‚ã‚Šã¾ã›ã‚“。 </p> <source><![CDATA[ select * from employee where salary >= /*salaryMin*/1000 and salary <= 2000 ]]></source> <p>åŒæ§˜ã«2000ã®éƒ¨åˆ†ã‚‚ salaryMaxã¨ã„ã†ãƒ‘ラメータã§ç½®ãæ›ãˆã¾ã™ã€‚</p> <source><![CDATA[ select * from employee where salary >= /*salaryMin*/1000 and salary <= /*salaryMax*/2000 ]]></source> <p> 検索æ¡ä»¶ã®å…¥åŠ›ç”»é¢ãªã©ã«ã‚ˆãã‚るパターンã§ã€ 何ã‹æ¡ä»¶ãŒå…¥åŠ›ã•ã‚Œã¦ã„ã‚Œã°æ¤œç´¢æ¡ä»¶ã«è¿½åŠ ã—〠入力ã•ã‚Œã¦ã„ãªã‘ã‚Œã°æ¡ä»¶ã«ã¯è¿½åŠ ã—ãªã„ã¨ã„ã†ã“ã¨ã‚’実装ã—ã¦ã¿ã¾ã—ょã†ã€‚ ã“ã®ã‚ˆã†ãªå ´åˆã¯ã€IFコメントã¨ENDコメントを組ã¿åˆã‚ã›ã¾ã™ã€‚ </p> <source><![CDATA[ select * from employee where /*IF salaryMin != null*/ salary >= /*salaryMin*/1000 /*END*/ /*IF salaryMax != null*/ and salary <= /*salaryMax*/2000 /*END*/ ]]></source> <p> IFコメントã®å†…容ãŒtrueãªã‚‰ã€ IFコメントã¨ENDコメントã§å›²ã‚“ã§ã„る内容ãŒå‡ºåŠ›ã•ã‚Œã¾ã™ã€‚ IFコメントã®æ¡ä»¶ã¯ã€OGNLã«ã‚ˆã£ã¦è©•ä¾¡ã•ã‚Œã¾ã™ã€‚ 詳ã—ãã¯ã€ <a href="ognl.html">OGNLガイド</a> ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 </p> <p> 上記ã®ã‚ˆã†ã«è¨˜è¿°ã™ã‚‹ã¨ã€salaryMinãŒnullã§ã¯ãªãã¦ã€ salaryMaxãŒnullã®ã¨ãã«ã¯ã€ 下記ã®ã‚ˆã†ã«æ£ã—ã„SQLã«ãªã‚Šã¾ã™ã€‚ </p> <source><![CDATA[ select * from employee where salary >= ? ]]></source> <p> ã—ã‹ã—salaryMinãŒnullã§salaryMaxãŒnullã§ã¯ãªã„ã¨ãã¯ã€ 次ã®ã‚ˆã†ãªä¸æ£(andãŒwhereã®ç›´å¾Œã«ã‚ã‚‹)ãªSQLã«ãªã‚Šã¾ã™ã€‚ </p> <source><![CDATA[ select * from employee where and salary <= ? ]]></source> <p> ã¾ãŸã€salaryMinã¨salaryMaxãŒnullã®å ´åˆã‚‚〠次ã®ã‚ˆã†ãªä¸æ£(whereã ã‘ãŒã‚ã‚‹)ãªSQLã«ãªã‚Šã¾ã™ã€‚ </p> <source><![CDATA[ select * from employee where ]]></source> <p> ã“ã®å•é¡Œã«å¯¾å¿œã™ã‚‹ãŸã‚ã«ã¯ã€whereå¥ã®éƒ¨åˆ†ã‚’次ã®ã‚ˆã†ã«ã€ BEGINコメントã¨ENDコメントã§å›²ã¿ã¾ã™ã€‚ </p> <source><![CDATA[ select * from employee /*BEGIN*/ where /*IF salaryMin != null*/ salary >= /*salaryMin*/1000 /*END*/ /*IF salaryMax != null*/ and salary <= /*salaryMax*/2000 /*END*/ /*END*/ ]]></source> <p> ã“ã®ã‚ˆã†ã«ã™ã‚‹ã¨ã€salaryMinãŒnullã§salaryMaxãŒnullã§ã¯ãªã„ã¨ãã¯ã€ salaryMaxã®æ¡ä»¶ã¯ã€BEGINコメントã¨ENDコメントã§å›²ã¾ã‚ŒãŸæœ€åˆã®æ¡ä»¶ãªã®ã§ã€ andã®éƒ¨åˆ†ãŒè‡ªå‹•çš„ã«å‰Šé™¤ã•ã‚Œã¦æ¬¡ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ </p> <source><![CDATA[ select * from employee where salary <= ? ]]></source> <p> ã¾ãŸã€salaryMinã¨salaryMaxãŒnullã®å ´åˆã¯ã€ BEGINコメントã¨ENDコメントã§å›²ã¾ã‚ŒãŸéƒ¨åˆ†ã«1ã¤ã‚‚æ¡ä»¶ã«ä¸€è‡´ã™ã‚‹ã‚‚ã®ãŒãªã„ã®ã§ã€ BEGINコメントã¨ENDコメントã§å›²ã¾ã‚ŒãŸéƒ¨åˆ†ãŒã‚«ãƒƒãƒˆã•ã‚Œã¦æ¬¡ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ </p> <source><![CDATA[ select * from employee ]]></source> <p> src/main/resources/examples/sql/employee/selectWithDepartment.sql を見ã¦ã¿ã¾ã—ょã†ã€‚ </p> <source><![CDATA[ select e.*, d.name as department_name from employee e left outer join department d on e.department_id = d.id /*BEGIN*/ where /*IF salaryMin != null*/ e.salary >= /*salaryMin*/1000 /*END*/ /*IF salaryMax != null*/ and e.salary <= /*salaryMax*/2000 /*END*/ /*END*/ order by e.salary ]]></source> <p> SQLファイルを使ã£ã¦è¤‡æ•°ä»¶æ¤œç´¢ã™ã‚‹ã«ã¯ã€ selectBySqlFile()ã¨getResultList()を組ã¿åˆã‚ã›ã¾ã™ã€‚ </p> <p> src/test/java/examples/SqlFileTest.java㨠src/main/java/examples/dto/SelectWithDepartmentDto.java を見ã¦ã¿ã¾ã—ょã†ã€‚ </p> <source><![CDATA[ private static final String SQL_FILE = "examples/sql/employee/selectWithDepartment.sql"; ... SelectWithDepartmentDto dto = new SelectWithDepartmentDto(); dto.salaryMin = 1200; dto.salaryMax = 1800; List<EmployeeDto> results = jdbcManager .selectBySqlFile(EmployeeDto.class, SQL_FILE, dto) .getResultList(); for (EmployeeDto e : results) { System.out .println(e.name + " " + e.salary + " " + e.departmentName); } ]]></source> <source><![CDATA[ package examples.dto; public class SelectWithDepartmentDto { public Integer salaryMin; public Integer salaryMax; } ]]></source> <p> 詳ã—ãã¯ã€ <a href="s2jdbc_manager_sqlfile.html">SQLファイル</a> ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 </p> </section> <section name="多態"> <p>S2JDBCã¯ã€ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ã®ç¶™æ‰¿ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“ãŒã€ 列挙型を使ã£ã¦å¤šæ…‹ã‚’実ç¾ã§ãã¾ã™ã€‚</p> <p> src/main/java/examples/entity/JobType.java を見ã¦ã¿ã¾ã—ょã†ã€‚Enumã®ãã‚Œãžã‚Œã®å€¤ã«ãƒœãƒ¼ãƒŠã‚¹ã‚’計算ã™ã‚‹calculateBonus()㌠定義ã•ã‚Œã¦ã„ã¾ã™ã€‚ </p> <source><![CDATA[ package examples.entity; public enum JobType { CLERK { @Override public int calculateBonus(int salary) { return salary; } }, SALESMAN { @Override public int calculateBonus(int salary) { return salary * 2; } }, MANAGER { @Override public int calculateBonus(int salary) { return salary * 3; } }, ANALYST { @Override public int calculateBonus(int salary) { return salary * 4; } }, PRESIDENT { @Override public int calculateBonus(int salary) { return salary * 5; } }; public abstract int calculateBonus(int salary); } ]]></source> <p>全従æ¥å“¡ã®ãƒœãƒ¼ãƒŠã‚¹ã®åˆè¨ˆã‚’求ã‚ã‚‹ãƒã‚¸ãƒƒã‚¯ã¯æ¬¡ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚</p> <p> src/test/java/examples/TypeStrategyTest.java を見ã¦ã¿ã¾ã—ょã†ã€‚ </p> <source><![CDATA[ List<Employee> results = jdbcManager.from(Employee.class).getResultList(); int totalBonus = 0; for (Employee e : results) { totalBonus += e.jobType.calculateBonus(e.salary); } System.out.println("Total Bonus:" + totalBonus); ]]></source> <p>ã“ã®ã‚„ã‚Šæ–¹ã¯ã€ç¶™æ‰¿ã‚ˆã‚Šå§”è²ã¨ã„ã†è‰¯ã„プãƒã‚°ãƒ©ãƒŸãƒ³ã‚°ã‚¹ã‚¿ã‚¤ãƒ«ã«å¾“ã£ã¦ã„ã¾ã™ã€‚</p> </section> </body> </document>