请指点--关于数据访问层(1)

  在发表这篇随笔之前,我犹豫了很久,到底要不要把这篇随笔放在首页,作为一篇菜鸟的随笔,不是太合适放在首页,但是如果不放首页,可能这篇随笔很快就沉了,所以,我鼓起勇气把它放在首页...

  写这篇随笔主要是由于我在做数据访问层时碰到了问题,我有在博客园群里请教别人,也得到了大家热心的帮助,但QQ上的消息沉得比博客可快得多了,所以我就想把它放到博客园上.....不说了,切入正题吧。

  现在要弄一个简单的视频网站,有管理员、用户、视频类别、视频、管理员和用户可以上传视频、对视频进行评论。

我的意图:在这篇随笔中,先抛开业务逻辑层和表现层,只看这个网站的数据访问层,我想要让这个DAL层能够实现数据库无关,同时能更加符合面向对象的设计思想,做这个更多的是为了学习,所以我不想采用一些现成的东西,希望能对其慢慢改进,在改进中让自己得到锻炼。

下面是我的DAL类图:



说明:IDatabase是一个接口,定义了一些执行SQL语句或存储过程的方法,上图中只标出了三个,SQLServer和Oracle是两个具体的数据库,实现IDatabase接口,IDAL是一个表示对Video、User、Admin、Comment进行管理的接口,其中的CreateDb()方法从配置文件中读取数据库类型,然后利用反射创建该具体数据库(SQLServer类或Oracle类)并返回,其它方法全部都利用CreateDb()返回的数据库类来执行相应的Sql语句或存储过程,其中GetCount()是返回该对象的总数量(如Video的总数、User的总数),GetItem(int id)通过该对象的id(在数据库中是主键)返回对象(比如VideoDAL中的GetItem(int id)就通过数据库中video的ID返回Video对象),GetList就是返回对象列表(如VideoList,UserList),GetPagedListOrderByPK(int startRow, int maxRows, SortType sortType)也是返回一个列表,但它是分页时当前页应该显示的那部分对象列表,startRow和maxRows是该页的起始行号和取出的最大记录数(可以认为是page size),方法体中是与数据库交互,取出数据,SortType是一个枚举,有ASC和DESC两值,代表排序规则,结果是按主键排序的。

下面是业务对象(这个叫法不知道是不是有问题,因为它们仅仅只是对数据库相应表字段的一个映射,只不过多了两三个属性)



上图中的User类、Video类等中拥有数据库中对应表的所有字段(数据库中有Admin、User、Video、VideoSort、Comment表),我没有画出来,在User类中,有Videos和Comments属性,表示某用户上传的视频列表和发表的所有评论列表,其它类中也有类似的属性。

我现在所能想到的就是这样,但我知道,这里面存在着很多很多的问题,只是我的水平比较菜,不知道要如何改进,所以斗胆把它放到首页,希望能得到大家的指点。大家可以放心的说,完全不用担心会伤害我的自尊心,OK,来吧。。

posted @ 2008-04-16 23:15  水言木  阅读(3126)  评论(37编辑  收藏  举报