欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

三层浅识

程序员文章站 2022-06-13 12:31:04
...

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

在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 aaa@qq.com 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 aaa@qq.com"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

 

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

三层浅识

 

相关标签: 三层