Java GenericsでDAO実装を簡素化させる - DAOパターン実装その2
2008/10/22 17:13Update
データベースなどの永続性データへのアクセスを行う際、Data Access Object(DAO)パターンを利用すると便利です。本文はサンプルから、Java Genericsを使ってその実装を簡素化させる方法について解説します。
Data Access Object(DAO)パターンについて、こちらの記事 を参照してください。
コアJ2EEパターン - Data Access Objectパターン
Java Genericsを使わず、DAOパターンの実装例(Java):
Java+HibernateでDAOパターンを実装してみる - その1
Java Genericsの概念、使い方などの説明は今回は行ないません。
以下、Java Generics(ジェネリクス)でのDAO実装方法について解説します。
テーブル:USER(ID, NAME)
エンティティ:User.java
マッピングファイル:User.hbm.xml(略)
DAOインタフェース:IUserDao.java
DAO実装:UserDao.java
■ファイルリスト:
■ソースコード
簡単な処理であれば、IUserDao.javaとUserDao.javaは空の実装だけで、極力簡素化されています。
DAOの数は増えれば増えるほどメリットが増えます。
コアJ2EEパターン - Data Access Objectパターン
Java Genericsを使わず、DAOパターンの実装例(Java):
Java+HibernateでDAOパターンを実装してみる - その1
Java Genericsの概念、使い方などの説明は今回は行ないません。
以下、Java Generics(ジェネリクス)でのDAO実装方法について解説します。
サンプル
テーブル:USER(ID, NAME)
エンティティ:User.java
マッピングファイル:User.hbm.xml(略)
DAOインタフェース:IUserDao.java
DAO実装:UserDao.java
■ファイルリスト:
| ファイルリスト | 説明 |
|---|---|
| IDao.java | DAOのスーパインタフェース。 |
| AbstractDao.java | IDAOを実装した抽象クラス。共通する処理をここで記述する |
| User.java | エンティティクラス。テーブル<USER>に対応。 |
| User.hbm.xml | Hibernateマッピング設定ファイル。省略。 |
| IUserDao.java | DAOインタフェース。テーブル<USER>をアクセスするためのインタフェース。 |
| UserDao.java | DAO実装クラス。テーブル<USER>をアクセスするためのクラス。 |
| Test.java | テストクラス。 |
■ソースコード
IDao.java
// super dao interface
public interface IDao <T, PK extends Serializable> {
public T get(PK pk);
public List <T>getAll();
public PK save(T entity);
public void update(T entity);
public void saveOrUpdate(T entity);
public void delete(T entity);
}
AbstractDao.java
//super abstract dao class
public abstract class AbstractDao <T, PK extends Serializable>implements IDao<T, PK> {
private Class clz;
public AbstractDao(Class clz) {
this.clz = clz;
}
public T get(PK pk) {
return (T)getSession().get(clz, pk);
}
public List <T>getAll() {
return getSession().createCriteria(clz).list();
}
public PK save(T entity) {
return (PK)getSession().save(entity);
}
public void update(T entity) {
getSession().update(entity);
}
public void saveOrUpdate(T entity) {
getSession().saveOrUpdate(entity);
}
public void delete(T entity) {
getSession().delete(entity);
}
private Session session;
protected Session getSession() {
//wrap session in a class such as HibernateUtils, then you can use HibernateUtils.getCurrentSession() for getting a session.
//参考:ThreadLocal でHibernate Session を効率的に管理する
return session;
}
}
User.java(抜粋)
//persist entity
public class User {
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//... setter/getter HERE
}
IUserDao.java
//User Dao interface
public interface IUserDao extends IDao <User, String> {
//ここに注目!重複するような記述はありません!
// all are empty
// get/getAll/save/update/saveOrUpdate/delete以外の処理をここで記述する
}
UserDao.java
//UserDao Implementation
public class UserDao extends AbstractDao <User, String> implements IUserDao {
public UserDao() {
super(User.class);
}
// or use the following constructor
//public UserDao(Class<User> type) {
// super(type);
//}
//ここに注目!重複するような記述はありません!
// get/getAll/save/update/saveOrUpdate/delete以外の処理をここで記述する
}
Test.java
public class Test {
public static void main(String[] args) {
IUserDao userDao = new UserDao();
User user = userDao.get("1");
if (user != null) {
System.out.println(user.getName());
}
List<User> userList = userDao.getAll();
for (User u:userList) {
System.out.println(user.getName());
}
}
}
簡単な処理であれば、IUserDao.javaとUserDao.javaは空の実装だけで、極力簡素化されています。
DAOの数は増えれば増えるほどメリットが増えます。
Sponsored Link
Comments
- Relative Articles
- Java+HibernateでDAOパターンを実装してみる - その1 - (2008/10/22 16:36)
- Hibernate HQL入門その2 - SELECT 句 - (2008/07/09 18:37)
- SchemaExportでHibernateマッピングファイルからDBスキーマの作成 - (2009/03/09 18:02)