机房重构-七层登录(上)

内容:

话不多说,我们先来看看七层登录的包图吧。相信我们看了包图就能多少直观了解七层登录各个层之间是一种怎样的依赖关系,一张图胜过千言万语。

一、七层登录的包图:


二、七层登录的组成及作用

通过上图,我们也可以知道了,七层包括:

(1)UI层(表示层):展现给用户的界面,为用户提供一种交互的界面,真真切切能够看到的界面。负责数据的输入和输出,对输入的东西进行最基本的判断,符合后将数据(参数)传入外观层进行

(2)Facade层:解耦和,将U层和B层分开,U层不知道B 层的存在。一旦有所改动,只需更改U层,增加一个B层就可以了。跟设计模式中的外观模式差不多,下面看个外观模式的图:



(3)BLL层:主要是数据库返回的信息进行逻辑判断,调用了工厂和接口的方法

(4)Factory层:使用抽象工厂,反射和配置文件,从而实现对数据库的随时更换。B层通过IDAL层的接口访问DAL层

(5)IDAL层:定义了接口,解耦B 层和D层

(6)DAL层:实现接口层的方法

(7)Entity层:封装数据,携带参数的传递。(像火车一样,临时装载东西运输)

SQLHelper:连接数据库,对数据库进行增删改查。

三、代码展示

根据各个层的调用关系,我们敲七层的时候可以从最基础的实体层一步步往上敲,因为每一层都会调用下一层的方法。这里我把工作记录和登录都展示着了,大家可以先敲登录,熟悉过程,再敲工作记录。

1、Entity层

注意:属性名字必须跟数据库里面的字段对应,否则就会出错。大小写可以忽略。

(1)登录实体:

Public Class Entity
    Private _userName As String
    Private _PWD As String
    Private _userLevel As String
    Private _userID As String
    Private _state As String
    '自动生成get/set---直接输入prop ,然后连按两下tab
    '
    Public Property userID() As Integer
        Get
            Return _userID
        End Get
        Set(value As Integer)
            _userID = value
        End Set
    End Property
    Public Property userName() As String
        Get
            Return _userName
        End Get
        Set(value As String)
            _userName = value
        End Set
    End Property
    Public Property PWD() As String
        Get
            Return _PWD
        End Get
        Set(value As String)
            _PWD = value
        End Set
    End Property
    Public Property Level() As String
        Get
            Return _userLevel
        End Get
        Set(value As String)
            _userLevel = value
        End Set
    End Property


    Public Property state() As String
        Get
            Return _state
        End Get
        Set(ByVal value As String)
            _state = value
        End Set
    End Property

End Class
(2)工作记录实体

Public Class WorkLogEntity
    Private _userID As String
    Private _loginDate As String
    Private _logoutDate As String
    Private _state As String
    Public Property UserID() As String
        Get
            Return _userID
        End Get
        Set(ByVal value As String)
            _userID = value
        End Set
    End Property
    Public Property LoginDate() As String
        Get
            Return _loginDate
        End Get
        Set(ByVal value As String)
            _loginDate = value
        End Set
    End Property
    Public Property LogoutDate() As String
        Get
            Return _logoutDate
        End Get
        Set(ByVal value As String)
            _logoutDate = value
        End Set
    End Property
    Public Property State() As String
        Get
            Return _state
        End Get
        Set(ByVal value As String)
            _state = value
        End Set
    End Property



End Class
(3)定义了一个全局变量,将登陆的实体信息与通过全局变量跟工作记录实体连接起来,用于判断用户级别
Public Class CommonVariable
    Public Shared CommonUserID As String
    Public Shared CommonUserPWD As String
End Class


2、SQLHelper层

根据SQLHelper这个单词,就可以知道是跟数据库打交道的,他的功能就是对数据库进行增删改查,将DAl层解放出来。

(1)根据参数有无,可分为:有参数和无参数;

(2)根据有无返回值,可分为:查询 和增删改查

Imports System.Configuration

'表示代码引入微软发布sqlserver数据库ado.net程序集引入使用SqlConnection、SqlCommand等数据库对象来访问sqlserver数据库
Imports System.Data.SqlClient

Public Class sqlhelper
    '定义变量,获得数据库连接字符串
    Dim str As String = System.Configuration.ConfigurationSettings.AppSettings("sqlConnStr")
    '设置连接
    Dim conn As SqlConnection = New SqlConnection(str)
    '定义command命令
    Dim cmd As New SqlCommand

    '查询操作,带参数,返回结果是表  
    Public Function ExecSelect(ByVal cmdText As String, cmdType As CommandType, ByVal paras As SqlParameter()) As DataTable
        'Public shared Function ExecSelect(ByVal cmdText As String, cmdType As CommandType, ByVal paras As SqlParameter()) As DataTable

        'shared ---分享,   public,private用在模块或类中,表示全局或私有变量;
        ' dim,static用在过程中,dim表示私有变量,static表示静态变量,在过程反复调用时数据不被破坏;


        'parameter 参数
        Dim adp As New SqlDataAdapter  '是DataSet和SQL server之间的桥接器,用于检索和保存数据  
        Dim dt As New DataTable   '定义变量返回数据表
        Dim ds As New DataSet   '定义数据集对象,用于存储临时数据表


        '将传入的值,分别为cmd的属性赋值

        cmd.CommandText = cmdText    '设置查询sql语句
        cmd.CommandType = cmdType    '设置一个值,解释cmdText
        cmd.Connection = conn        '设置数据库连接

        'SqlParameter给我们提供了一个很好的类,有了它,我们可以不现拼接字符串,也可以不再担心单引号带来的惨剧
        'SqlParameter 类表示 SqlCommand 的参数,也可以是它到 DataSet 列的映射。无法继承此类。
        cmd.Parameters.AddRange(paras)  '传入参数   Add方法在添加多个SqlParameter时不方便,此时,可以采用AddRange方法。
        adp = New SqlDataAdapter(cmd)   '实例化适配器

        Try
            adp.Fill(ds)             '用adapter将dataset填充
            dt = ds.Tables(0)        'datatable 是dataset的第一个表
            cmd.Parameters.Clear()   '清除参数

        Catch ex As Exception    '通过ex,显示该异常内容
            MsgBox("查询失败", CType(vbOKOnly + MsgBoxStyle.Exclamation, MsgBoxStyle), "警告")

        Finally

            Call CloseCmd(cmd)      '释放cmd

        End Try

        Return dt                  '返回查询到的数据
    End Function

    '查询操作,不带参数,返回结果是表
    Public Function ExecSelectNo(ByVal cmdText As String, ByVal cmdType As CommandType) As DataTable
        Dim adp As New SqlDataAdapter   '定义数据适配器变量,并实例化将cmd绑定在adapter上面
        Dim ds As New DataSet

        cmd.CommandText = cmdText   '设置查询sql语句
        cmd.CommandType = cmdType   '设置一个值,解释cmdText
        cmd.Connection = conn       '设置数据库连接
        adp = New SqlDataAdapter(cmd)

        Try
            adp.Fill(ds)             '用adapter将dataset填充 
            Return ds.Tables(0)      '返回datatable的第一个表  
        Catch ex As Exception        '遇见错误就抛出
            Return Nothing
        Finally
            Call CloseCmd(cmd)   '关闭cmd
        End Try



    End Function
    '增删改操作,带参数,没有返回结果 
    Public Function ExecAddDelUpdate(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal paras As SqlParameter()) As Integer
        cmd.Parameters.AddRange(paras)        '将参数传入

        '为要执行的命令cmd赋值
        cmd.CommandText = cmdText   '设置查询sql语句
        cmd.CommandType = cmdType   '设置一个值,解释cmdText
        cmd.Connection = conn       '设置数据库连接

        Try
            conn.Open()                     '打开链接
            Return cmd.ExecuteNonQuery      '执行增删改查操作

        Catch ex As Exception
            MsgBox(ex.Message, , "数据库操作")
        Finally
            cmd.Parameters.Clear()          '清除参数
            Call CloseConn(conn)
            Call CloseCmd(cmd)
        End Try
    End Function
    '增删改操作,无参数,没有返回结果 
    Public Function ExecAddDelUpdateNo(ByVal cmdText As String, ByVal cmdType As CommandType) As Integer

        '为要执行的命令cmd赋值
        cmd.CommandText = cmdText   '设置查询sql语句
        cmd.CommandType = cmdType   '设置一个值,解释cmdText
        cmd.Connection = conn       '设置数据库连接

        Try
            conn.Open()                     '打开链接
            Return cmd.ExecuteNonQuery      '执行增删改查操作

        Catch ex As Exception
            Return Nothing
        Finally

            Call CloseConn(conn)
            Call CloseCmd(cmd)
        End Try
    End Function

    Private Sub CloseCmd(ByVal cmd As SqlCommand)
        If Not IsNothing(cmd) Then       '如果cmd命令还在
            cmd.Dispose()                '释放资源
            cmd = Nothing                '不指向原对象
        End If
    End Sub

    Private Sub CloseConn(ByVal conn As SqlConnection)
        If (conn.State <> ConnectionState.Closed) Then  '如果没有关闭
            conn.Close()                                '关闭连接
            conn = Nothing                              '不指向原对象
        End If
    End Sub

End Class



3、IDAL层

因为IDAL层里面是接口,DAL要去实现这个接口中的方法。

(1)登录接口:

Imports System.Reflection
Imports Entity.Entity



Public Interface LoginIDAL
    '定义查找用户的方法,用于数据库中查找用户
    Function selectUser(ByVal UserInfo As Entity.Entity) As List(Of Entity.Entity)
    '更改用户登录状态
    Function UpdataUserStatus(ByVal UserInfo As Entity.Entity) As Boolean

End Interface
(2)工作记录接口

Imports System.Reflection
Imports Entity.Entity

Public Interface IWorkLog
    '插入工作记录
    Function InsertWorkLog(ByVal worklog As Entity.WorkLogEntity)
End Interface

4、DAL层

(1)登录

Imports IDAL
Imports System.Reflection

'SQL Server 的 .NET Framework 数据提供程序。表示代码引入微软发布sqlserver数据库ado.net程序集引入使用SqlConnection、SqlCommand等数据库对象来访问sqlserver数据库
Imports System.Data.SqlClient
Imports Entity
Imports SQLHelper
'提供对表示ADO.net结构的类的访问
Imports System.Data


Public Class LoginDAL : Implements IDAL.LoginIDAL
    '查询用户
    '实现接口中定义的方法
    Public Function selectUser(ByVal UserInfo As Entity.Entity) As List(Of Entity.Entity) Implements IDAL.LoginIDAL.selectUser
        Dim sqlhelper As New SQLHelper.sqlhelper
        Dim cmdType As CommandType = New CommandType()
        Dim mylist As List(Of Entity.Entity)


        Dim sqlParams As SqlParameter() = {New SqlParameter("@userID", UserInfo.userID),
                                           New SqlParameter("@PWD", UserInfo.PWD)}
        Dim cmdText As String
        cmdText = "select * from User_Info where userID =@userID and PWD =@PWD "

        Dim dt As New DataTable
        dt = sqlhelper.ExecSelect(cmdText, CommandType.Text, sqlParams)

        mylist = ConvertHelper.convertToList(Of Entity.Entity)(dt)
        Return mylist
    End Function

    '更改用户登录状态
    Public Function UpdateUserStatus(ByVal UserInfo As Entity.Entity) As Boolean Implements IDAL.LoginIDAL.UpdataUserStatus
        Dim sqlhelper As New SQLHelper.sqlhelper
        Dim dt As New Integer
        Dim sqlParams As SqlParameter() = {New SqlParameter("@userID", UserInfo.userID),
                                           New SqlParameter("@state", "True")}

        Dim sql As String = "Update User_Info set state=@state where userID =@userID "
        dt = sqlhelper.ExecAddDelUpdate(sql, CommandType.Text, sqlParams)
        If dt > 0 Then
            Return True
        Else
            Return False
        End If

    End Function

End Class


(2)工作记录

Imports System.Data.SqlClient
Imports System.Data
Public Class WorkLogDAL : Implements IDAL.IWorkLog

    '插入工作记录
    Public Function InsertWorkLog(worklog As Entity.WorkLogEntity) Implements IDAL.IWorkLog.InsertWorkLog
        Dim sqlhelper As New SQLHelper.sqlhelper
        Dim dt As Integer
        worklog.LoginDate = Format(Now, "yyyy-MM-dd HH:mm:ss")
        '声明并实例化参数数组
        Dim sqlParams As SqlParameter() = {New SqlParameter("@UserID", Entity.CommonVariable.CommonUserID),
                                           New SqlParameter("@LoginDate", worklog.LoginDate),
                                           New SqlParameter("@state", True)}

        Dim sql As String = "Insert into worklog_Info(UserID,LoginDate,state )values(@UserID,@LoginDate,@state)"
        dt = sqlhelper.ExecAddDelUpdate(sql, CommandType.Text, sqlParams)

        If dt > 0 Then
            Return True
        Else
            Return False
        End If

    End Function
End Class
三、注意:

1、实体中,属性名跟数据库字段需要对应,大小写可忽略。

2、根据调用关系,先写实体层,在一步步往上写,直到U层;因为每一层都调用下一个层的东西,因此先写后面那层比较好。根据自己情况想怎么来就怎么来。

3、实体和Datatable的区别:

实体是面向对象的,本身可看做是对象属性的集合(例如:你是学生,这个实体就可看做是学生,他可以有许多属性(姓名,年龄,用户名,密码等等);在数据库中,数据库学生表中的一行信息可代表一个学生实体);

Datatable字面意思就是数据表的意思,他是从数据库查询出来得到的一张表,里面可以有多行信息。每行信息都可看做是一个学生实体。

四、这篇有点长,下篇博客继续 :

博客链接:http://blog.csdn.net/tgbyn/article/details/75947882






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值