C01-三层架构

C01-三层架构TD01 三层架构 影院系统零食销售示例一 三层架构 1 三层架构是什么 2 优缺点 3 调用关系 4 开发顺序二 影院系统零食销售示例 1 创建数据库 2 1 模型类 MODEL 2 2SqlHelper

大家好,欢迎来到IT知识分享网。


一、三层架构

1、三层架构是什么?

区分层次的目的即为了“高内聚,低耦合”的思想。

表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候的所见所得。
业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。
数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等每层之间是一种垂直的关系。

2、优缺点

3、调用关系

在这里插入图片描述
例如影院系统零食销售示例中,我创建了如上图介绍的五个类库(其中COMMON可以不创建,例子中没有用到,其余四个类库内容在下文展开详细叙述)
在这里插入图片描述

4、开发顺序

开发顺序:DAL->BLL->UI 翻过来也可以

二、影院系统零食销售示例

1. 创建数据库

(用的SQL Server)首先创建一个叫 movie 的数据库,接着创建Snacks(零食)和SnacksType(零食分类)两张表。

上代码哈哈哈(也可以手动创建):

USE [movie] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Snacks]( [SId] [int] IDENTITY(1,1) NOT NULL, [STitle] [varchar](50) NOT NULL, [SPrice] [decimal](5, 2) NOT NULL, [STypeId] [int] NOT NULL, [SIsDelete] [int] NOT NULL, CONSTRAINT [PK_Snacks] PRIMARY KEY CLUSTERED ( [SId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[SnacksType]( [SId] [int] IDENTITY(1,1) NOT NULL, [STitle] [varchar](10) NOT NULL, [SIsDelete] [int] NOT NULL ) ON [PRIMARY] GO 

添加数据:

SET IDENTITY_INSERT [dbo].[Snacks] ON INSERT [dbo].[Snacks] ([SId], [STitle], [SPrice], [STypeId], [SIsDelete]) VALUES (1, N'可比克', CAST(15.00 AS Decimal(5, 2)), 1, 0) INSERT [dbo].[Snacks] ([SId], [STitle], [SPrice], [STypeId], [SIsDelete]) VALUES (2, N'手指饼', CAST(7.50 AS Decimal(5, 2)), 1, 0) INSERT [dbo].[Snacks] ([SId], [STitle], [SPrice], [STypeId], [SIsDelete]) VALUES (3, N'番茄鸡味块', CAST(7.50 AS Decimal(5, 2)), 1, 0) INSERT [dbo].[Snacks] ([SId], [STitle], [SPrice], [STypeId], [SIsDelete]) VALUES (4, N'可乐', CAST(4.00 AS Decimal(5, 2)), 2, 0) INSERT [dbo].[Snacks] ([SId], [STitle], [SPrice], [STypeId], [SIsDelete]) VALUES (5, N'雪碧', CAST(4.00 AS Decimal(5, 2)), 2, 0) INSERT [dbo].[Snacks] ([SId], [STitle], [SPrice], [STypeId], [SIsDelete]) VALUES (6, N'橙汁', CAST(8.00 AS Decimal(5, 2)), 2, 0) INSERT [dbo].[Snacks] ([SId], [STitle], [SPrice], [STypeId], [SIsDelete]) VALUES (7, N'西瓜汁', CAST(8.00 AS Decimal(5, 2)), 2, 0) INSERT [dbo].[Snacks] ([SId], [STitle], [SPrice], [STypeId], [SIsDelete]) VALUES (8, N'奶茶', CAST(8.00 AS Decimal(5, 2)), 2, 0) INSERT [dbo].[Snacks] ([SId], [STitle], [SPrice], [STypeId], [SIsDelete]) VALUES (9, N'爆米花中份', CAST(10.00 AS Decimal(5, 2)), 3, 0) INSERT [dbo].[Snacks] ([SId], [STitle], [SPrice], [STypeId], [SIsDelete]) VALUES (10, N'爆米花大份', CAST(15.00 AS Decimal(5, 2)), 3, 0) SET IDENTITY_INSERT [dbo].[Snacks] OFF SET IDENTITY_INSERT [dbo].[SnacksType] ON INSERT [dbo].[SnacksType] ([SId], [STitle], [SIsDelete]) VALUES (1, N'零食', 0) INSERT [dbo].[SnacksType] ([SId], [STitle], [SIsDelete]) VALUES (2, N'饮料', 0) SET IDENTITY_INSERT [dbo].[SnacksType] OFF 

2. 模型类(MODEL)

零食类 Snacks:

namespace MODEL { 
     public class Snacks { 
     //--[SId], [STitle], [SPrice], [STypeId], [SIsDelete] public string SId { 
     get; set; } public string STitle { 
     get; set; } public string SPrice { 
     get; set; } public string STypeId { 
     get; set; } public string SIsDelete { 
     get; set; } public string STypeTitle { 
     get; set; } public Snacks() { 
     } } } 

零食分类类 SnacksType:

namespace MODEL { 
     public class SnacksType { 
     //--[SId], [STitle], [SIsDelete] public string SId { 
     get; set; } public string STitle { 
     get; set; } public string SIsDelete { 
     get; set; } public SnacksType() { 
     } } } 

3.1 数据访问层(DAL)

数据访问层里加了一个类SqlHelper,帮助操作数据库。

SqlHelper:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlClient; using System.Data; namespace DAL { 
     public class SqlHelper { 
     private static string connStr = "Data Source=.;Initial Catalog=movie;Integrated Security=True"; //增、删、改  /// <summary> /// 执行增、删、改 的sql语句,返回受影响的行数 /// </summary> /// <param name="sql">要执行的命令</param> /// <param name="ps">命令中的参数</param> /// <returns>受影响的行数</returns> public static int ExecuteNonQuery(string sql, SqlParameter[] ps) { 
     using (SqlConnection conn = new SqlConnection(connStr)) { 
     using (SqlCommand cmd = new SqlCommand(sql, conn)) { 
     conn.Open(); cmd.Parameters.AddRange(ps); return cmd.ExecuteNonQuery(); } } } /// <summary> /// 执行增、删、改 的sql语句,返回受影响的行数 /// </summary> /// <param name="sql">要执行的命令</param> /// <param name="ps">命令中的参数</param> /// <returns>受影响的行数</returns> public static int ExecuteNonQuery(string sql) { 
     using (SqlConnection conn = new SqlConnection(connStr)) { 
     using (SqlCommand cmd = new SqlCommand(sql, conn)) { 
     conn.Open(); return cmd.ExecuteNonQuery(); } } } //查询 public static DataTable getDataTable(string sql, SqlParameter[] ps) { 
     using (SqlConnection conn = new SqlConnection(connStr)) { 
     using (SqlCommand cmd = new SqlCommand(sql, conn)) { 
     using (SqlDataAdapter sda = new SqlDataAdapter(cmd)) { 
     DataTable dt = new DataTable(); cmd.Parameters.AddRange(ps); sda.Fill(dt); return dt; } } } } public static DataTable getDataTable(string sql) { 
     using (SqlConnection conn = new SqlConnection(connStr)) { 
     using (SqlCommand cmd = new SqlCommand(sql, conn)) { 
     using (SqlDataAdapter sda = new SqlDataAdapter(cmd)) { 
     DataTable dt = new DataTable(); sda.Fill(dt); return dt; } } } } } } 

零食 SnacksDAL:

using MODEL; using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; namespace DAL { 
     public class SnacksDAL { 
     //删除 public int delete(string sid) { 
     string sql = "update Snacks set SIsDelete=1 where SId=@SId"; SqlParameter[] ps = { 
     new SqlParameter("@SId",sid) }; return SqlHelper.ExecuteNonQuery(sql, ps); } //修改 public int update(Snacks s) { 
     string sql = "update Snacks set STitle=@STitle,Sprice=@Sprice,STypeId=@STypeId where SId=@SId"; SqlParameter[] ps = { 
     new SqlParameter("@Stitle",s.STitle), new SqlParameter("@Sprice",s.SPrice), new SqlParameter("@STypeId",s.STypeId), new SqlParameter("@SId",s.SId) }; return SqlHelper.ExecuteNonQuery(sql, ps); } //新增 public int add(Snacks s) { 
     string sql = "insert into Snacks(STitle,Sprice,STypeId)values(@STitle,@Sprice,@STypeId)"; SqlParameter[] ps = { 
     new SqlParameter("@STitle",s.STitle), new SqlParameter("@Sprice",s.SPrice), new SqlParameter("@STypeId",s.STypeId) }; return SqlHelper.ExecuteNonQuery(sql, ps); } //查询显示 public DataTable getList(Dictionary<string, string> dic) { 
     List<SqlParameter> paraList = new List<SqlParameter>(); string sql = "select s.SId,s.STitle,st.STitle STypeTitle,SPrice from Snacks s,SnacksType st where s.STypeId=st.SId and s.SIsDelete=0"; if (dic.Count > 0) { 
     foreach (KeyValuePair<string, string> kv in dic) { 
     sql += " and s." + kv.Key + " like @" + kv.Key; string pname = "@" + kv.Key; string pvalue = "%" + kv.Value + "%"; paraList.Add(new SqlParameter(pname, pvalue)); } } return SqlHelper.getDataTable(sql, paraList.ToArray()); } } } 

零食分类 SnacksTypeDAL:

using MODEL; using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; namespace DAL { 
     public class SnacksTypeDAL { 
     //删除 public int delete(string sid) { 
     string sql = "delete from SnacksType where SId=@SId"; SqlParameter[] ps = { 
     new SqlParameter("@SId",sid) }; return SqlHelper.ExecuteNonQuery(sql, ps); } //修改 public int update(SnacksType s) { 
     string sql = "update SnacksType set STitle=@STitle where SId=@SId"; SqlParameter[] ps = { 
     new SqlParameter("@STitle",s.STitle), new SqlParameter("@SId",s.SId) }; return SqlHelper.ExecuteNonQuery(sql, ps); } //添加 public int add(SnacksType s) { 
     string sql = "insert into SnacksType(STitle)values(@STitle)"; SqlParameter[] ps = { 
     new SqlParameter("@STitle",s.STitle) }; return SqlHelper.ExecuteNonQuery(sql, ps); } //查询显示 public DataTable getList() { 
     string sql = "select SId,STitle from SnacksType"; return SqlHelper.getDataTable(sql); } } } 

3.2 业务逻辑层(BLL)

零食 SnacksBLL:

using DAL; using MODEL; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; namespace BLL { 
     public class SnacksBLL { 
     SnacksDAL dal = new SnacksDAL(); //删除 public bool delete(string sid) { 
     return dal.delete(sid) > 0; } //修改 public bool update(Snacks s) { 
     return dal.update(s) > 0; } //添加 public bool add(Snacks s) { 
     return dal.add(s) > 0; } //查询显示 public List<Snacks> getList(Dictionary<string, string> dic) { 
     List<Snacks> list = new List<Snacks>(); DataTable dt = dal.getList(dic); foreach (DataRow row in dt.Rows) { 
     Snacks s = new Snacks(); s.SId = row["SId"].ToString(); s.STitle = row["STitle"].ToString(); s.SPrice = row["SPrice"].ToString(); s.STypeId = row["STypeTitle"].ToString(); list.Add(s); } return list; } } } 

零食分类 SnacksTypeBLL:

using DAL; using MODEL; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; namespace BLL { 
     public class SnacksTypeBLL { 
     SnacksTypeDAL dal = new SnacksTypeDAL(); //删除 public bool delete(string sid) { 
     return dal.delete(sid) > 0; } //修改 public bool update(SnacksType s) { 
     return dal.update(s) > 0; } //添加 public bool add(SnacksType s) { 
     return dal.add(s) > 0; } //查询显示 public List<SnacksType> getList() { 
     List<SnacksType> list = new List<SnacksType>(); DataTable dt = dal.getList(); foreach (DataRow row in dt.Rows) { 
     SnacksType t = new SnacksType(); t.SId = row["SId"].ToString(); t.STitle = row["STitle"].ToString(); list.Add(t); } return list; } } } 

3.3 表现层(UI)

using BLL; using MODEL; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace UI { 
     public partial class FormSnacks : Form { 
     public FormSnacks() { 
     InitializeComponent(); } SnacksBLL bll = new SnacksBLL(); //拼接模糊查询条件 private void loadList() { 
     Dictionary<string, string> dic = new Dictionary<string, string>(); string titleSearch = txtTitleSearch.Text.Trim(); string typesearch = ddlTypeSearch.SelectedValue.ToString(); //MessageBox.Show(typesearch); //创建泛型键值对集合、用于存储SQL语句中模糊查询的条件 if (txtTitleSearch.Text != "") { 
     dic.Add("STitle", txtTitleSearch.Text); } if (typesearch != "0") { 
     dic.Add("STypeId", typesearch); } dgvList.AutoGenerateColumns = false; dgvList.DataSource = bll.getList(dic); } //分类搜索下拉框 private void loadSearchTypeList() { 
     SnacksTypeBLL stbll = new SnacksTypeBLL(); List<SnacksType> list = stbll.getList(); SnacksType st = new SnacksType(); st.SId = "0"; st.STitle = "全部"; // list.Add(st); list.Insert(0, st); //绑定数据 ddlTypeSearch.DisplayMember = "STitle"; ddlTypeSearch.ValueMember = "SId"; ddlTypeSearch.DataSource = list; } //增加/修改分类下拉框 private void loadAddTypeList() { 
     SnacksTypeBLL stbll = new SnacksTypeBLL(); List<SnacksType> list = stbll.getList(); SnacksType st = new SnacksType(); st.SId = "0"; st.STitle = "全部"; // list.Add(st); list.Insert(0, st); //SId,STitle ddlTypeAdd.DisplayMember = "STitle"; ddlTypeAdd.ValueMember = "SId"; ddlTypeAdd.DataSource = list; } private void FormSnacks_Load(object sender, EventArgs e) { 
     loadSearchTypeList(); loadAddTypeList(); loadList(); } private void DgvList_CellDoubleClick(object sender, DataGridViewCellEventArgs e) { 
     DataGridViewRow rows = dgvList.SelectedRows[0]; txtId.Text = rows.Cells["SId"].Value.ToString(); txtTitleSave.Text = rows.Cells["STitle"].Value.ToString(); txtPrice.Text = rows.Cells["SPrice"].Value.ToString(); txtId.Text = rows.Cells["SId"].Value.ToString(); ddlTypeAdd.Text = rows.Cells["STypeId"].Value.ToString(); btnSave.Text = "修改"; } private void BtnSave_Click(object sender, EventArgs e) { 
     string str = txtId.Text.Trim(); Snacks s = new Snacks(); s.SId = txtId.Text; s.STitle = txtTitleSave.Text; s.SPrice = txtPrice.Text; s.STypeId = ddlTypeAdd.SelectedValue.ToString(); s.STypeTitle = ddlTypeAdd.Text; if (str.Equals("添加时无编号")) { 
     if (bll.add(s)) { 
     MessageBox.Show("添加成功!"); loadList(); } else { 
     MessageBox.Show("添加失败!"); } } else { 
     if (bll.update(s)) { 
     MessageBox.Show("修改成功!"); loadList(); } else { 
     MessageBox.Show("修改失败!"); } } } private void BtnCancel_Click(object sender, EventArgs e) { 
     txtId.Text = "添加时无编号"; txtTitleSave.Text = ""; txtPrice.Text = ""; ddlTypeAdd.SelectedIndex = 0; btnSave.Text = "添加"; } private void BtnRemove_Click(object sender, EventArgs e) { 
     DataGridViewRow rows = dgvList.SelectedRows[0]; string sid = rows.Cells["SId"].Value.ToString(); if (bll.delete(sid)) { 
     MessageBox.Show("删除成功!"); loadList(); } else { 
     MessageBox.Show("删除失败!"); } } private void TxtTitleSearch_TextChanged(object sender, EventArgs e) { 
     loadList(); } private void DdlTypeSearch_SelectedIndexChanged(object sender, EventArgs e) { 
     loadList(); } private void BtnSearchAll_Click(object sender, EventArgs e) { 
     txtTitleSearch.Clear(); ddlTypeSearch.Text = "全部"; } private void BtnAddType_Click(object sender, EventArgs e) { 
     FormSnacksType fst = new FormSnacksType(); fst.StartPosition = FormStartPosition.CenterScreen; if (fst.ShowDialog() == DialogResult.Yes) { 
     loadAddTypeList(); loadSearchTypeList(); } } } } 
using BLL; using MODEL; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace UI { 
     public partial class FormSnacksType : Form { 
     public FormSnacksType() { 
     InitializeComponent(); } SnacksTypeBLL bll = new SnacksTypeBLL(); private DialogResult dr = DialogResult.No; //刷新 private void loadList() { 
     List<SnacksType> list = bll.getList(); dgvList.AutoGenerateColumns = false; dgvList.DataSource = list; } private void FormSnacksType_Load(object sender, EventArgs e) { 
     loadList(); } private void BtnSave_Click(object sender, EventArgs e) { 
     string str = txtId.Text.Trim(); if (str.Equals("添加时无编号")) { 
     SnacksType s = new SnacksType(); s.STitle = txtTitle.Text; if (bll.add(s)) { 
     MessageBox.Show("添加成功!"); loadList(); dr = DialogResult.Yes; } else { 
     MessageBox.Show("添加失败!"); } } else { 
     SnacksType s = new SnacksType(); s.SId = txtId.Text; s.STitle = txtTitle.Text; if (bll.update(s)) { 
     MessageBox.Show("修改成功!"); loadList(); dr = DialogResult.Yes; } else { 
     MessageBox.Show("修改失败!"); } } } private void DgvList_CellDoubleClick(object sender, DataGridViewCellEventArgs e) { 
     DataGridViewRow rows = dgvList.SelectedRows[0]; txtId.Text = rows.Cells["SId"].Value.ToString(); txtTitle.Text = rows.Cells["STitle"].Value.ToString(); btnSave.Text = "修改"; } private void BtnCancel_Click(object sender, EventArgs e) { 
     txtId.Text = "添加时无编号"; txtTitle.Text = ""; btnSave.Text = "添加"; } private void BtnRemove_Click(object sender, EventArgs e) { 
     DataGridViewRow row = dgvList.SelectedRows[0]; string sid = row.Cells["SId"].Value.ToString(); if (bll.delete(sid)) { 
     MessageBox.Show("删除成功!"); loadList(); dr = DialogResult.Yes; } else { 
     MessageBox.Show("删除失败!"); } } private void FormSnacksType_FormClosing(object sender, FormClosingEventArgs e) { 
     this.DialogResult = dr; } } } 

三、运行结果

在这里插入图片描述
运行要注意把Program中的运行窗体改为我们需要的,比如这里是FormSnacks();


免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/136391.html

(0)
上一篇 2025-06-27 19:10
下一篇 2025-06-27 19:20

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信