Posted on 2007-02-27 17:48
冰浪 阅读(2267)
评论(3) 编辑 收藏 所属分类:
WEB开发
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
面向对象编程》这本书并预读了其中一章内容时,我马上做出了买书的决定!因为这本书刚出版的原因,我没有在惠州买到,所以就托我哥在顺德买了下来,拿到手后如获至宝。现在,我已经基本上看完了这本书,明白了很多东西,觉得自己的面向对象思想已经达到了一个质的飞跃。在此我要特别感谢孙卫琴老师,给我们写了一本这么好的书。也是因为这些,我才可以写下这篇开发日记,算是有点东西的东西。