<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-84  評論-56  文章-0  trackbacks-0

    本文介紹怎么樣使用Java Generics來簡化數據庫存取類DAO的開發,并給出了一個完整的例子,大家可以把代碼用在實際的開發應用中。

    在系統開發中,為了降低耦合性,一般把跟數據庫有關的操作封裝在被叫做DAO(Dao Access Object)的類里。一般DAO的封裝有以下幾個原則:

    1、一個表操作封裝成一個DAO。例如:操作表User的DAO封裝為UserDao.java,操作UserRole的DAO封裝為UserRole.java等

    2、具有良好的接口定義。為了使用簡單以及不至于被錯誤調用,DAO接口必須有具體的型定義。例如:可以直接
    User user = userDao.get(userId);取得指定userId的User,而不必進行強制類型轉換 User user = (User)userDao.get(userId); [X]
    為了避免誤操作,userDao.delete(UserRole);應該在編譯期就報錯。

    為了對DAO進行良好的封裝,JDK1.5之前,DAO開發是一個大量重復代碼的體力過程;JDK1.5開始引入了Generics概念,我們可以利用JDK1.5的Generics特性大大簡化DAO開發。

    Generics概念

    Java的Generics就是Java的泛型,類似于C++的模板概念,Generics介紹起來比較復雜,簡單說來,泛型從語言特性的底層上支持,可以讓你為某些相似功能定義一個具有統一接口的通用模板,該模板可以接收任意類型并應用到類成員變量的類型,方法的參數類型,方法的返回值類型等;并可以在編譯期支持類型的安全轉換。舉例說:
    java.util.List是一個泛型,一個定義為List<User> userList;的變量userList,可以通過User user = userList.get(0);便可直接得到User,不用經過類型的強制轉換了。

    Generics更詳細的介紹請參考相關文章,這里不做詳述。

    下面舉例我們給出2種DAO的封裝方法,一種是不使用Java Generics特性的一般封裝方法;一種是使用泛型的封裝方法。通過比較,我們會發現Java的Generics特性到底為我們簡化了哪些工作。

    使用Java Generics特性封裝DAO

    文件名 說明
    IDao.java dao的頂層抽象接口
    AbstractDao.java IDao的實現類,實現了get/update/delete等基本操作
    User.java USER表對應的entity定義
    IUserDao.java USER表操作DAO接口定義
    UserDao.java USER表操作DAO實現
    HelloGenerics.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.
            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
    }

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

    HelloGenerics.java

    public class HelloGenerics {

        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非常簡單。

    不使用Java Generics特性DAO的封裝

    同樣,我們給出不使用Java Generics特性DAO的封裝。該封裝也是一個具有良好結構性的封裝。

    文件列表2:

    文件名 說明
    DaoUtils.java dao通用工具類,提供get/update/delete等基本操作
    User.java USER表對應的entity定義
    IUserDao.java USER表操作DAO接口定義
    UserDao.java USER表操作DAO實現
    HelloGenerics.java 測試類

    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.
            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 {
        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);
        }
    }

    HelloGenerics.java

    public class HelloGenerics {

        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的實現比使用Java Generics特性的情況要復雜多了。

    posted on 2008-08-24 05:39 憶風 閱讀(412) 評論(0)  編輯  收藏 所屬分類: Java SE

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲国产精品久久久久秋霞影院| 久久影视综合亚洲| 亚洲国产情侣一区二区三区| 七色永久性tv网站免费看| 亚洲日产韩国一二三四区| 一区二区三区免费视频播放器| 亚洲精品国精品久久99热| 有码人妻在线免费看片| 亚洲国产精品一区二区第一页| 久久久久国产精品免费免费不卡| 亚洲性天天干天天摸| 16女性下面无遮挡免费| 亚洲综合中文字幕无线码| 日韩视频免费在线| 一级黄色免费毛片| 久久夜色精品国产亚洲| 2022久久国产精品免费热麻豆| 亚洲欧洲另类春色校园网站| 日韩高清在线高清免费| 污污视频网站免费观看| 国产亚洲色婷婷久久99精品| 久久不见久久见免费视频7| 亚洲人成电影网站| 免费大学生国产在线观看p| 99re6在线精品免费观看| 亚洲综合一区二区国产精品| 女人让男人免费桶爽30分钟| 国产天堂亚洲精品| 亚洲AV无码国产丝袜在线观看| 波多野结衣免费在线观看| 免费看内射乌克兰女| 亚洲AV永久精品爱情岛论坛| 青青青国产在线观看免费网站 | 亚洲成a人片在线播放| 东方aⅴ免费观看久久av| jlzzjlzz亚洲jzjzjz| 亚洲va中文字幕无码| 99视频全部免费精品全部四虎 | 十八禁在线观看视频播放免费| 亚洲日韩乱码中文无码蜜桃| 免费大片黄手机在线观看|