官术网_书友最值得收藏!

1.8 DAO模式

Hibernate已經(jīng)提供了持久化層的基礎(chǔ)架構(gòu),用戶要做的就是利用這些基礎(chǔ)來實現(xiàn)具體的業(yè)務(wù)。為符合分層的概念,數(shù)據(jù)訪問細(xì)節(jié)不能和業(yè)務(wù)邏輯混雜在一起,應(yīng)該將數(shù)據(jù)操作的類放在一起,對它們進行某種相似結(jié)構(gòu)的抽象。接下來要介紹的就是一種典型的結(jié)構(gòu)。

DAO(Data Access Object,數(shù)據(jù)訪問對象)模式,是將所有對數(shù)據(jù)源的訪問進行抽象和封裝的一種設(shè)計模式。它所處的位置在業(yè)務(wù)層和數(shù)據(jù)源中間,起到屏蔽業(yè)務(wù)層了解數(shù)據(jù)底層設(shè)計細(xì)節(jié)的作用。DAO的設(shè)計應(yīng)該遵循下面3個原則:

(1)面向接口編程,以適應(yīng)數(shù)據(jù)底層的變動,向業(yè)務(wù)層公布的接口應(yīng)當(dāng)以DTO(數(shù)據(jù)傳輸對象)為參數(shù)和返回值。

(2)盡量將增刪改查原子化(粒度小一些),這樣業(yè)務(wù)層可以根據(jù)業(yè)務(wù)需求靈活地組合。(3)在包的劃分上需要規(guī)范,所有DAO類都放在dao包中,如圖1.9所示。

圖1.9 5iJob包結(jié)構(gòu)

1.8.1 DAO接口示例

下面的代碼是5iJob用到的ISeekerDao接口的代碼片段:

        public interface ISeekerDao {
            /**
            * 保存Seeker實例
            * @param seeker
            */
            String save(Seeker seeker);
        }

1.8.2 DAO實現(xiàn)類示例

以下代碼是5iJob用到的SeekerDaoImpl類的代碼片段,可直接用于上機任務(wù)。

        public class SeekerDaoImpl implements ISeekerDao {
            @Override
            public String save(Seeker seeker) {
                Session session = HibernateUtil.getSessionFactory().openSession();//使用HibernateUtil
                Transaction tx = null;
                try {
                    tx = session.beginTransaction();
                    String id = (String) session.save(seeker);
                    tx.commit();
                    return id;
                } catch (Exception e) {
                    tx.rollback();
                    throw new RuntimeException(e);
                } finally {
                    session.close();
                }
            }
        }

可以看到,SeekerDaoImpl使用了Hibernate API完成了向數(shù)據(jù)庫新增一個Seeker的任務(wù)。在業(yè)務(wù)層,可以這樣來使用DAO:

        public class SeekerServiceImpl implements ISeekerService {
            private ISeekerDao dao = new SeekerDaoImpl();
            @Override
            public String register(Seeker seeker) {
                return dao.save(seeker);
            }
        }
主站蜘蛛池模板: 博兴县| 河津市| 贞丰县| 隆昌县| 井研县| 宁南县| 朝阳区| 临海市| 南昌市| 瑞昌市| 庆元县| 滁州市| 石嘴山市| 鄂尔多斯市| 涞源县| 扶沟县| 镶黄旗| 柘城县| 吴川市| 兴城市| 察隅县| 肇东市| 洪泽县| 察雅县| 汉沽区| 芦山县| 通道| 政和县| 来宾市| 白银市| 沧州市| 涞水县| 毕节市| 北票市| 鱼台县| 平乡县| 随州市| 鄂托克旗| 东丰县| 阿拉善左旗| 察哈|