シンプルな検索
DEPTテーブルのキーを指定して1件のDEPTレコードを取得するSQLを記述しました。この検索結果を受け取るためのBeanを作成します。setterとgetterを用意したシンプルなPOJOです。
検索結果を格納するクラス
DEPTテーブルの列ではLOC列ですが、あえてlocation
プロパティにしています。
package examples.dto; public class Dept { private int deptno; private String dname; private String location; public int getDeptno() { return deptno; } public void setDeptno(int deptno) { this.deptno = deptno; } public String getDname() { return dname; } public void setDname(String dname) { this.dname = dname; } public String getLocation() { return location; } public void setLocation(String location) { this.location = location; } @Override public String toString() { return "[deptno=" + deptno + ", dname=" + dname + ", location=" + location + "]"; //Commons-LangのToStringBuilderを使うと楽 } }
SqlMap
先ほど準備段階で作成したものです。
<!-- 1件検索 --> <select id="getDept" resultClass="examples.dto.Dept"> SELECT DEPTNO, DNAME, LOC as location FROM DEPT WHERE DEPTNO = #value# </select>
テーブルの列名(LOC)とBeanのプロパティ名(location)が異なる場合にはマッピングが必要です。一番簡単な例はこのようにSQL文で別名をつけることです。
実行プログラム
SQLを実行するクラスは、こんなにシンプルになります。
package examples;
import com.ibatis.sqlmap.client.SqlMapClient;
import examples.dto.Dept;
/**
* シンプルな検索
* スカラー値のSQL
パラメータ
*/
public class Sample01_SelectOne {
public static void main(String args[])throws Exception{
SqlMapClient sqlMap = MyAppSqlConfig.getSqlMapInstance();
/*
* DeptNoを指定して1件のDeptを取得
*/
Dept dept =
(Dept)sqlMap.queryForObject("getDept", new Integer(20));
System.out.println("部署番号20の部署=" + dept);
}
}
MyAppSqlConfigからSqlMapClientを生成し、idを指定してSQLの実行結果を取得します。引数で指定した20という値は、SQL文の#value#に埋め込まれて実行されます。
1レコードを取得する場合には、queryForObject
で取得します。この実行結果がDept
で返されるのは、SqlMap-Dept.xmlに定義されたresultClass="examples.dto.Dept"
の指定のためです。検索結果からオブジェクトへの詰め替えは、iBATISが列名から自動的に行ってくれます。
検索結果をListで受け取る
複数のレコードが返される場合はList
形式で受け取ります。
SqlMap
作成済みのSqlMap-Dept.xmlにSQL定義を追加します。
<sqlMap> <!-- 1件検索 --> <select id="getDept" resultClass="examples.dto.Dept"> SELECT DEPTNO, DNAME, LOC as location FROM DEPT WHERE DEPTNO = #value# </select> <!-- 全件検索 --> <select id="allDept" resultClass="examples.dto.Dept"> SELECT DEPTNO, DNAME, LOC as location FROM DEPT ORDER BY DEPTNO desc </select> </sqlMap>
実行プログラム
検索結果をList
で受け取るプログラムは、次のようになります
List<Dept> list = (List<Dept>)sqlMap.queryForList("allDept"); for (Dept d : list){ System.out.println(d); }
queryForList
では実行結果がList
に格納されます。resultClass
の指定がDept
になっているため、Dept
がaddされたList
として取得できます。このサンプルでは、ジェネリックスを使うためにキャストしています(※残念ながらiBATIS2.3.0の時点では、SqlMapClientはジェネリックスに未対応なためキャストを使用しています)。
検索結果をMapのListで受け取る
Beanを作成するのが面倒な場合は、MapをresultClass
として使用することができます。この場合、列名をキーとしたMapが作成されるため、ResultSetを使ったJDBCプログラムと似ています。
SqlMap
作成済みのSqlMap-Dept.xmlにSQL定義を追加します。resultClass
にHashMapを指定します。
<!-- 全件検索をMapで受け取る --> <select id="allDeptMap" resultClass="java.util.HashMap"> SELECT * FROM DEPT </select>
実行プログラム
実行方法は、List
で受け取る場合と同様です。
List<Map> list = (List<Map>)sqlMap.queryForList("allDeptMap"); for (Map map : list){ System.out.println(map.get("DEPTNO") + "," + map.get("DNAME") + "," + map.get("LOC")); }
列名の大文字がキーになります。
resultClass
の作成が不要な点は楽ですが、カラム名を間違ったり、間違ったキャストの場合でもコンパイルエラーにならないため、タイプセーフではありません。