冰浪

哥已不再年轻 - 坚定梦想,毕生追求!
posts - 85, comments - 90, trackbacks - 0, articles - 3
  语源科技BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

     DAO 是 Date Access Object 的缩写,就是数据访问对象。 DAO 模式就是将对数据库的操作都封装成一个类,在需要进行数据存取时就直接调用 Dao 类实例对象来完成的一种工作方式,这也是面向对象编程的一种体现。

在 CSUOA 中,我将数据库里每一个表都对应一个实体 Entity ,而每一个 Entity 都对应着一个 Dao 的实例类,用于进行相应的操作。

如 CSUOA 数据库里有 oauser , mail , message 等表,分别代表用户表,邮件表,短信息表。那么我就对应着有 OauserDao.class , MailDao.class , MessageDao.class 等 Dao 实例类。而我们知道,数据库操作中最基本的就是增删改,这也是共性,所以我将增删改操作抽象出来,建立一个 Dao 抽象类 BaseDao.class ,作为 Dao 实例类的父类,其类方法可为增删改的抽象方法或实例方法,具体要根据数据持久操作的底层实现来确定。当然,进一步来说,获取对象也是基本的操作,在这里省略了。

那么,到这里就完成了吗?没有!按照面向接口编程的原则,我再建立一个 Dao 接口: Dao.class 作为抽象类 BaseDao.class 的父类。而在 Dao.class 里,我们只声明了增删改的无任何实现的抽象方法。

接口不能实例化,定义了接口又怎么用呢?对,接口是不能实例化,但我们可以声明一个接口类型的引用。也就是创建一个 Dao 实例对象,但声明其类型为 Dao 接口类型。例如: Dao dao = new OauserDao(); 这样有何意义呢?是因为对松耦合的要求,这点我们在下篇再详细说明。

除了要进行基本的增删改操作外,有些 Entity 还要进行其它一些操作,如查询。我首先想到的是,在 OauserDao.class 里扩展功能,加入查询方法,以致于可以进行查询操作。即在 Dao dao = new OauserDao(); 后用 dao.query(“queryStr”); 进行查询操作,但此时,编译器报错了,说“没有为 Dao 定义 query() 方法”。想想也对,将 dao 声明为 Dao 类型,编译器就以 Dao 类型所拥有的方法进行编译,但此时编译器无法在 Dao 接口类里找到此方法,所以报错了。

几经思考后,想到可以这么做:新建立一个 Query.class 的接口类,并声明查询方法,然后在 Dao 实例类如 OauserDao.class 里实现 Query 接口。我们知道,一个类可以实现多个接口,这就是接口的优势。在要进行查询操作时,我们将之前 dao 实例对象声明为 Query 类型,此时就通过了编译并实现了我所要的结果。

 

我以前写程序,根本就不会去用接口,也不明白接口有什么用,也不会去用抽象类,动手就是实例类,最多也就是用到继承,以为这就是面向对象了。从这可以看我的面向对象基础不太好,我觉得很大程度是因为我们大学里所用教材的原因,教材里所写的就只是一些语法。而自己又是大三下学期才决定转入 Java 方向的,所以深深知道自己要学习的东西太多太多。在大四时我就决定好好补上这一课,而当我在网上看到孙卫琴的《 Java 面向对象编程》这本书并预读了其中一章内容时,我马上做出了买书的决定!因为这本书刚出版的原因,我没有在惠州买到,所以就托我哥在顺德买了下来,拿到手后如获至宝。现在,我已经基本上看完了这本书,明白了很多东西,觉得自己的面向对象思想已经达到了一个质的飞跃。在此我要特别感谢孙卫琴老师,给我们写了一本这么好的书。也是因为这些,我才可以写下这篇开发日记,算是有点东西的东西。


评论

# re: 毕业设计开发日记连载4:DAO模式和面向接口编程  回复  更多评论   

2007-02-28 09:32 by 我为J狂
“Dao.class 作为抽象类 BaseDao.class 的父类”这句话不太准确,应该这样阐述“BaseDao实现了Dao接口”。

# re: 毕业设计开发日记连载4:DAO模式和面向接口编程  回复  更多评论   

2007-03-02 08:53 by 坏男孩
孙JJ写的书真的值得一睹

# re: 毕业设计开发日记连载4:DAO模式和面向接口编程  回复  更多评论   

2007-03-14 10:57 by L
persistent层最好还是需要一个框架,尤其是到最后你需要transaction management的时候。