简述
通常意义上的三层架构就是将整个业务应用划分为:表现层(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
小结:三层就是一个解耦和和隔离功能块这种编程思想的体现,无所谓三层、四层。就是将某个功能抽离出来分为一个独立的层,这种分离当然是需要有一定依据的。这样一
来,各个模块之间的影响就大大的减少。而对于复用、扩展、修改都是很方便的。