何为三层?
三层架构就是为了符合“高内聚,低耦合”思想,把各个功能模块划分为表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)三层架构,各层之间采用接口相互访问,并通过对象模型的实体类(Entity)作为数据传递的载体,不同的对象模型的实体类一般对应于数据库的不同表,实体类的属性与数据库表的字段名一致。
看定义看不明白不要紧,上图
将上面的需求、内容抽象一下,就出了包图。(Entity类与Model类先近似认为一样)
在代码中如何实现
写代码就跟盖楼一样,先做地基、才能有上层建筑。UI层、BLL层、DAL层都引用了Model(实体)层。所以我们先写Model层。
namespace Login.Model { /// <summary> ///实体类,用于保存用户信息。一个SQL表对应一个实体类 /// </summary> public class UserInfo { /// <summary> /// 封装数据 /// </summary> public int ID { get; set; } public string UserName { get; set; } public string Password { get; set; } public string Email { get; set; } } }
DAL层的思维逻辑
1、在数据访问实现类中引用业务实体项目命名空间
2、实例化SqlConnection对象,实现数据库连接
3、实例化SqlCommand对象,执行SQL命令
4、实例化SqlDataReader对象,读取数据
5、使用实体类传递信息
层层相扣、D层需要引用Model层。具体代码如下(有详细注释哦,认真阅读)
namespace Login.DAL_ { class DbUtil { //创建数据库连接字符串 public static string ConnString = @"Server =ZYB; Database =Login; User ID = sa;Password =123456"; } }
namespace Login.DAL_ { /// <summary> /// User类 /// </summary> public class UserDAO { public Login.Model.UserInfo SelectUser(string userName, string password) { //实例化SqlConnection对象,实现数据库连接 using (SqlConnection conn = new SqlConnection(DbUtil.ConnString)) //没有分号,释放资源 { //实例化SqlCommadn对象,执行SQL命令(对数据库执行操作) SqlCommand cmd = conn.CreateCommand(); //连接数据库中的User表(连接数据库的代码容易出错) cmd.CommandText = @"SELECT ID,UserName,Password,Email FROM USERS WHERE UserName=@Username AND Password=@Password"; cmd.CommandType = CommandType.Text; //给命令对象添加参数,将userName的值传给@UserName cmd.Parameters.Add(new SqlParameter("@UserName",userName)); cmd.Parameters.Add(new SqlParameter("@Password",password)); //打开数据库连接,添加后解决conn关闭异常 conn.Open(); //若要创建 SqlDataReader,必须调用 SqlCommand 对象的 ExecuteReader 方法,而不要直接使用构造函数。 SqlDataReader reader = cmd.ExecuteReader(); //SqlDateReader reader = cmd.ExecuteReader();//字母打错了 //使用实体类传递信息,初始值为null 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; } } } }
namespace Login.DAL_ { /// <summary> /// 加分类 /// </summary> public class ScoreDAO { public void UpdateScore(string userName, int value) { //实例化SqlConection对象,实现数据库连接 using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))//自动释放资源 { 实例化SqlCommadn对象,执行SQL命令(对数据库执行操作) SqlCommand cmd = conn.CreateCommand(); //连接数据库中的Scores表(连接数据库的代码容易出错) cmd.CommandText = @"INSERT INTO SCORES(UserName,Score) Values(@UserName,@Score)"; cmd.Parameters.Add(new SqlParameter("@UserName",userName)); cmd.Parameters.Add(new SqlParameter("@Score",value)); //打开数据库 conn.Open(); //对数据库进行更新,使用ExecuteNonQuery()方法 cmd.ExecuteNonQuery(); } } } }
BLL层的思维逻辑
1、在业务逻辑处理类中引用数据访问层、业务实体层命名空间
2、实例化数据访问对象
3、调用数据访问功能
4、实现业务逻辑处理功能
层层相扣,B层需要引用D层、Model层,具体代码如下。
namespace Login.BLL { public class LoginManager { public Login.Model.UserInfo userLogin(string userName, string password) { //业务逻辑层需要调用数据访问层 //实例化数据访问对象uDao Login.DAL_.UserDAO uDao=new Login.DAL_.UserDAO(); //调用数据访问功能,将访问到的数据赋值给user Login.Model.UserInfo user= uDao.SelectUser(userName,password); //实现业务逻辑处理功能 if (user!=null)//数据一致,登录成功 { //实例化一个加分对象 Login.DAL_.ScoreDAO sDao = new Login.DAL_.ScoreDAO(); //进行加分更新 sDao.UpdateScore(userName,10); //返回用户 return user; } else { //一个throw,对应一个catch,并且弹出的内容显示在U层 throw new Exception("登录失败!"); } } } }
UI层的思维逻辑
1、在窗体后台实现类中引用业务逻辑层、业务实体层命名空间
2、实例化业务逻辑处理对象和业务实体对象
3、数据绑定
4、调用业务逻辑层功能
层层相扣,U层需要引用B层、Model层。
private void btnOK_Click(object sender, EventArgs e) { try { //定义变量userName,password 取出用户界面的数据 string userName = txtName.Text.Trim(); string password = txtPassword.Text; //UI层需要调用BLL层,实例化一个具体执行业务逻辑得到对象mgr, Login.BLL.LoginManager mgr = new Login.BLL.LoginManager(); //调用BLL层的方法,将用户输入的信息作为参数传入方法 //数据绑定,将用户输入的信息赋值给实体 Login.Model.UserInfo user = mgr.userLogin(userName, password); MessageBox.Show("登录成功!!!" + userName); } //如果登录异常,则提示登录失败,catch 对应B层的try catch (Exception ex) { MessageBox.Show(ex.Message); } }