一、框架的搭建
U层引用Model层
B层引用Model层和DAL层
D层引用Model层和数据库连接ImportsSystem.Data.SqlClient
二、UML图
1、类图
U层:Windows1
B层:LoginUser
D层:UserDAO
Model层:UerEn
2、时序图
3、包图(设计模式在代码中未体现,以后补充)
Link用来存储连接字符串及SQL语句(以后补充)
三、代码展示
1、实体类
- <span style="font-size:18px;">Public Class UserEn
- '定义所用到的属性
- Private _userName As String
- Public Property UserName As String
- Get
- Return _userName
- End Get
- Set(ByVal value As String)
- _userName = value
- End Set
- End Property
- Private _password As String
- Public Property Password As String
- Get
- Return _password
- End Get
- Set(ByVal value As String)
- _password = value
- End Set
- End Property
- End Class</span>
2、U层
- <span style="font-size:18px;">Imports Login.BLL '层中引用,在调用对象时不用写命名空间名
- Imports Model
- Public ClassStartWindow
- '退出程序
- Private Sub btnexit_Click(sender As Object,e As EventArgs) Handles btnexit.Click
- End
- End Sub
- '登录
- Private Sub btnOK_Click(sender As Object, eAs EventArgs) Handles btnOK.Click
- Try
- Dim user1 As New UserEn '实例化实体类,user1为实体类的对象
- Dim check As New LoginUser '实例化B层的LoginUser类
- Dim user As Boolean '定义布尔型变量,用来返回(也可定义为实体类型,返回实体类)
- <span style="font-size:18px;"> </span>user1.UserName =txtUserName.Text.Trim '把文本框用户名赋给实体类中的UserName
- user1.Password =txtPassword.Text '同理
- If txtUserName.Text = ""Then '判断用户名文本框是否为空
- MessageBox.Show("请输入用户名!")
- End If
- If txtPassword.Text = ""Then '同理
- MessageBox.Show("请输入密码!")
- End If
- user = check.Login(user1) '把B层Loin方法判断返回的值赋予user,左右同时为真则登录成功
- MessageBox.Show("成功登录!")
- Catch ex As Exception '捕获从B/D层抛出的异常
- MsgBox(ex.Message)
- End Try
- End Sub
- End Class</span>
3、B层
- <span style="font-size:18px;">Imports Model
- Imports Login.DAL
- Public ClassLoginUser
- Function Login(ByVal user1 As Model.UserEn)As Boolean
- Dim Dal As New UserDAO '实例化D层UserDAO对象
- Dim user2 As Boolean '定义变量
- user2 = Dal.SelectUser(user1) '调出D层方法SelectUser
- '判断返回结果
- If user2 Then
- Return True
- Else
- Throw NewException("登录失败!")
- Exit Function
- End If
- End Function
- End Class</span>
4、D层
- <span style="font-size:18px;"><span style="font-size:18px;">Imports Model
- ImportsSystem.Data.SqlClient '数据库连接需引用
- ImportsSystem.Data.SqlClient.SqlCommand
- Public Class UserDAO
- '连接数据库
- 'SqlConnection表示一个到 SQL Server数据库的打开的连接。此类不能被继承。
- Dim connDB As String ="Server=.;Database=MyLogin;User ID=sa;Password=123;"
- Dim connSQL As SqlConnection = NewSqlConnection(connDB)
- Function SelectUser(ByVal user1 AsModel.UserEn) As Boolean
- '把要执行的SQL语句赋给字符串变量sql
- Dim sql As String = "select * FromUserInfo where UserID=@UserName AND Password=@Password;"
- Dim cmd As SqlCommand = NewSqlCommand(sql, connSQL) '执行查询语句
- '通过把实体的相关内容赋给参数,再将参数带到数据库对比(防止SQL注入)
- cmd.Parameters.Add(NewSqlParameter("@UserName", user1.UserName))
- cmd.Parameters.Add(NewSqlParameter("@Password", user1.Password))
- '打开连接,读取数据
- connSQL.Open()
- Dim read As SqlDataReader =cmd.ExecuteReader()
- '若存在数据则返回True,否则相反
- If read.Read() Then
- Return True
- Else
- Return False
- Exit Function
- End If
- End Function
- End Class</span>
- </span>
结果:
四、知识点小结
1、传实体与传参数区别
在参数较少的情况下,使用传参比较方便;用的参数较多建议使用传实体,效率较高
注意:如果在界面上显示数据则设计到对实体的拆装箱操作
例子:C#语言
- <span style="font-size:18px;"> user.ID = reader.GetInt32(0);
- user.UserName = reader.GetString(1);
- user.Password = reader.GetString(2);
- if(!reader.IsDBNull(3))
- {
- user.Email = reader.GetString(3);
- }</span>
2、每层引用与单层Imports引用区别
层与层间引用:可以通过命名空间.类名,实现调用
层中Imports引用:直接写调用的类名即可
3、实例化对象与定义同类型变量区别
newUserEn()是指在内存中开辟了一块空间,创建了一个对象,然后让一个UserEn类型的变量user引用(指向)它。user也只不过是创建的那个实体对象的名称而已。