三层浅识

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dsl59741/article/details/81747955

1.为什么要用三层,什么时候用?

当数据复杂到一定程度时,需使用三层,实现三层脱离。达到“高内聚,低耦合”的目的。

2.三层

物理上(硬件划分):显示层/业务层/数据层

逻辑上:

UI+BLL+DAL(user interface layer)(Business logic layer)(Data access layer)(界面层(显示层)+业务逻辑层+数据访问层)

UI:产生用户信息,知道用户的操作(如登录/退出),请求服务,只是把用户数据传输给BLL,然后数据经BLL处理后,从BLL中拿到处理后的相关数据,不包含任何业务处理。(windows窗体应用)不直接跟数据源打交道,需要BLL的支持。

尽量界面简洁,省钱。

BLL:进行业务逻辑处理

 DAL:仅限于和数据源打交道(读\写\删除数据源中的数据)类库。具体访问数据源的对象→DAO:(data acess object)有几个处理业务,几个DAO

扫描二维码关注公众号,回复: 4432335 查看本文章

在DAL层,会添加一个model类,用于封装数据,便于在三层之间更有效地传输数据,独立于其他三个层次,不会引用其他三个层次,但是其他层次需要引用此类,用于连接数据库。

注意三层的使用时,进行命名空间的修改(properties)

三层逻辑

U层

namespace LoginUI
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnLogin_Click(object sender, EventArgs e)
        {
            string userName = txtUserName.Text.Trim();   //userName连接数据库中的userName,去掉显示的空格
            string password = txtPassword.Text;     //同上,连接Password

            Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();//构造实例,U层连接B层,进行业务实时逻辑处理,在这其中,B层掉用D层,进行数据库连接,进行B层的业务逻辑处理
           Login.Model.UserInfo user= mgr.UserLogin(userName,password); //mgr调用User.login的方法,将获取的用户名和密码封装,再利用引用类型model,更好地传输数据,将B层已经经过处理地数据封装,传给U层
            MessageBox.Show("登录用户:" + userName);//显示相关数据

        }
    }
}

U层调用B层(即B层)

namespace Login.BLL//业务逻辑层实现
{
    public class LoginManager
    {

        public Login.Model.UserInfo UserLogin(string userName, string password)//两个参数
        {
            //throw new NotImplementedException();
            Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();//连接D层,根据业务进行实例化,DAO
            Login.Model.UserInfo user = uDao.SelectUser(userName, password);//封装数据,将U层显示的数据封装,更好地传给D层,进行业务逻辑处理
            if (user != null)  //login successfully    业务1.登录成功,在D层中的表,根据用户名和密码显示不为空
            {
                Login.DAL.ScoreDAO sDAO = new Login.DAL.ScoreDAO();//业务2,登录成功,开始加分,实例化业务2,连接D层,调用D层数据库
                sDAO.UpdateScore(userName, 10);//B层与D层交互,具体业务处理
                return user; //返回用户名
            }
            else
            {
                throw new Exception("登录失败");//非报错现象,显示登录不成功
           }
          
        }
    }
}

B层调用D层(即D层,D层具体访问数据对象)(UserDAO+ScoreDAO+DBUtil(连接SQLServer))

namespace Login.DAL     //与B层交互,进行业务逻辑实现
{
   public  class UserDAO
    {
        public Login.Model.UserInfo SelectUser(string userName,string password)//封装数据,调用方法,设置参数
        {
            using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))//调用dbutil,连接数据库,实现连接
            {
                SqlCommand cmd = conn.CreateCommand();   //建立查询,利用一个现有conn建立一个command,用来执行sql命令
                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));//根据查询语句,添加参数,传值,数据库与间接的U层
                cmd.Parameters.Add(new SqlParameter("@Password", password));
                conn.Open();//数据库打开

                SqlDataReader reader = cmd.ExecuteReader();  //查询实现

                Login.Model.UserInfo user = null;//设置初值为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
{
   public  class ScoreDAO           //与B层交互,进行业务逻辑实现
    {
        public void UpdateScore(string userName,int value)
        {
          using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))//连接字符串,有了using之后,数据库会自动关闭,与VB语言中的mrc.close相似
          {
                SqlCommand cmd = conn.CreateCommand();//根据conn连接建立查询命令
                cmd.CommandText = @"INSERT INTO SCORES(UserName,Score)Values(@UserName,@Score)";//进行与B层的交互
                cmd.Parameters.Add(new SqlParameter("@UserName", userName));
                cmd.Parameters.Add(new SqlParameter("@Score", value));//传值,进行数据库中实际的代码实现
                conn.Open();//数据库打开
                cmd.ExecuteNonQuery();//数据库关闭
          }
        }
    }
}
namespace Login.DAL
{
    class DbUtil  //数据库的连接实现,与VB语言中的model模块类似
    {
        public static string ConnString =@"Server=DESKTOP-V58JQT9; Database=Login; User ID=sa;Password=123456";
        
    }
}

便于三层之间传输数据,封装数据Login.Model,三层之间的调用

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; }
    }
}

在敲三层的过程中,会出现,在users表中插入数据时,只插入,username和password两项,但是建立的数据库表中列是有三项,且设置的ID为主键,因此在运行过程中,可能会报错,可把主键去除,允许null为空,或者在D层ScoreDAO中添加一个插入项,插入到ID中,设置参数

师承https://blog.csdn.net/fjt123068/article/details/74091933

      https://blog.csdn.net/Carrie_Q/article/details/80887216

需要理解和学习地还有很多,,,,,

猜你喜欢

转载自blog.csdn.net/dsl59741/article/details/81747955
今日推荐