Java三層架構


     所謂的三層分為物理上的三層和邏輯上的三層。

     物理上的三層包括:客戶端(PC)、應用服務器、數據庫服務器。

     邏輯上的三層,也就是我們要討論的,分為表示層、業務邏輯層、數據訪問層。

     實體層,嚴格的來說不屬於三層中的任一層,它是獨立於其他三個層次的,只能供其他層次進行引用,但是不能引用其他的三個層次。

 

 

                                            數據在三層中的一個具體走向圖

       

       三層應用原則:

 

  • DAL(數據訪問層)只提供基本的數據訪問,不包含任何的業務邏輯
  • UI只負責顯示和采集用戶操作,不包含任何業務相關的邏輯處理
  • BLL(業務邏輯層)負責處理業務邏輯。通過獲取UI傳來的用戶指令,執行業務邏輯,在需要訪問數據源的時候,直接交給DAL進行處理。處理完成后,返回必要數據給UI。

 

 

     實現步驟:

 

       (1)前期准備:

              1.根據上一層引用下一層以及實體層在各層的作用,繪制UML圖。

 

       2.根據UML圖顯示的關系,構建三層框架。

 

 

       

3.建立數據庫,包含UserInfo表。

 

 

(2)代碼實現階段

1.用戶界面層(LoginUI):

       作用:

  • 向用戶展現特定業務數據
  • 采集用戶的輸入信息和操作

 

       添加類:frmLogin

 

 

 

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

        private void btnLogin_Click(object sender, EventArgs e)
        {
            //UI層將用戶輸入數據傳遞給BLL層
            string userName = txtUserName.Text.Trim();
            string password = txtPassword.Text;
            Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();
           Login.Model .UserInfo user= mgr.UserLogin (userName, password);

            //UI層返回業務層傳遞的數據給用戶
           MessageBox.Show("登錄用戶:" + user.UserName);
        }

 

 

2.業務邏輯層(LoginBLL):

       作用:

  • 從DAL獲取數據,提供UI顯示
  •  從UI獲取用戶和指令,執行業務邏輯
  • 從UI獲取用戶和指令,通過DAL寫入數據

 

       BLL的職責機制:

               UI→BLL→UI

               UI→BLL→DAL→BLL→UI   

       添加類:LoginManager    

  

 

namespace Login.BLL
{
    public class LoginManager
    {
        public Login.Model .UserInfo UserLogin(string userName,string password)
    {
        Login.DAL.UserDAO  uDao = new Login.DAL.u ();   //實例化DAL層
        Login.Model.UserInfo user = uDao.SelectUser(userName, password);

           //不需要訪問數據源,直接執行業務邏輯
        if (user != null)
        {
            return user;
        }
        else
        {
            throw new Exception("登錄失敗");
        }
    }
    }
}

 

 

3.數據訪問層(LoginDAL):

       作用:SELECT、INSERT/UPDATE、DELETE

       添加類:UserDAO         

 

 

namespace Login.DAL
{
    public class UserDAO
    {
        public Login.Model.UserInfo SelectUser(string userName, string Password)
        {
            //建立數據庫連接
            string ConnString = @"Server =192.168.24.45;DataBase =Login; User ID =sa ;Password =123";
            using (SqlConnection conn = new SqlConnection(ConnString))
            {
                //執行SQL語句進行查詢
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"SELECT ID,UserName,Password,Email 
                                                            FROM UserInfo WHERE UserName =@UserName AND Password =@Password";
                //輸出查詢結果
                cmd.CommandType = CommandType.Text;

                //添加兩個參數
                cmd.Parameters.Add(new SqlParameter(@"UserName", userName));
                cmd.Parameters.Add(new SqlParameter(@"Password", Password));

                conn.Open();
                SqlDataReader reader = cmd.ExecuteReader();

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

 

 

4.實體(LoginModel):

       作用:封裝數據,使數據在三層中傳輸 ,更傾向於業務邏輯層

       添加類:UserInfo

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM