データの取得を行ってみます。
サンプルはこちらからダウンロードできます。
※BLOGの都合上、文中のタグ用の括弧はすべて全角文字にしてあります。
組み込み
まず、以下のページからiBatisをダウンロードします。Ver3のベータ版が出ているようですが、ここではVer2のibatis-2.3.4.726.zipをダウンロードします。
http://ibatis.apache.org/java.cgi
ダウンロードしたファイルを展開し、ibatis-2.3.4.726.jarをWebContext/libフォルダにコピーします。
次に、xmlフォルダ(またはsrcフォルダ)にSqlMapConfig.xmlを作成します。
SqlMapConfig.xmlにはDB接続の情報や使用する追加で読み込むSqlMap.xmlファイルのパスを指定します。
ここでは、外部のJDBCドライバが不要なODBC経由でデータベースに接続します。
ODBC経由でのDB接続の設定は以下のようになります。(一部抜粋)
<property name="JDBC.Driver" value="sun.jdbc.odbc.JdbcOdbcDriver" /> <property name="JDBC.ConnectionURL" value="jdbc:odbc:struts2_sample" /> <property name="JDBC.Username" value="struts2_sample" /> <property name="JDBC.Password" value="struts2_sample" />
ODBCデータソースアドミニストレータでデータソース「struts2_sample」を追加します。
なお、MySQLの場合の設定は以下のようになります。(一部抜粋)
<property name="JDBC.Driver" value="com.mysql.jdbc.Driver" /> <property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost/struts2_sample" /> <property name="JDBC.Username" value="struts2_sample" /> <property name="JDBC.Password" value="struts2_sample" />
データの準備
以下のSQL文をデータベースアクセスクライアント等で実行し、あらかじめテーブルの作成とデータの追加を行います。
なお、ここで使用しているSQL文はMySQL用のものです。
create table sample_user_tables(user_name varchar(100), mail_address varchar(200), login_count integer, primary key(user_name));
INSERT INTO sample_user_tables
(
user_name,
mail_address,
login_count
)
VALUES
(
'hoge',
'hoge@example.com',
'3'
)
;
INSERT INTO sample_user_tables
(
user_name,
mail_address,
login_count
)
VALUES
(
'piyo',
'piyo@example.com',
'10'
)
;
iBatisの初期化
iBatisを使用するにはSqlMapClientクラスを作成する必要があります。SqlMapClientクラスは一度作成したら使い回しができるので、
ここではシングルトンのクラスSqlMapClientHolderを作成し初回だけ初期化を行うようにします。
public class SqlMapClientHolder { public static final String RESOURCE_PATH = "SqlMapConfig.xml"; private static SqlMapClient sqlMapClient; static { try { Reader reader = Resources.getResourceAsReader(RESOURCE_PATH); sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader); } catch (IOException ioe) { throw new RuntimeException("SqlMapConfig.xml load failed.", ioe); } } public static SqlMapClient getInstance() { return sqlMapClient; } }
DAOの作成
データベースにアクセスするデータアクセスクラス(DAO)を作成します。まず、SQL文を記述した設定ファイルをXML(SqlMap.xml)で作成します。
ファイル名は自由に設定できますが、xmlフォルダ(またはsrcフォルダ)といった
コンパイル対象のフォルダにおく必要があります。
作成したファイルのパスはSqlMapConfig.xmlにsqlMapタグで指定します。
<sqlMap resource="sqlmap/SqlMap-SampleQuery.xml" />
SqlMap-SampleQuery.xmlの内容は以下のようになります。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd"> <sqlMap> <resultMap id="SampleQueryDto" class="com.googlecode.tecproglab.struts2_sample.dto.SampleQueryDto"> <result property="userName" column="user_name" /> <result property="mailAddress" column="mail_address" /> <result property="loginCount" column="login_count" /> </resultMap> <select id="queryAll" resultMap="SampleQueryDto"> SELECT user_name, mail_address, login_count FROM sample_user_tables ORDER BY user_name </select> </sqlMap>
selectタグにはSQL文(ここではSELECT文)を記述します。
また、SampleQueryDtoに取得したデータを保存するDTOクラスを指定します。
resultMapタグにはDTOクラスのクラス名を指定します。
resultタグにはDTOクラスの要素とSQLで取得した列名の組み合わせを指定します。
データを保存するDTOクラスを作成します。
DTOのメンバー変数(userName)はresultMapタグの指定と厳密に一致させます。
//一部抜粋
public class SampleQueryDto { private String userName; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } //以下省略 }
実際の処理を行うDAOを作成します。
といっても、SqlMapClientを取得してiBatisを呼び出すだけです。
queryForListの引数にはselectタグに記述した名前を指定します。
SQLを実行した結果としてDTOのリストが返ります。
public class SampleQueryDao { public List<SampleQueryDto> queryAll() { SqlMapClient sqlMapClient = SqlMapClientHolder.getInstance(); try { List<SampleQueryDto> list = (List<SampleQueryDto>) sqlMapClient .queryForList("queryAll"); return list; } catch (SQLException se) { throw new RuntimeException(se); } } }
動作確認
iBatisはWebサーバが不要のため、以下のようなテストコードで動作確認が行えます。Eclipse上から実行するには以下のように行います。
1.main関数を記述したクラスをプロジェクトエクスプローラーから右クリックします。
2.コンテキストメニューのRun As>Java Applicationをクリックします。
public static void main(String[] args) { SampleQueryDao dao = new SampleQueryDao(); List<SampleQueryDto> list = dao.queryAll(); for (SampleQueryDto dto : list) { System.out.println(dto); } }
0 件のコメント:
コメントを投稿