Java GenericsでDAO実装を簡素化させる - DAOパターン実装その2

2008/10/22 17:13Update
TAGS: Java Generics | Javaジェネリクス | DAO | DAOパターン | Hibernate

データベースなどの永続性データへのアクセスを行う際、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

■ファイルリスト:
ファイルリスト 説明
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の数は増えれば増えるほどメリットが増えます。

有关作者
Syboos.jp編集長AJavaやオープンソース情報の執筆、Webサイトの開発や運営全般の業務に携わる。

Sponsored Link


Comments

用户名 (required)

Email (will not be published) (required)

URL

Evaluation