• 三层学习------实践篇


       实践是检验真理的唯一标准。以下我们使用三层架构实践一个简单的“登录”业务。学以致用,来亲身感受一下三层架构的呼吸。


        以上是启动界面,属于U层,它是Winform形式的。还有web方式的。用户在此输入username与password后,系统验证password是否正确。

    注意,为了简单易行,要求输入的username在数据库中的User表中存在,否则就会报错。下面是总体的代码结构。


    接下来看一看详细每一层中的代码:

    实体层:

    <span style="font-family:SimSun;font-size:18px;"> public class User
        {
            private string userName = string.Empty;//string.Empty就相当于""。一般用于字符串的初始化
            private string pwd = string.Empty;
    
            public string UserName { get; set; }
            public string Pwd { get; set; }
        }</span>
    UI:

    <span style="font-family:SimSun;font-size:18px;"> private void btnOK_Click(object sender, EventArgs e)//点击“确定”button,開始验证用户信息
            {
                //声明一个bool类型的变量用来接收登录状态,登录成功/失败
                bool result = false;
    
                //检查username与password是否为空
                if (txtUserName .Text =="")
                {
                    MessageBox.Show ("username不能为空!");
                    txtUserName.Focus();
                    return;
                }
                if (txtPassword .Text =="")
                {
                    MessageBox.Show("password不能为空!

    "); txtPassword.Focus(); return; } //声明一个用户对象,将用户输入的username和password赋于这个用户对象 User euser = new User(); euser.UserName = txtUserName.Text.Trim(); euser.Pwd = txtPassword.Text; //訪问B层 LoginServer blogin = new LoginServer(); result = blogin.BLogin(euser);//B层验证password后,返回一个布尔值。传到此处 if (result ==true )//假设返回true。则登录成功 { MessageBox.Show("登录成功!"); } else //返回false,password输入错误,登录失败 { MessageBox.Show("登录失败!"); } } private void btnCancel_Click(object sender, EventArgs e)//点击“取消button”。关闭窗口 { this.Close(); }</span>

    BLL:

    <span style="font-family:SimSun;font-size:18px;">   public class LoginServer //验证用户password是否正确
        {
            public bool BLogin(User User)
            {
                UserDAL duser = new UserDAL();//訪问D层,连接数据库
                User euser = new User();
                euser = duser.DLogin(User);//接下来的任务在D层中进行。从数据表中获取该username的password
    
                //假设该用户输入的password与数据表中的一样,则为真,登录成功;反之为假。
                if (euser .Pwd ==User .Pwd )//euser是D层返回的实体类。携带着数据库中存储的用户信息,User携带用户输入的用户信息,将二者携带的password进行比較
                {
                    return true;
                }
                else
                {
                    return false;
                }
                //得到真假后。回到U层。回馈给用户操作结果
            }
        }</span>
    DAL:

    <span style="font-family:SimSun;font-size:18px;"> public class UserDAL
        {
            //连接数据库
            public static string conString = @"Server=CYL-PC; Database=Login; User ID=sa; Password=123456";
            SqlConnection cnn = new System.Data.SqlClient.SqlConnection(conString);
    
            //依据输入的username获取用户password
            public User DLogin(User user)
            {
                
                string sqlString="select * from Users where UserName='"+user .UserName +"'";
    
                User euser = new User();
                SqlCommand cmd = new SqlCommand(sqlString, cnn);
    
                //打开数据库
                cnn.Open();
                SqlDataReader read;
                read = cmd.ExecuteReader();
                read.Read();
                //将User表中的用户信息赋予给实体类。并将其返回B层
                euser.UserName = read[0].ToString();
                euser.Pwd = read[1].ToString();
                return euser;
            }
        }</span>
    数据库Login中User表:


        代码中的凝视写得比較详细,但在实际运行中。并非一条龙运行下去。U层引用B层,B层引用D层。这三层都引用Entity。

    接下来将上述流程总体串一下。启动系统后。首先显示系统登录界面,用户输入username和password后进行password验证(若不输入。点“确定”后系统检測到空,又一次回到登录界面)。

    详细的验证过程是这种,三层都需实例化一个实体层中的User对象,当中U层的User携带用户输入的用户信息(username和password);D层依据用户输入的username在数据库中找到该用户信息,让D层的User携带,然后传递给B层的User。在B层运行详细的验证过程。U层User携带的password与B层User携带的password比較,若二者同样,则显示“登录成功”向用户反馈,反之提醒“登录失败”。

    我的表达能力有限,预知清晰的运行内幕,逐语句调试(F11)。

        在这三层中。DAL仅仅提供主要的数据訪问,UI仅仅负责显示和採集用户操作,他们都不包括不论什么与业务相关的逻辑处理。BLL负责处理业务逻辑,通过获取UI传来的操作指令,运行业务逻辑,在须要訪问数据源的时候交给DAL处理。

    处理完毕后,返回必要的数据给UI

    实体层在他们之间上蹿下跳。三层都不知道User中的详细内容。这样做的优点就是,实现了高内聚,低耦合。

    各层分工协作,各司其职。有条不紊。增强了软件系统的可扩展性、可复用性、可维护性。


  • 相关阅读:
    一个Java对象到底占用多大内存
    Java 动态代理机制分析及扩展
    JVM内幕:Java虚拟机详解
    深度分析 Java 的 ClassLoader 机制(源码级别)
    Java异常的深入研究与分析
    HashMap的工作原理
    Java枚举常见7种用法
    left join 过滤条件写在on后面和写在where 后面的区别
    mysql left( right ) join使用on 与where 筛选的差异
    SQL索引优化
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5251534.html
Copyright © 2020-2023  润新知