Delphi三层架构是一种常见的软件设计模式,其主要目的是将应用程序分成三个层次,即表示层、业务逻辑层和数据访问层,以提高程序的可扩展性和可维护性。
在Delphi中,我们可以使用不同的技术和工具实现三层架构,通常的方式是使用数据库连接库(比如ADO、dbExpress、FireDAC等)作为数据访问层,使用自定义类作为业务逻辑层,使用窗体和控件实现表示层。下面,我们来具体介绍如何用Delphi实现简单的三层架构应用程序。
1. 创建数据库和数据表
首先,我们需要明确应用程序所需要的数据对象以及数据表结构。这里我们假设需要实现一个简单的产品信息管理系统,其数据模型包含产品编号、产品名称、价格和描述等字段。在Delphi中,我们可以使用任何支持SQL的数据库来创建数据表。以MySQL为例,可以使用以下的SQL语句创建数据表:
```
CREATE TABLE products (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(50),
price FLOAT,
description VARCHAR(255),
PRIMARY KEY (id)
);
```
2. 创建数据访问层
在Delphi中,可以使用TADOConnection、TADOQuery、TADODataSet等组件来访问数据库。首先,我们需要创建一个数据模块,将TADOConnection组件放在数据模块中,如下图所示:
![数据模块](https://img-blog.csdn.net/20180701231344140?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0dob19DaGlhbmdf/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/70)
由于数据访问层是负责与数据库打交道的核心部分,因此这里我们需要一个自定义类来管理数据表。我们创建一个名为TProductDAO的类,它包含打开连接、查询记录、插入记录、修改记录、删除记录等方法,具体实现如下:
```
unit uProductDAO;
interface
uses
System.SysUtils, System.Classes, Data.DB, Data.Win.ADODB;
type
TProductDAO = class(TDataModule)
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
private
{ Private declarations }
public
{ Public declarations }
function GetAllProducts: TDataSet;
procedure InsertProduct(name: string; price: Double; desc: string);
procedure UpdateProduct(id: Integer; name: string; price: Double; desc: string);
procedure DeleteProduct(id: Integer);
end;
var
ProductDAO: TProductDAO;
implementation
{%CLASSGROUP 'Vcl.Controls.TControl'}
{$R *.dfm}
{ TProductDAO }
function TProductDAO.GetAllProducts: TDataSet;
begin
ADOQuery1.SQL.Text := 'SELECT * FROM products';
ADOQuery1.Open;
Result := ADOQuery1;
end;
procedure TProductDAO.InsertProduct(name: string; price: Double; desc: string);
begin
ADOQuery1.SQL.Text := 'INSERT INTO products(name, price, description) VALUES(:name, :price, :desc)';
ADOQuery1.Parameters.ParamByName('name').Value := name;
ADOQuery1.Parameters.ParamByName('price').Value := price;
ADOQuery1.Parameters.ParamByName('desc').Value := desc;
ADOQuery1.ExecSQL;
end;
procedure TProductDAO.UpdateProduct(id: Integer; name: string; price: Double; desc: string);
begin
ADOQuery1.SQL.Text := 'UPDATE products SET name=:name, price=:price, description=:desc WHERE id=:id';
ADOQuery1.Parameters.ParamByName('id').Value := id;
ADOQuery1.Parameters.ParamByName('name').Value := name;
ADOQuery1.Parameters.ParamByName('price').Value := price;
ADOQuery1.Parameters.ParamByName('desc').Value := desc;
ADOQuery1.ExecSQL;
end;
procedure TProductDAO.DeleteProduct(id: Integer);
begin
ADOQuery1.SQL.Text := 'DELETE FROM products WHERE id=:id';
ADOQuery1.Parameters.ParamByName('id').Value := id;
ADOQuery1.ExecSQL;
end;
end.
```
上面的TProductDAO类封装了常见的CRUD操作,并且使用了参数化查询,以避免SQL注入攻击。注意,在这个类中,我们使用了ADOQuery1组件来执行SQL查询和执行操作。
3. 创建业务逻辑层
业务逻辑层是负责应用程序的业务逻辑的部分,它通常使用自定义的类来完成,这些类处理业务逻辑并执行数据访问层的操作。在Delphi中,我们可以创建一个名为TProductService的类作为业务逻辑层,它包含获取所有产品、添加产品、编辑产品、删除产品等方法,具体实现如下:
```
unit uProductService;
interface
uses
System.SysUtils, System.Classes, Data.DB, uProductDAO;
type
TProductService = class
private
ProductDAO: TProductDAO;
public
constructor Create;
destructor Destroy; override;
function GetAllProducts: TDataSet;
procedure InsertProduct(name: string; price: Double; desc: string);
procedure UpdateProduct(id: Integer; name: string; price: Double; desc: string);
procedure DeleteProduct(id: Integer);
end;
implementation
constructor TProductService.Create;
begin
ProductDAO := TProductDAO.Create(nil);
end;
destructor TProductService.Destroy;
begin
ProductDAO.Free;
inherited;
end;
function TProductService.GetAllProducts: TDataSet;
begin
Result := ProductDAO.GetAllProducts;
end;
procedure TProductService.InsertProduct(name: string; price: Double; desc: string);
begin
ProductDAO.InsertProduct(name, price, desc);
end;
procedure TProductService.UpdateProduct(id: Integer; name: string; price: Double; desc: string);
begin
ProductDAO.UpdateProduct(id, name, price, desc);
end;
procedure TProductService.DeleteProduct(id: Integer);
begin
ProductDAO.DeleteProduct(id);
end;
end.
```
上面的TProductService类封装了TProductDAO类的操作,并提供了一个简单的接口以供其他部分调用。
4. 创建表示层
表示层是负责显示数据和与用户进行交互的部分,通常使用窗体和控件完成。在Delphi中,我们可以使用TForm和TDBGrid等控件来显示数据,使用TEdit和TButton等控件接收用户输入。我们创建一个名为frmProduct的窗体,该窗体包含一个TDBGrid控件用于显示产品列表,以及一些TEdit、TButton等控件用于接收用户输入。
![frmProduct窗体](https://img-blog.csdn.net/2018070123352976?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0dob19DaGlhbmdf/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/70)
在frmProduct窗体中,我们可以使用TProductService类来绑定数据和控件。在窗体的OnShow事件中,我们可以调用GetAllProducts方法获取所有产品的列表,并将其绑定到TDBGrid控件上:
```
procedure TfrmProduct.FormShow(Sender: TObject);
var
ProductService: TProductService;
Products: TDataSet;
begin
ProductService := TProductService.Create;
Products := ProductService.GetAllProducts;
dbgProduct.DataSource := Products;
end;
```
在添加和编辑产品时,我们可以使用TEdit和TButton控件获取用户输入,并将其传递给TProductService类中的插入记录和修改记录方法来执行插入或更新操作:
```
procedure TfrmProduct.btnAddClick(Sender: TObject);
var
name, desc: string;
price: Double;
ProductService: TProductService;
begin
name := edtName.Text;
price := StrToFloat(edtPrice.Text);
desc := edtDesc.Text;
ProductService := TProductService.Create;
ProductService.InsertProduct(name, price, desc);
ShowMessage('添加成功!');
ProductService.Free;
end;
procedure TfrmProduct.btnEditClick(Sender: TObject);
var
id: Integer;
name, desc: string;
price: Double;
ProductService: TProductService;
begin
id := StrToInt(edtID.Text);
name := edtName.Text;
price := StrToFloat(edtPrice.Text);
desc := edtDesc.Text;
ProductService := TProductService.Create;
ProductService.UpdateProduct(id, name, price, desc);
ShowMessage('编辑成功!');
ProductService.Free;
end;
```
在删除产品时,我们可以使用TDBGrid控件来确定要删除的记录,并将其传递给TProductService类的删除方法来执行删除操作:
```
procedure TfrmProduct.btnDeleteClick(Sender: TObject);
var
id: Integer;
ProductService: TProductService;
begin
id := dbgProduct.DataSource.DataSet.FieldByName('id').AsInteger;
ProductService := TProductService.Create;
ProductService.DeleteProduct(id);
ShowMessage('删除成功!');
ProductService.Free;
end;
```
5. 测试应用程序
现在我们已经完成了产品信息管理系统的设计和实现,可以通过编译并启动应用程序来测试它的功能。在测试时,我们可以添加、编辑和删除产品,这些操作将通过TProductService和TProductDAO类与MySQL数据库通信来实现。
![](https://img-blog.csdn.net/20180701235218184?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0dob19DaGlhbmdf/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/70)
至此,我们已经完成了Delphi三层架构简单实例的设计和实现。以上实例作为一个简单的数据管理系统,让我们体验了三层架构的思维范式,理解了各层之间的职责划分和通讯机制。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/
发表评论 取消回复