内容:
话不多说,我们先来看看七层登录的包图吧。相信我们看了包图就能多少直观了解七层登录各个层之间是一种怎样的依赖关系,一张图胜过千言万语。
一、七层登录的包图:
二、七层登录的组成及作用
通过上图,我们也可以知道了,七层包括:
(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
根据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