经过了几天的三层的学习,从刚刚开始的什么都不懂到现在的三层的实现,虽然学的不是很好,但是还是感觉有收获的。
三层由U层、B层和D层组成,当然还有实体层,但是实体层不属于三层里的,它是一个被三个层次来回调用的实体层,是用来封装数据的(我是这样认为的)
【三层的解决方案】
其中,
在B层创建一个LoginManager类
在D层创建三个类:DBUtil类(作用:用来连接数据库)
ScoreDAO类:(作用:用来增加积分)
UserDAO类:(作用:用来查找人员)
在U层创建一个form应用窗体(作用:用来显示数据)
在实体层创建一个UserInfo类(作用:用来封装数据,相当于一个数据的集合)
【代码展示】
U层代码
<span style="font-family:KaiTi_GB2312;font-size:24px;">namespace LoginUI
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnlogin_Click(object sender, EventArgs e)
{
//从前台获取UserName 和Password
string userName = txtUserName.Text.Trim();
string password = txtPassword.Text;
//构造一个Manager的实例
Login.BLL.LoginManager mgr = new LoginManager();
Login .Model .UserInfo user = mgr.UserLogin(userName,password);
//提示
MessageBox.Show("登录用户" + user.UserName);</span>
<span style="font-family:KaiTi_GB2312;font-size:24px;"><span style="white-space:pre"> </span> }
private void txtUserName_TextChanged(object sender, EventArgs e)
{
}
}
}
</span>
B层代码
namespace Login.BLL
{
public class LoginManager
{
public Login.Model.UserInfo UserLogin(string userName, string password)
{
throw new NotImplementedException();
//构建D层UserDAO实例
Login.DAL.UserDAO uDao = new UserDAO();
Login.Model.UserInfo user = uDao.SelectUser(userName, password);
//构建实体层的实例
Login.Model.UserInfo userInfo = new UserInfo();
//判断是否登录成功
if (user !=null )
{
//实例化D层的积分类
Login.DAL.SocreDAO sDao = new SocreDAO();
sDao.UpdateSocre(userName, 10);
return user;
}
else //登录失败
{
throw new Exception("登录失败");
}
}
}
}
D层代码
UserDAO类的代码
<span style="font-family:KaiTi_GB2312;font-size:24px;">namespace Login.DAL
{
public class UserDAO
{
public Login.Model.UserInfo SelectUser(string userName, string Password)
{
//获取一个sqlconnection
using (SqlConnection conn = new SqlConnection(DBUtil.ConnString))//有了Using之后,connection就可以自动关闭了
{
//创建一个cmd实例
SqlCommand cmd = conn.CreateCommand();
//SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = @"SELECT ID ,UserName,Password.Email FROM USERS WHERE UserName=@UserName AND Password=@Password";
//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 ));
cmd.Parameters.Add(new SqlParameter("@Password",Password ));
SqlDataReader reader = cmd.ExecuteReader();
Login.Model.UserInfo user = null;
//读取具体数据
while (reader.Read())
{
if (user == null)
{
user = new Model.UserInfo();//如果为空,则延迟加载
}
user.ID = reader.GetInt32(0);
user.UserName = reader.GetString(1);
user.Password = reader.GetString(2);//不建议密码从数据库里面取出来
//当Email为空的时候
if (!reader.IsDBNull(3))
{
user.Email = reader.GetString(3);
}
}
return user;
}
}
}
}
</span>
ScoreDAO类代码:
<span style="font-family:KaiTi_GB2312;font-size:24px;">namespace Login.DAL
{
public class SocreDAO
{
public void UpdateSocre(string userName, int value)
{
using (SqlConnection conn = new SqlConnection(DBUtil.ConnString))
{
//创建一个COMMAND
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText=@"INSERT INTO SCORES(UserName,Score)Values(@UserName,@Score)";
cmd .Parameters.Add(new SqlParameter("@UserName",userName));
cmd .Parameters.Add (new SqlParameter("@Score",value ));
cmd.ExecuteNonQuery();
}
}
}
}
</span>
DBUtil类代码:
namespace Login.DAL
{
public class DBUtil
{
public static string ConnString = @"Server=张旭;Database=Login;User ID=sa;Password=123";
//throw new NotImplementedException ();
}
}
实体类代码:
namespace Login.Model
{
public class UserInfo
{
public int ID{get ;set ;}
public string UserName { get; set; }
public string Password { get; set; }
public string Email { get; set; }
}
}
【小结】
学习了三层之后,感觉代码其实很好理解。其中业务逻辑层最重要,数据访问层负责访问数据库,没有任何的逻辑运算,界面层只负责显示数据。
在D层的时候,连接数据库的时候的语句感觉还是不能灵活的运用,还需要回过头在学习一遍。
总之,简单也好难也好,主要的是自己去静下心去学习。