(一) 三层基本概念
1、 UI层:用户表示层,主要是指与用户交互的界面。用于接收用户输入的数据和将用户需要的数据以不同的方式展示给用户。
2、 BLL层:业务逻辑层,UI层和DAL层之间的桥梁,主要处理与业务逻辑相关的操作,像一个人的大脑,所有的逻辑判断、业务操作都在此层处理,包含:验证、计算、业务规则等等。如:银行转帐:判断本帐户和对方帐号是否存在,金额是否充足,转帐。这些都在业务层处理。
3、DAL层:数据访问层,很单纯,只负责操作数据库。主要实现对数据的增、删、改、查。将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库。(当然这些操作都是基于UI层的。用户的需求反映给界面(UI),UI反映给BLL,BLL反映给DAL,DAL进行数据的操作,操作后再一一返回,直到将用户所需数据反馈给用户)
4、MODEL层:实体层,实体类不属于三层中的任何一层,但在三层之间传递数据。通过传递一个参数就可以查询出相关的数据的所有结果,并把这个结果都存到实体类对象中,以后需要用这些查询到的结果时,只需要调用实体类对象就行了。这样就不需要把每列都当一个参数传进来了。如果列非常多,那么会相当多的参数,会很复杂。
(1)实现面向对象思想中的"封装";
(2)贯穿于三层,在三层之间传递数据;
(注:确切的说实体层贯穿于三层之间,来连接三层)
(3)对于初学者来说,可以这样理解:每张数据表对应一个实体,为每个需要操作的表在实体层中创建一个类,每个数据表中的字段对应类中的属性。
(注:当然,事实上不是这样。为什么?
1>,可能我们需要的实体在数据表对应的实体中并不存在;
2>,我们完全可以将所有数据表中的所有字段都放在一个实体里)
(4)每一层(UI—>BLL—>DAL)之间的数据传递(单向)是靠变量或实体作为参数来传递的,这样就构造了三层之间的联系,完成了功能的实现。
但是对于大量的数据来说,用变量做参数有些复杂,因为参数量太多,容易搞混。比如:我要把员工信息传递到下层,信息包括:员工号、姓名、年龄、性别、工资....用变量做参数的话,那么我们的方法中的参数就会很多,极有可能在使用时,将参数匹配搞混。这时候,如果用实体做参数,就会很方便,不用考虑参数匹配的问题,用到实体中哪个属性拿来直接用就可以,很方便。这样做也提高了效率。
5、各层之间的联系:
(1)各层引用
UI层要引用BLL层和MODEL层。
BLL层要引用DAL层和MODEL层。
DAL层要引用MODEL层。
(2)参数传递
每一层(UI—>BLL—>DAL)之间的数据传递(单向)是靠变量或实体作为参数来传递的,这样就构造了三层之间的联系,完成了功能的实现。UI层把参数传给BLL层,BLL层把参数传给DAL层,是单向的,不能反传,即BLL层不能把参数传给UI层。
二、编写三层的一般步骤
(一) 建立三层项目前提及注意示项
(1)在解决方案上右键分别添加BLL,DAL,MODEL类库,UI层根据不同的要求可能会建成WINFORM或webform项目。。
(2)UI层引用BLL和MODEL;BLL引用DAL和MODEL;DAL引用MODEL;MODEL无引用。
(3)注意点:
实体类(MODEL)中,为每个实体(理解为要操作的表,即一个表为一个实体)建一个方法,以表名为方法名,字段名为表的各列的列名,并为字段建立属性。实体的作用是为三层存储或传递值。
在DAL层和BLL层中为每个数据库表建单独建立一个类,所有对这个表的操作都通过这个类中的方法实现。
注意各类中的名字空间的引用。最好定义规范的名字空间。如:项目为loready,那么建立MODEL类库时,就用loready.MODEL,DAL类库时用loready.DAL,BLL类库用loready.BLL。
(4)前提条件:
要有sqlhelper,且把sqlhelper放在DAL层中
如有p.confg要放在UI层中
(二) 建立三层的步骤及示例
1、确定需求
输入用户名和帐号后判断是否登录成功,如果成功则返回登录成功提示;如果用户名正确,密码错误,反回密码错误提示;如果没有此用户名,则返回没有此用户提示。
2、根据需求确定SQL语句以及要操作的数据库表。
"select Uno,Uname,Upasswd,Uremark from username whereUname=@uname";
//根据用户名可以查到相应用户名的ID,用户名,密码,备注信息。
3、根据要操作的数据库表写实体类,并为每个要操作的表建立一个单独的实体类。