简述
通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问(DAL)。
实例 vb.net 登录界面
这是一个经过改版的登录,视频里的用c#来实现的。
使用的工具:sql server 2010 、vs 2010
建立数据库:Login 表:Scores、 Users
Score表
Users表
LoginModel(实体层)
创建实体层LoginModel,建立Userinfo类,存储从UI返回的数据。这里我们称为业务实体层,因为他也是为业务逻辑服务的。
Public Class UserInfo Private _ID As String Private _Username As String Private _Password As String Private _Email As String Public Property ID As Integer Get Return _ID End Get Set(ByVal value As Integer) _ID = value End Set End Property Public Property Username As String Get Return _Username End Get Set(ByVal value As String) _Username = value End Set End Property Public Property Password As String Get Return _Password End Get Set(ByVal value As String) _Password = value End Set End Property Public Property Email As String Get Return _Email End Get Set(ByVal value As String) _Email = value End Set End Property End Class
LoginBLL(业务逻辑层)
UI层调用业务逻辑层来执行登录的操作。可以看到真正的操作是在BLL层,而不是在loginUI上面的。
Public Class LoginService '自定义函数,返回实体层类的数据 Public Function userlogin(ByVal Username As String, ByVal Password As String) As Login.Model.UserInfo Dim uDao As New Login.DAL.UserDAO '引用DAL层,声明必要类 Dim user As New Login.Model.UserInfo Dim sDao As New Login.DAL.ScoreDAO user = uDao.SelectUser(Username, Password) '根据参数确定返回值 If (user Is Nothing) Then '返回Nothing处理 Throw New Exception("登录失败!") Else sDao.UpdateScore(Username, 10) '登陆成功,调用DAL加分机制 Return user End If End Function End Class
LoginDAL(数据访问层)
这里的数据访问层有连接数据库,查询数据的作用。当然这里的连接数据库也可以并到一起,但是这样如果用到其他类型的数据源的话。就不需要打开其他的
类,增加错误的可能性。降低了耦合性。
DBconstr类
Public Class DBConstr Public Shared Function connstring() As String connstring = "Server=192.168.24.61;Database=Login;User ID=sa;Password=123456" '或者将IP换成localhost也是可以的 End Function End Class
这里的server也可以是你的电脑名,也可以是localhost。
ScoresDAO类
Public Class ScoreDAO Public Sub UpdateScore(ByVal Username As String, ByVal value As Integer) Dim conn As SqlClient.SqlConnection Dim cmd As SqlClient.SqlCommand conn = New SqlClient.SqlConnection(DBConstr.connstring) '连接数据库 cmd = conn.CreateCommand() '创建插入命令 cmd.CommandText = "Insert INTO Scores(Username,Score) Values (@Username,@Score)" '插入字符串 cmd.Parameters.Add(New SqlClient.SqlParameter("@Username", Username)) '创建参数Username cmd.Parameters.Add(New SqlClient.SqlParameter("@Score", value)) '创建参数value conn.Open() '打开连接 cmd.ExecuteNonQuery() '执行插入命令 conn.Close() End Sub End Class
每登录一次,增加十个积分。插入数据的功能
UserDAO类
Public Class UserDAO '自定义函数,利用参数返回表中的数据 Public Function SelectUser(ByVal userName As String, ByVal passWord As String) As Login.Model.UserInfo '引用userinfo类的成员 Dim con As SqlClient.SqlConnection '建立到数据库的连接 Dim cmd As SqlClient.SqlCommand '使用Command对象执行命令并返回。 con = New SqlClient.SqlConnection(DBConstr.connstring()) '传入sql语句 cmd = con.CreateCommand() '在执行命令时,需要指定一个在数据源上执行的sql语句和Connection对象 '根据username和password查询数据 cmd.CommandText = "select ID,Username,Password,Email from Users Where Username=@userName and Password=@password" cmd.CommandType = CommandType.Text '添加命令参数,@username为参数,username为参数值 cmd.Parameters.Add(New SqlClient.SqlParameter("@userName", userName)) cmd.Parameters.Add(New SqlClient.SqlParameter("@Password", passWord)) con.Open() '打开连接 Dim reader As SqlClient.SqlDataReader '定义一次查询,用while读取每行内容 reader = cmd.ExecuteReader() '执行查询(将 CommandText 发送到 Connection 并生成一个 SqlDataReader。) Dim user As Login.Model.UserInfo user = Nothing While (reader.Read()) '读取text里的内容 If user Is Nothing Then user = New Login.Model.UserInfo End If user.ID = reader.GetInt32(0) '将第一个内容转换为32位的int类型并赋值给实体层的userinfo user.Username = reader.GetString(1) '将第二个内容转换为字符串类型并赋值给实体层的userinfo user.Password = reader.GetString(2) If (Not reader.IsDBNull(3)) Then '判断是否存在数据(也就是说,有Email就赋值进去,没有也可以。),返回bool值 user.Email = reader.GetString(3) End If End While Return user '返回查询结果 End Function End Class
查询用户,利用参数传入数据。防止sql 注入。
LoginUI层
这里只负责将执行后的结果展现给用户,不能有一点点的判断过程。
Public Class Form1 Private Sub btnLogin_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnLogin.Click Dim username As String Dim password As String username = txtUsername.Text '输入DAL.UserDAO类自定义函数参数,用来查询表中符合的数据 password = txtPassword.Text Dim buser = New Login.BLL.LoginService '引入业务逻辑层的userlogin操作 Dim user = buser.userlogin(username, password) '传参 MessageBox.Show("您好,登陆成功!登录用户:" + username) End Sub End Class
小结:三层就是一个解耦和和隔离功能块这种编程思想的体现,无所谓三层、四层。就是将某个功能抽离出来分为一个独立的层,这种分离当然是需要有一定依据的。这样一
来,各个模块之间的影响就大大的减少。而对于复用、扩展、修改都是很方便的。