大家好,又见面了,我是你们的朋友全栈君。
一.概述
学完了三层,便开始利用三层的思想开始重构,代码并不重要,核心是需要了解三层之间的调用关系,信息是如何在三层之间传输的。
用三层来实现登录,主要思路是:
1.相应的创建LoginUI Windows窗体应用程序,LoginBLL、LoginDAL类库。
2.为了实现信息、数据的传输,需要在相应的类库中声明具有可以实现相应功能的类。
3.在类中又有实现对应功能的方法。
简单的说就是各层中的类下面的方法的调用。
从上图可以看出
1. 三层都需要引用实体层,在各层之间传递实体,根据需要返回相应的信息,可以是实体,可以是布尔值,还可以是其他信息。
2. 实线箭头的方向就代表了信息的传递
首先通过U层的一些事件调用B层的LoginManager类中的UserLogin方法
其次B层中的UserLogin方法调用D层下的LoginDAO类中的SelectUser方法。
最后所需要的信息原路返回。
上面这张图只是个人的理解思路。其实只要画出了顺序图,就已经可以根据顺序图写出代码了。
登录的顺序图:
二.实例
C#版
实体层
<span style="font-family:KaiTi_GB2312;font-size:18px;">namespace Login.Model
{
public class userInfo //userInfo类中封装了一些属性,用来在三层之间传数据
{
public int ID { get; set; } //get读,set写
public string UserName { get; set; }
public string Password { get; set; }
public string Email{get ;set ;}
}
} </span>
D层
<span style="font-family:KaiTi_GB2312;font-size:18px;">namespace Login.DAL
{
class DbUtil //连接数据库的类
{
public static string ConnString = @"Server=Jemis-dell;Database=Login;User ID = sa;Password=1"; //链接数据库的字符串
}
public class UserDAO //声明UserDAOI类
{
public Login .Model .userInfo SelectUser(string userName, string password) //声明引用了Model层的userInfo类的SelectUser方法
{
using (SqlConnection conn=new SqlConnection (DbUtil .ConnString)) //引用连接数据库的字符串,连接数据库
{
SqlCommand cmd=conn .CreateCommand (); //定义命令语句
cmd .CommandText =@"SELECT ID,UserName,Password,Email
FROM USERS WHERE UserName=@UserName AND Password=@Password";
cmd .CommandType =CommandType .Text ;
cmd .Parameters .Add (new SqlParameter ("@UserName",userName )); //为参数@UserName赋值
cmd .Parameters .Add (new SqlParameter ("@Password",password ));
conn.Open(); //打开数据库
SqlDataReader reader=cmd .ExecuteReader (); //读取数据
Login .Model .userInfo user=null ;
while (reader .Read ())
{
if (user ==null )
{
user =new Login .Model .userInfo ();
}
user .ID =reader .GetInt32 (0); //给实体层的属性写入数据
user .UserName =reader .GetString (1);
user .Password =reader .GetString (2);
if (!reader .IsDBNull (3))
{
user .Email =reader .GetString (3);
}
}
return user ; //将实体user返回到B层
}
}
}
}</span>
B层
<span style="font-family:KaiTi_GB2312;font-size:18px;">namespace Login.BLL
{
public class LoginManager
{
public Login .Model .userInfo UserLogin(string userName,string password)
{
Login .DAL .UserDAO uDao=new Login .DAL .UserDAO (); //引用D层的UserDAO类
Login .Model.userInfo user=uDao.SelectUser (userName ,password ); //引用实体层的SelectUser方法
if ( user != null )
{
return user ; //将实体user返回到U层
}
else
{
throw new Exception ("登录失败。");
}
}
}
}</span>
U层
<span style="font-family:KaiTi_GB2312;font-size:18px;">private void btnLogin_Click(object sender, EventArgs e)
{
string userName = txtUserName.Text.Trim(); //向实体层的属性中写入数据
string password = txtPassword.Text;
Login.BLL.LoginManager agr = new Login.BLL.LoginManager(); //引用
Login.Model.userInfo user = agr.UserLogin(userName, password);
MessageBox.Show("登录用户:" + user.UserName);
}</span>
.NET 版
实体层
<span style="font-family:KaiTi_GB2312;font-size:18px;">Public Class userInfo
'定义实体类userInfo
Private _userID As String
'声明数据库中字段信息
Public Property UserID As String
'读数据
Get
Return _userID
End Get
'写数据
Set(value As String)
_userID = value
End Set
End Property
Private _userPassword As String
Public Property UserPassword As String
Get
Return _userPassword
End Get
Set(value As String)
_userPassword = value
End Set
End Property
End Class</span>
D层
<span style="font-family:KaiTi_GB2312;font-size:18px;">'定义连接数据库类
Public Class DbUtil
'定义数据库连接字符串
Public connstring As String = "Server=Jemis-dell;Database=myCharge;User ID = sa;Password=1"
End Class
Public Class userInfo
'定义实体类userInfo
Private _userID As String
'声明数据库中字段信息
Public Property UserID As String
'读数据
Get
Return _userID
End Get
'写数据
Set(value As String)
_userID = value
End Set
End Property
Private _userPassword As String
Public Property UserPassword As String
Get
Return _userPassword
End Get
Set(value As String)
_userPassword = value
End Set
End Property
End Class</span>
B层
<span style="font-family:KaiTi_GB2312;font-size:18px;">Public Class LoginManager
Public Function UserLogin(ByVal user As userInfo) As Boolean
Dim mUser As New userInfo
Dim dUser As New UserDAO
'实例化userInfo
Dim loginUser As New userInfo
'调用D层的SelectUser方法
loginUser = dUser.SelectUser(user)
Dim flag As Boolean
'判断数据库中是否存在登录用户
If (loginUser Is Nothing) Then
flag = False
Else
flag = True
End If
'将flag返回到U层
Return flag
End Function
End Class</span>
U层
<span style="font-family:KaiTi_GB2312;font-size:18px;">Public Class frmLogin
Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click
Dim user As New userInfo
Dim bUser As New LoginManager
Dim flag As Boolean
If txtUserID.Text = "" Then
MsgBox("用户名不能为空")
txtUserID.Focus()
Return
End If
If txtPWD.Text = "" Then
MsgBox("密码不能为空")
txtPWD.Focus()
Return
End If
’向实体层写入数据
user.UserID = txtUserID.Text.Trim()
user.UserPassword = txtPWD.Text()
flag = bUser.UserLogin(user)
If (flag = True) Then
frmMain.Show()
Me.Hide()
Exit Sub
Else
MessageBox.Show("登录失败")
End If
End Sub
End Class</span>
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/105768.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...