• 三层架构及实例演示


    简述

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


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

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

  • 相关阅读:
    win7系统如何一键清理系统垃圾【系统天地】
    win7无法正常关机的解决方法【系统天地】
    win10系统开机停在请稍候解决教程【系统天地】
    Win7系统一直提示盗版怎么办【系统天地】
    windows8 flash修复怎么操作【系统天地】
    win7电脑运行速度慢如何解决【系统天地】
    Win10系统如何自动清理垃圾缓存文件【系统天地】
    Win7启用NFS服务设置的方法【系统天地】
    win7系统获得管理员取得所有权的方法【系统天地】
    Ubuntu16.04+hadoop2.7.3环境搭建
  • 原文地址:https://www.cnblogs.com/guziming/p/4232747.html
Copyright © 2020-2023  润新知