冰浪

哥已不再年轻 - 坚定梦想,毕生追求!
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的时候。

只有注册用户登录后才能发表评论。


网站导航: