Java+HibernateでDAOパターンを実装してみる - その1

2008/10/22 16:36Update
TAGS: Java | Hibernate | DAO | DAOパターン

データベースなどの永続性データへのアクセスを行う際、Data Access Object(DAO)パターンを利用すると便利です。本文はサンプルからJava言語でその実装方法について学びます。

Data Access Object(DAO)パターンについて、こちらの記事 を参照してください。
コアJ2EEパターン - Data Access Objectパターン

サンプル


テーブル:USER(ID, NAME)
エンティティ:User.java
マッピングファイル:User.hbm.xml(略)

DAOインタフェース:IUserDao.java
DAO実装:UserDao.java

■ファイルリスト:
ファイルリスト 説明
User.java     エンティティクラス。テーブル<USER>に対応。
User.hbm.xml     Hibernateマッピング設定ファイル。省略。
IUserDao.java     DAOインタフェース。テーブル<USER>をアクセスするためのインタフェース。
UserDao.java     DAO実装クラス。テーブル<USER>をアクセスするためのクラス。
Test.java     テストクラス。
DaoUtils.java     DAOユーティリティクラス。get/update/deleteなど基本的な処理はここで記述する

■ソースコード
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 {
    public User get(String pk);
    public List getAll();
    public String save(User entity);
    public void update(User entity);
    public void saveOrUpdate(User entity);
    public void delete(User entity);
}



UserDao.java

//UserDao Implementation
public class UserDao implements IUserDao {

    public User get(String pk) {
        return (User)DaoUtils.get(User.class, pk);
    }
    
    public List getAll() {
        return DaoUtils.getAll(User.class);
    }

    public String save(User entity) {
        return (String)DaoUtils.save(entity);
    }

    public void update(User entity) {
        DaoUtils.update(entity);
    }

    public void saveOrUpdate(User entity) {
        DaoUtils.saveOrUpdate(entity);
    }

    public void delete(User entity) {
        DaoUtils.delete(entity);
    }
}



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());
        }
    }
}



DaoUtils.java

public class DaoUtils {
        
    public static Object get(Class clz, Serializable pk) {
        return getSession().get(clz, pk);
    }
    public static List getAll(Class clz) {
        return getSession().createCriteria(clz).list();
    }
    public static Serializable save(Object entity) {
        return getSession().save(entity);
    }
    public static void update(Object entity) {
        getSession().update(entity);
    }
    public static void saveOrUpdate(Object entity) {
        getSession().saveOrUpdate(entity);
    }
    public static void delete(Object entity) {
        getSession().delete(entity);
    }
    
    private static Session session;
    protected static 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;
    }
}

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

Sponsored Link


Comments

用户名 (required)

Email (will not be published) (required)

URL

Evaluation