|
|
Eclipse3ではじめるJava Webアプリケーション開発 |
第9回:O/Rマッパーの利用
著者:宮本 信二 2005/3/16
|
|
|
前のページ 1 2 3 4 次のページ
|
|
DAOパターン
|
S2Daoはその名から想像できるとおり、DAO(Data Access Object)パターンを利用する場合のツールです。DAOパターンとは、J2EEパターンの1つで、データベースとのやり取りをDAOという役割のクラスにまかせます。
データアクセスをDAOにまかせてしまうことで、ビジネスロジック側では、細かいデータアクセス処理を意識せずに、DAOを使うだけでよくなります。もちろんデータアクセス処理自体はDAOに書かなければなりませんが、同じようなロジックがあちこちに分散することなく、またデータアクセスの層が明確に分かれることで、行き当たりばったりに作るより効率的で保守も楽です。Webアプリケーション開発でDAOを利用する場合は、図2のようになります。
|
図2:DAOパターン
|
UI(ユーザインターフェイス)は、サーブレット/JSPやStruts、JSFといったUIフレームワークが担当する部分です。DAOを利用する場合、ResultSetなどの代わりにDTO(Data Transfer Object、Value Objectと呼ばれる場合もある)という、値を保持するだけのオブジェクトを利用します。
まず、S2Daoを利用しない場合のDAO、DTOのコード例を載せておきます。これは、第7回で作成したVIDEOテーブルを利用する場合のコードを素直に書いた例です。
リスト1:DAOの例
|
package before;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
public class VideoDAO {
public void insert(Video video) throws HogeException {
Connection con = null;
Statement smt = null;
try {
con = DBManager.getConnection();
smt = con.createStatement();
String sql = "INSERT INTO VIDEO (PRICE, TITLE)"
+ "VALUES("
+ "'" + video.getTitle() + "'"
+ "," + video.getPrice()
+ ")"
;
smt.executeUpdate(sql);
} catch (SQLException e) {
throw new HogeException(e);
} finally {
if (smt != null) {
try {
smt.close();
} catch (SQLException ignore) {
};
}
if (con != null) {
try {
con.close();
} catch (SQLException ignore) {
};
}
}
}
public List findAll() {
Connection con = null;
Statement smt = null;
try {
List videos = new ArrayList();
con = DBManager.getConnection();
smt = con.createStatement();
String sql = "SELECT * FROM VIDEO";
ResultSet rs = smt.executeQuery(sql);
while (rs.next()) {
Video video = new Video();
video.setTitle(rs.getString("title"));
video.setPrice(rs.getInt("price"));
videos.add(video);
}
return videos;
} catch (SQLException e) {
throw new HogeException(e);
} finally {
if (smt != null) {
try {
smt.close();
} catch (SQLException ignore) {
};
}
if(con != null){
try {
con.close();
} catch (SQLException ignore) {
};
}
}
}
//その他のメソッド…
}
|
リスト2:DTOの例
|
package before;
public class Video {
private String title;
private int price;
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
|
DAOクラスの利用者側が楽をできる分、DAOクラスの実装は面倒になります。S2Daoは、このDAOクラスの実装の大半を自動化してくれるツールです。
なお、一般にDAOパターンと言った場合は、上のDAOクラスをインターフェイスにし、DAOのファクトリも別に作成することで、さらに複数のDB間の移行も抽象化するといったことにも利用されます。
また、O/Rマッパーの中には、DAO/DTOでなくエンティティと呼ばれるオブジェクトで全部やってしまうものもあります。例えばEJBのエンティティビーンなどがそれにあたります。
オブジェクト指向的には、エンティティの方が美しく融通がきくしくみです。しかしDTO+DAOの方が、わかりやすく(ある意味手続き言語的)、またトランザクション境界やデータアクセス層を明確にしやすいという利点から、少なくとも現状では、日本のWebアプリケーション開発業界で人気のあるパターンです。
|
前のページ 1 2 3 4 次のページ
|
|
|
|
著者プロフィール
宮本 信二 http://muimi.com/
テクニカルライター。Ja-Jakartaコミッタ。Java Webアプリケーション開発業務を経て、現在、主にJavaやOSS関連の調査、執筆を行っている。著書に「Eclipse 3 完全攻略」、「JavaデベロッパーのためのApacheAnt入門」(ソフトバンクパブリッシング)、「徹底解説!JSFのすべて」(秀和システム)などがある。
|
|
|
|