三层架构及实例演示

简述

通常意义上的三层架构就是将整个业务应用划分为:表现层(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


小结:三层就是一个解耦和和隔离功能块这种编程思想的体现,无所谓三层、四层。就是将某个功能抽离出来分为一个独立的层,这种分离当然是需要有一定依据的。这样一

来,各个模块之间的影响就大大的减少。而对于复用、扩展、修改都是很方便的。

转载于:https://www.cnblogs.com/guziming/archive/2013/03/24/4232747.html

你可能感兴趣的:(三层架构及实例演示)